Вопрос по android – ImageView - рисовать полупрозрачный цвет сверху для его сфокусированного состояния?

6

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

Но в основном у меня есть просмотр списка с экземплярами изображений в каждой строке, и я хотел сделать что-то вроде:

ImageView iv = ...;
iv.setBitmapDrawable(bitmapLoadedFromInternets()); // dynamic content
iv.setClickStateOverlayColor(0x33ff0000); // ?

Обычно ImageView берет только одну рисуемую форму с помощью setBitmapDrawable (), но селектор (1) заменяет нарисованную для различных состояний щелчка, тогда как я просто хочу, чтобы наложение цвета отображалось, и (2) состояние выключения является динамическим растровым изображением, поэтому Я не могу сослаться на это из определения селектора.

Спасибо

Ваш Ответ

3   ответа
9

Решение с помощью onTouch не сработало для меня по нескольким причинам, но подсказало мне, как это сделать, чтобы оно работало для меня. Я просто переопределил другой метод в ImageView.

@Override
    public void setPressed(boolean pressed) {
        if (pressed) {
            setColorFilter(0x55000000, PorterDuff.Mode.SRC_ATOP);
        }
        else {
            clearColorFilter();
        }
        super.setPressed(pressed);
    }
0

Это работает для меня

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/grid" />
    <item>
        <selector>
            <item android:state_pressed="true">
                <color android:color="#7000" />
            </item>
        </selector>
    </item>

</layer-list>
13

Вы можете сделать это довольно легко, если вы сделаете свой собственный подклассImageView, Метод для использованияsetColorFilter, Что-то вроде этого сделает это:

public class ImageView extends android.widget.ImageView
{
    public ImageView(Context context)
    {
        super(context);
    }

    public ImageView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ImageView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        if(event.getAction() == MotionEvent.ACTION_DOWN && isEnabled())
            setColorFilter(0x33ff0000, PorterDuff.Mode.MULTIPLY); //your color here

        if(event.getAction() == MotionEvent.ACTION_UP)
            setColorFilter(null);

        return super.onTouchEvent(event);
    }
}

Затем вы можете использовать его в своих XML-макетах, просто ссылаясь на него полностью какmy.package.ImageView вместо простоImageView.

возможно, вам следует расширить функцию прерывания касания на следующие действия: MotionEvent.ACTION_HOVER_EXIT MotionEvent.ACTION_CANCEL

Похожие вопросы