6

我有一个 ImageView,我想要一个选择器,这样当用户单击或以其他方式获得焦点时,会在 ImageView 内容的顶部绘制半透明颜色。我不确定这是否可以使用选择器(我过去一直用静态可绘制对象定义好)。

但基本上我在每一行都有一个带有 imageview 实例的列表视图,并且想做类似的事情:

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

通常 ImageView 仅通过 setBitmapDrawable() 获取单个可绘制对象,但选择器 (1) 为不同的单击状态交换可绘制对象,而我只想要绘制颜色叠加层,并且 (2) 关闭状态是动态位图,所以我无法从选择器定义中引用它。

谢谢

4

3 回答 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);
    }
}

然后,您可以在 XML 布局中使用它,只需引用完全限定的 likemy.package.ImageView而不是ImageView.

于 2012-05-23T16:45:40.540 回答
9

由于多种原因,onTouch 的解决方案对我不起作用,但给了我关于如何做到这一点的提示,以便它对我有用。我只是重写了 ImageView 中的另一个方法。

@Override
    public void setPressed(boolean pressed) {
        if (pressed) {
            setColorFilter(0x55000000, PorterDuff.Mode.SRC_ATOP);
        }
        else {
            clearColorFilter();
        }
        super.setPressed(pressed);
    }
于 2013-12-16T14:05:42.723 回答
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>
于 2014-11-21T08:16:47.253 回答