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

use*_*701 6 android

我有一个ImageView,我喜欢一个选择器,当用户点击或以其他方式聚焦时,在ImageView内容的顶部绘制一个半透明的颜色.我不确定选择器是否可行(我过去用静态drawables定义了这个).

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

ImageView iv = ...;
iv.setBitmapDrawable(bitmapLoadedFromInternets()); // dynamic content
iv.setClickStateOverlayColor(0x33ff0000); // ?
Run Code Online (Sandbox Code Playgroud)

通常ImageView只通过setBitmapDrawable()获取一个drawable,但是一个选择器(1)交换不同点击状态的drawable,而我只想绘制一个颜色叠加,(2)off状态是一个动态位图,所以我无法从选择器定义中引用它.

谢谢

wsa*_*lle 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在XML布局中使用它,只需将其称为完全限定,my.package.ImageView而不仅仅是ImageView.

  • 也许你应该将你的触摸中止扩展到这个动作:MotionEvent.ACTION_HOVER_EXIT MotionEvent.ACTION_CANCEL (2认同)

Luk*_*cek 9

onTouch的解决方案由于多种原因没有为我工作,但给了我如何做的提示,以便它适用于我.我只是覆盖了ImageView中的另一个方法.

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