在视图上覆盖一种颜色

6
对于自定义的AdapterView实现,我想给选中的项目添加颜色覆盖层。如何为我的AdapterView的子项添加颜色覆盖层?

https://dev59.com/cWYr5IYBdhLWcg3wAFrE#14024007 - Chintan Rathod
我不想改变子元素的背景。我想添加一个颜色叠加层。此外,这应该是一个通用的解决方案,因为我不知道子视图代表什么类型。 - multiholle
然后在您的列表视图项上放置一个CustomViewImageView。当选中时,只需更改CustomViewImageView的颜色即可。 - Chintan Rathod
2个回答

10
如果您正在使用自己的布局,只需将容器更改为RelativeLayout(或继承自RelativeLayout的Layout类),然后在主布局后放置颜色叠加层。您只需要添加一个View并设置其背景和透明度。alpha设置为值1将激活此叠加层,而将alpha设置为0将返回到正常模式。
例如:
<RelativeLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <!-- add your views here -->

  <View
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#8000FF00" />

</RelativeLayout>

这将在布局中排在它之前的其他视图上叠加一个50%透明度的绿色层。


5

好的,我进行了更多的研究。这是我最终得出的结论:

// prepare a gray filter setting saturation to 0, or ...
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
Paint paint = new Paint();
ColorFilter filter = new ColorMatrixColorFilter(cm);

// ... prepare a color filter
ColorFilter filter = new PorterDuffColorFilter(Color.rgb(34, 136, 201), PorterDuff.Mode.OVERLAY);

// create paint
paint.setColorFilter(filter);


// override dispatchDraw of the view
@Override
protected void dispatchDraw(Canvas canvas) {
    if (isPressed()) {
        canvas.saveLayer(null, paint, Canvas.ALL_SAVE_FLAG);
        super.dispatchDraw(canvas);
        canvas.restore();
    } else {
        super.dispatchDraw(canvas);
    }
}

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