我目前正在开发的应用程序使用了很多ImageViews作为按钮 . 这些按钮上的图形使用Alpha通道淡出按钮的边缘,使它们看起来不规则 . 目前,我们必须为每个按钮生成2个图形(1个用于选定/聚焦/按下状态,另一个用于默认的未选择状态),并使用XML文件中为每个按钮定义的StateListDrawable .
虽然这很好用但看起来非常浪费,因为所有选定的图形都只是未选定按钮的着色版本 . 这些花费时间来制作(无论多少)并占用最终APK中的空间 . 似乎应该有一个简单的方法来自动 .
看起来,完美的解决方案是为每个按钮使用ImageViews,并在其tint属性中指定ColorStateList . 这种方法的优点是,所有按钮(共享相同色调)只需要一个XML ColorStateList . 但它不起作用 . 如上所述here,当提供给tint的值不是单一颜色时,ImageView会抛出NumberFormatException .
我的下一次尝试是为选定的drawable使用LayerDrawable . 在图层列表中,我们将原始图像放在堆栈底部,由半透明矩形覆盖 . 这适用于按钮图形的实体部分 . 然而,应该是完全透明的边缘现在与顶层的颜色相同 .
有没有人遇到过这个问题,找到了合理的解决方案?我想坚持使用XML方法,但可能会编写一个简单的ImageView子类,它将在代码中进行所需的着色 .
8 回答
您可以将
StateListDrawable
和LayerDrawable
组合起来 .我假设我们的colors.xml看起来像这样
对于那些遇到类似需求的人来说,在代码中解决这个问题是相当干净的 . 这是一个示例:
它还没有完成,但作为一个概念证明 .
Your answer很棒:)
但是,我只是调用OnTouchlistener来改变每个视图的状态,而不是创建一个按钮对象 .
但是给出了相同的结果
我认为这个解决方案很简单!
第1步:创建res / drawable / dim_image_view.xml
第2步:创建res / drawable / dim_image_view_normal.xml
第3步:创建res / drawable / dim_image_view_pressed.xml
第4步:尝试将xml布局中的图像设置为:
我也有不规则的按钮,需要色调 . 最后,我只是使用州的颜色列表作为我的
ImageButton
背景 . 给人的印象是按钮颜色在印刷时正在变化,并且非常简单且计算密集度较低 . 我知道这不完全是一种色调,但确实给它提供了必要的视觉反馈,通常是一个短暂的时刻 .你可以使用我创建的类https://github.com/THRESHE/TintableImageButton不是最好的解决方案,但它有效 .
Your answer也很出色;)
我正在修改一下,它会给你这样的结果:
我认为这个解决方案很简单: