【问题标题】:ImageView - draw translucent color on top for its focused state?ImageView - 在顶部绘制半透明颜色以获取焦点状态?
【发布时间】:2012-05-30 06:03:38
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: android


    【解决方案1】:

    这对我有用

    <?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>
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        如果你创建自己的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
        猜你喜欢
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 2014-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-31
        相关资源
        最近更新 更多