我目前正在开发的应用程序中,使用了很多ImageView作为按钮。这些按钮上的图形使用alpha通道来淡化按钮的边缘,使它们看起来不规则。目前,我们必须为每个按钮生成两个图形(一个用于选定/聚焦/按下状态,另一个用于默认未选定状态),并为每个按钮使用在XML文件中定义的StateListDrawable。
虽然这样做没有问题,但似乎非常浪费,因为所有选定的图形只是未选定按钮的着色版本。这些需要时间来生成(尽管很少),并在最终的APK中占用空间。似乎应该有一种简单的自动方式来解决这个问题。
理想的解决方案似乎是为每个按钮使用ImageView,并在其tint属性中指定一个ColorStateList。这种方法的优点是只需要一个XML ColorStateList即可用于所有共享相同tint的按钮。但是它不起作用。如此处所述,当tint的值不是单一颜色时,ImageView会抛出NumberFormatException。
我的下一个尝试是使用LayerDrawable作为选定的可绘制对象。在层列表中,我们将原始图像放在堆栈底部,然后用半透明矩形覆盖它。这对按钮图形的实心部分起作用。但是边缘应该完全透明,现在与顶层相同颜色。
有没有人遇到过这个问题并找到了合理的解决方案?我想坚持使用XML方法,但可能会编写一个简单的ImageView子类,在代码中进行所需的着色。
else if ((event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) && mIsSelected)
这确保了当用户按住按钮并将手指拖出并释放时,色调会消失。 - Jaykobinit()
应该只在TintableButton(Context context, AttributeSet attrs, int defStyle)
构造函数中被调用。 - Mark Pazon