Посмотрите на эту картинкуAndroid Toolbar Icon Menu «исчезают», когда фоновое изображение соответствует цвет
В верхнем левом углу есть меню Android гамбургер, но это белый. Кроме того, справа находится поисковое увеличительное стекло, также белое. Проблема заключается в том, что фон динамически загружается с сервера в зависимости от того, что представлено.
Можно ли закрасить значки меню или поднять их, чтобы они появлялись, когда возникает такая ситуация? Это фоновое изображение действительно может быть любого цвета, это действительно зависит от того, что для него имеет сервер. Возможно, возможно ли использовать на них также библиотеку палитры?
EDIT: Мое решение до сих пор на основе ответа @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);
}
спасибо за это. Используя ваше предложение, это то, что я сделал. Я загружаю изображение Пикассо. Затем, когда вы загружаете с помощью палитры, чтобы вытаскивать цвета из полученного изображения, чтобы я мог динамически окрашивать поиск, стрелку вверх и заголовок. Результаты не всегда идеальны, но, по крайней мере, значки видны. Вы упомянули о проверке цвета, как вы это делаете. Я мог видеть использование палитры, чтобы вытащить обратное тому, что является доминирующим цветом фона изображения. – dmfrey
@dmfrey проверить мое редактирование – Markoe7
на основе ссылки, которую вы опубликовали, я думаю, что хороший алгоритм будет проверять интенсивность в месте на высоте панели инструментов и либо окрасить стрелку назад, поиск и заголовок черного или белого цвета в зависимости от интенсивности. При прокрутке цвета значков, заголовков и панели инструментов могут быть возвращены к цветам по умолчанию. Они прекрасно ожидают от расширенных и свернутых представлений. Проверить цвет с помощью ссылки, которую вы опубликовали, это проверить цвет на одном пикселе или определить это на основе изображения в целом? – dmfrey