Android — получить цвет из ImageView с применением ColorFIlter к Drawable

Я пытаюсь получить цвет ImageView в GridView, к которому ранее я применил цветовой фильтр. У меня Nexus 4 с 4.2.2.

Я меняю цвет ImageView следующим образом. Фактический цвет изображения белый, прежде чем я применил фильтр.

Drawable myIcon = getResources().getDrawable(R.drawable.bufferbuildercolor3);                       
myIcon.setColorFilter(new PorterDuffColorFilter(Color.rgb(Color.red(color),Color.green(color), Color.blue(color)),PorterDuff.Mode.MULTIPLY));

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

Моя проблема в том, что я пытаюсь сослаться на цвет после того, как потерял данные, которые использовал для его установки. Я хочу долго нажимать на ImageView и получать его цвет.

Я нашел некоторый код в приведенном ниже вопросе, но он, похоже, не работает, поскольку всегда возвращает белый цвет (255 255 255), который ЯВЛЯЕТСЯ цветом исходного изображения, но не фильтром. Как получить цвет пикселя в Android?

ImageView imageView = ((ImageView)v);
Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap();
int pixel = bitmap.getPixel(x,y);

int redValue = Color.red(pixel);
int blueValue = Color.blue(pixel);
int greenValue = Color.green(pixel);

Я пробовал такие вещи, как показано ниже, но он просто падает, когда я вызываю getColorFilter.

ImageView image = (ImageView)findViewById(R.drawable.bufferbuildercolor3);
ColorFilter test = image.getColorFilter();

Я не уверен, что еще делать, кроме, возможно, найти X / Y фактического положения сетки, а затем получить цвет фона экрана в этой точке, а не изображения. Кажется, должен быть более простой способ сделать это?


person Ben987654    schedule 22.05.2013    source источник


Ответы (1)


Вы можете пометить ImageView (или любой View в этом отношении) с данными, которые вы хотите получить позже. Например, пометьте вид тем же Color, который вы используете для построения PorterDuffColorFilter:

Color tagColor = Color.rgb(Color.red(color),Color.green(color), Color.blue(color));
// tag
imageview.setTag(tagColor);

// get tag
tagColor = (Color) imageview.getTag();

Очевидно, что тег будет собирать мусор, когда связанное представление.

В качестве альтернативы подход в вашем третьем фрагменте кода может действительно работать, если вы его исправите. В настоящее время вы пытаетесь расширить представление, ища идентификатор drawable — это не имеет смысла. Идентификатор должен быть в форме R.id.imageview_id, т.е.:

ImageView image = (ImageView) findViewById(R.id.imageview);
ColorFilter test = image.getColorFilter();
person MH.    schedule 22.05.2013
comment
Я понял, как получить imageView [ImageView imageView = (ImageView) gridview.getChildAt(x);], а затем смог использовать предложенный вами метод тега. Мне не удалось получить ничего полезного из метода getColorFilter, но я еще раз взгляну на него позже. Это дополнительный шаг, помечающий вещи, но он работает! Спасибо!! - person Ben987654; 22.05.2013
comment
Это блестящее решение. Я использовал его для применения цветового фильтра к элементу представления ресайклера через привязку данных. Его не следует устанавливать, если цветовой фильтр уже был применен, поэтому пометка его цветом означает, что он применяется только при необходимости. - person Daniel Wilson; 25.04.2019