1

Посмотрите на эту картинкуAndroid Toolbar Icon Menu «исчезают», когда фоновое изображение соответствует цвет

enter image description here

В верхнем левом углу есть меню 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); 
} 

ответ

1

Вы должны взглянуть на this. В принципе, вы можете создавать собственные темы с разными тонированными .png-файлами для значков, которые вы хотите подкрасить, а затем задавать эти темы в коде в зависимости от цвета фона, который вы даете; или вы можете сделать что-то похожее на то, что показано на этом веб-сайте. Надеюсь это поможет!

EDIT: Вы можете сделать что-то подобное в зависимости от цвета фона:

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); 

Это подкрасить значок серый, но вы можете просто изменить значение цветового фильтра в соответствии с вашими потребностями.

Что вы могли бы сделать, чтобы решить вопрос о динамически загружаемых фонов является использование регистра или вложенными, если заявление, чтобы проверить фон сервера, а затем обеспечить вариант цветового фильтра для более распространенных цветов (красный, желтый, синий и т. д.), обычно черный/белый будет отображаться на большинстве фона, поэтому вы можете использовать их как значение по умолчанию.

EDIT: Для согласования цвета:

Так что вы могли бы сделать что-то вроде this, который бы просто обратить вспять данный цвет его compliment..otherwise, дайте мне знать, если тот не то, что вы ищут

+0

спасибо за это. Используя ваше предложение, это то, что я сделал. Я загружаю изображение Пикассо. Затем, когда вы загружаете с помощью палитры, чтобы вытаскивать цвета из полученного изображения, чтобы я мог динамически окрашивать поиск, стрелку вверх и заголовок. Результаты не всегда идеальны, но, по крайней мере, значки видны. Вы упомянули о проверке цвета, как вы это делаете. Я мог видеть использование палитры, чтобы вытащить обратное тому, что является доминирующим цветом фона изображения. – dmfrey

+0

@dmfrey проверить мое редактирование – Markoe7

+0

на основе ссылки, которую вы опубликовали, я думаю, что хороший алгоритм будет проверять интенсивность в месте на высоте панели инструментов и либо окрасить стрелку назад, поиск и заголовок черного или белого цвета в зависимости от интенсивности. При прокрутке цвета значков, заголовков и панели инструментов могут быть возвращены к цветам по умолчанию. Они прекрасно ожидают от расширенных и свернутых представлений. Проверить цвет с помощью ссылки, которую вы опубликовали, это проверить цвет на одном пикселе или определить это на основе изображения в целом? – dmfrey