【问题标题】:Android Toolbar Menu Icon "disappear" when image background matches color当图像背景与颜色匹配时,Android 工具栏菜单图标“消失”
【发布时间】:2015-11-01 14:30:06
【问题描述】:

看看这张图片

左上角是 Android 汉堡菜单,但它是白色的。另外,右边是一个搜索放大镜,也是白色的。问题是背景是从服务器动态加载的,具体取决于所呈现的内容。

是否可以对菜单图标进行着色或提升它们,以便它们在发生此类情况时出现?该背景图像实际上可以是任何颜色,这实际上取决于服务器的功能。也许也可以在它们上使用 Palette 库?

编辑: 到目前为止,我的解决方案基于@Steve 回复:

private void loadBackdrop( String inetref ) {
    Log.i( TAG, "loadBackdrop : inetref=" + inetref );

    String bannerUrl = MainApplication.getInstance().getMasterBackendUrl() + "/Content/GetRecordingArtwork?Inetref=" + inetref + "&Type=banner&Height=256";
    Log.i(TAG, "loadBackdrop : bannerUrl=" + bannerUrl);
    final ImageView imageView = (ImageView) findViewById( R.id.backdrop );
    final PaletteTransformation paletteTransformation = PaletteTransformation.getInstance();
    Picasso.with( this )
            .load( bannerUrl )
            .fit().centerCrop()
            .transform( paletteTransformation )
            .into(imageView, new Callback.EmptyCallback() {

                @Override
                public void onSuccess() {

                    Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); // Ew!
                    Palette palette = PaletteTransformation.getPalette(bitmap);

                    try {

                        int inverseColor = getComplementaryColor(palette.getVibrantColor(R.color.white));
                        Log.i( TAG, "loadBackdrop : inverseColor=" + inverseColor + ", Color.WHITE=" + Color.WHITE + ", Color.BLACK=" + Color.BLACK + ", Color." + ( inverseColor > ( Color.BLACK / 2 ) ? "WHITE" : "BLACK" ) );

                        int color = ( inverseColor > ( Color.BLACK / 2 ) ? Color.WHITE : Color.BLACK );

                        collapsingToolbar.setCollapsedTitleTextColor( color );
                        collapsingToolbar.setExpandedTitleColor( color );

                        Drawable newSearchMenuItem = mSearchMenuItem.getIcon();
                        newSearchMenuItem.mutate().setColorFilter( color, PorterDuff.Mode.SRC_IN );
                        mSearchMenuItem.setIcon( newSearchMenuItem );

                        Drawable newUpMenuItem = getResources().getDrawable( R.drawable.ic_arrow_back_white_24dp );
                        newUpMenuItem.mutate().setColorFilter( color, PorterDuff.Mode.SRC_IN );
                        getSupportActionBar().setHomeAsUpIndicator( newUpMenuItem );

                    } catch( Exception e ) {
                        Log.e( TAG, "error decoding palette from imageView", e );
                    }
                }

                @Override
                public void onError() {

                }

            });

}

public static int getComplementaryColor( int colorToInvert ) {

    float[] hsv = new float[ 3 ];
    Color.RGBToHSV( Color.red( colorToInvert ), Color.green( colorToInvert ), Color.blue( colorToInvert ), hsv );

    hsv[ 0 ] = ( hsv[ 0 ] + 180 ) % 360;

    return Color.HSVToColor( hsv );
}

【问题讨论】:

    标签: android material-design android-toolbar android-palette


    【解决方案1】:

    你应该看看this。基本上,您可以做的是为您想要着色的图标创建具有不同着色 .png 文件的自定义主题,然后根据给定的背景颜色在代码中设置这些主题;或者您可以执行与该网站上显示的内容类似的操作。希望这会有所帮助!

    编辑:您可以根据背景颜色执行以下操作:

    MenuItem YOUR_MENU_ITEM = menu.findItem(R.id.YOUR_MENU_ITEM_ID);
    Drawable NEW_ICON = (Drawable)YOUR_MENU_ITEM.getIcon();
    NEW_ICON.mutate().setColorFilter(Color.argb(255, 200, 200, 200),PorterDuff.Mode.SRC_IN);
    YOUR_MENU_ITEM.setIcon(NEW_ICON);
    

    这会将图标染成灰色,但您可以根据需要更改颜色过滤器的值。

    解决动态加载背景问题的方法是使用 case 或嵌套 if 语句来检查服务器的背景,然后为更常见的颜色(红色、黄色、蓝色等)提供颜色过滤器选项.) 通常黑色/白色会出现在大多数背景上,因此您可以将它们用作默认值。

    编辑:要进行颜色匹配:

    所以你可以做类似this 这样的事情,它只会将给定的颜色反转为它的恭维..否则如果那不是你想要的,请告诉我

    【讨论】:

    • 谢谢你。使用您的建议,这就是我所做的。我正在用毕加索加载图像。然后,当使用调色板加载时,从结果图像中提取颜色,以便我可以动态地为搜索、向上箭头和标题着色。结果并不总是理想的,但至少图标是可见的。你提到了检查颜色,你是怎么做的。我可以看到使用 Palette 来拉取图像的主要背景颜色的反面。
    • 根据您发布的链接,我认为一个好的算法是检查工具栏高度中某个点的强度,然后根据强度为后退箭头、搜索和标题着色为黑色或白色。在滚动时,图标、标题和工具栏本身的颜色可以设置回它们的默认颜色。它们从展开和折叠的视图中很好地动画化。要检查您发布的链接的颜色,是检查一个像素上的颜色,还是他们根据整个图像来确定?
    • @dmfrey 你可以通过this 之类的操作来获得特定像素的颜色,然后从那里继续
    • 我会尝试这两种方法,看看其中一种是否比另一种产生更好的结果。
    • 感谢您的帮助。看看我上面的编辑。这似乎足以使其在各种背景下保持一致。
    猜你喜欢
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多