我想要一个选择器,这样当用户单击或以其他方式获得焦点时,会在ImageView内容顶部绘制半透明的颜色。我不确定选择器是否可以做到这一点(我过去一直在用静态可绘制对象定义)。
但基本上我有一个列表视图,每行都有 imageview 实例,并且想做这样的事情:
ImageView iv = ...;
iv.setBitmapDrawable(bitmapLoadedFromInternets()); // dynamic content
iv.setClickStateOverlayColor(0x33ff0000); // ?
通常 ImageView 仅通过 setBitmapDrawable() 获取单个可绘制对象,但选择器 (1) 将可绘制对象换成不同的单击状态,而我只想绘制颜色叠加,并且 (2) 关闭状态是动态位图,所以我无法从选择器定义中引用它。
谢谢
如果你创建自己的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
。
由于多种原因,onTouch 的解决方案对我不起作用,但给了我有关如何做到这一点的提示,以便它对我有用。我刚刚覆盖了图像视图中的另一个方法。
@Override
public void setPressed(boolean pressed) {
if (pressed) {
setColorFilter(0x55000000, PorterDuff.Mode.SRC_ATOP);
}
else {
clearColorFilter();
}
super.setPressed(pressed);
}
我有用
<?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>