ImageView - 在其聚焦状态下绘制半透明颜色?

6
我有一个ImageView,我希望设计一个选取器,当用户点击或获得焦点时,可以在ImageView内容上面绘制半透明的颜色。我不确定是否可以使用选择器(过去我一直使用静态drawable来定义选择器)。但基本上,我有一个ListView,每行都有一个ImageView实例,想要做类似如下的事情:
ImageView iv = ...;
iv.setBitmapDrawable(bitmapLoadedFromInternets()); // dynamic content
iv.setClickStateOverlayColor(0x33ff0000); // ?

通常情况下,ImageView只能通过setBitmapDrawable()方法设置单个drawable。但是选择器(1)可以为不同的点击状态切换drawable,而我只想绘制一个颜色叠加层;(2)关闭状态是动态位图,所以无法从选择器定义中引用它。谢谢。
3个回答

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

您可以通过完全限定名称引用它,如my.package.ImageView而不是仅仅使用ImageView来在您的XML布局中使用它。


2
也许你应该将触摸中止扩展到以下操作: MotionEvent.ACTION_HOVER_EXIT MotionEvent.ACTION_CANCEL - berlindev

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接