Значок меню панели инструментов Android "исчезает", когда фон изображения соответствует цвету
Посмотрите на это изображение
В левом верхнем углу находится меню гамбургера Android, но оно белого цвета. Также справа находится поисковая лупа, тоже белого цвета. Проблема в том, что фон динамически загружается с сервера в зависимости от того, что отображается.
Можно ли подкрасить значки меню или повысить их, чтобы они появлялись при возникновении подобной ситуации? Это фоновое изображение может быть любого цвета, оно зависит от того, что для него есть на сервере. Может быть, можно использовать библиотеку палитр на них?
РЕДАКТИРОВАТЬ: мое решение до сих пор основано на ответе @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 );
}
1 ответ
Вы должны взглянуть на это. По сути, вы можете создать собственные темы с различными тонированными файлами.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);
Это будет окрашивать значок в серый цвет, но вы можете просто изменить значения цветового фильтра в соответствии с вашими потребностями.
Что бы вы могли сделать, чтобы решить проблему динамически загружаемых фонов, это использовать регистр или вложенный оператор if для проверки фона сервера, а затем предоставить опцию цветового фильтра для более распространенных цветов (красный, желтый, синий и т. Д.) В целом черный / белый будет отображаться на большинстве фонов, поэтому вы можете использовать их в качестве значения по умолчанию.
РЕДАКТИРОВАТЬ: Для сопоставления цветов:
Таким образом, вы могли бы сделать что-то вроде этого, что бы просто обратить данный цвет в его комплимент.. иначе дайте мне знать, если это не то, что вы ищете