Мы с партнером хотим придать динамический цвет значку в нашем приложении для Android (изображение png с прозрачным фоном) аналогично маске webkit в CSS:

<div style="background-color: #34daa1; width: 60px; height: 60px; -webkit-mask-image: url('http://i.stack.imgur.com/gZvK4.png');"></div>

Мы думаем, что это было бы намного лучше, чем добавлять изображение для каждого цвета ... :( Возможно ли?

Большое спасибо...

1
CandyKillah 15 Июл 2014 в 15:43
Попробуйте андроид: оттенок = "# 234233"
 – 
Illegal Argument
15 Июл 2014 в 15:44

2 ответа

Лучший ответ

Применение цветов к изображениям может быть немного сложным, поскольку платформа будет пытаться быть эффективной для вас. Когда вы добавляете несколько изображений с одним и тем же ресурсом, платформа будет содержать только одну ссылку на изображение и указывать на него несколько представлений. Это может быть проблематично в таких случаях, как ListViews, где у вас может быть кнопка изображения, которая включена или отображается серым цветом в зависимости от некоторых данных в элементе адаптера. Если у вас есть представление с десятью копиями одного и того же изображения, и вы изменяете изображение, все десять являются изменениями, поскольку они ссылаются на один и тот же ресурс под обложками. Чтобы бороться с этим, вы при необходимости мутируете Drawable, чтобы гарантировать получение чистой копии.

Вот хорошая статья на эту тему от Ромена Гая из Google.

http://www.curious-creature.org/2009/05/02/drawable-mutations/

Кроме того, вот пример того, как я использую мутации для применения цветовых фильтров поверх изображений.

/**
 * Applies a specified color filter to a Drawable.
 *
 * @param drawable drawable to filter.
 * @param color    color to apply.
 * @return a mutated Drawable.
 */
private static Drawable applyColorFilter(Drawable drawable, int color) {
    Drawable mutate = drawable.mutate();
    mutate.setColorFilter(color, PorterDuff.Mode.SRC_IN);
    return mutate;
}

Итак, чтобы применить фильтр оттенков серого, вы должны сделать что-то вроде этого:

/**
 * Applies a color filter to a Drawable.
 *
 * @return a mutated version of the given drawable with a color filter
 * applied.
 */
public static Drawable convertToGrayScale(Drawable drawable) {
    if (drawable == null) {
        return null;
    }
    return applyColorFilter(drawable, Color.LTGRAY);
}
1
Matt T. 15 Июл 2014 в 18:29
Мы попробуем, а затем я подтвержу лучшее решение для нас. Спасибо, @Мэтт Т.
 – 
CandyKillah
15 Июл 2014 в 16:47
Очень интересная статья! ;)
 – 
CandyKillah
15 Июл 2014 в 16:54

Попробуй это :

ImageView img = (ImageView) findViewById(R.id.img);
img.setBackgroundColor(R.color.gray);

Вам нужна картинка с прозрачным фоном.

ИЗМЕНИТЬ

Виноват. Попробуй это

Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId)
            .copy(Bitmap.Config.ARGB_8888, true);
Paint paint = new Paint();
paint.setStyle(Style.FILL);

Canvas canvas = new Canvas();
canvas.drawColor(R.color.gray);
canvas.drawBitmap(bm, left, top, paint);
BitmapDrawable picture = new BitmapDrawable(getResources(), bm);
0
AlonsoFloo 15 Июл 2014 в 16:15
Спасибо, но... это придаст цвет прозрачному фону, а не самому изображению... Я думаю. Мы хотим изменить цвет изображения, а не фона. Какие-либо предложения? :)
 – 
CandyKillah
15 Июл 2014 в 16:06
В своем ответе вы берете пример HTML, который заполняет фон div, а не само изображение;). Но я отредактировал свой пост :)
 – 
AlonsoFloo
15 Июл 2014 в 16:17
Извините, возможно, вы не прочитали весь код... Метод использует цвет фона, но он сочетается с -webkit-mask-image, который заполняет изображение цветом фона, установленным в стиле, сохраняя прозрачность фона. Вы можете увидеть результат здесь: jsfiddle.net/Dz3hd Спасибо за ответ. Ну попробуйте. :)
 – 
CandyKillah
15 Июл 2014 в 16:41