Android 设置视图的背景色

Android 设置视图的背景色,android,button,Android,Button,我有很多按钮,按下时应更改背景颜色,释放时应恢复为原始颜色(透明)。 目标是通过创建尽可能少的文件并避免手动处理触摸事件来实现这一点 简单地使用StateListDrawable不是一个好方法,因为它用另一个图像替换图像,而不仅仅是向图像添加背景。在这种情况下,每个按钮应有两个图像:一个用于按钮的向上状态,一个用于按钮的向下状态。目前,我只为向上的状态,并希望保持这样 另一种方法是使用一个层列表,然后每个按钮都应该有一个单独的xml用于关闭状态,它将结合背景色和“前景”图像 有没有其他的方法,一

我有很多按钮,按下时应更改背景颜色,释放时应恢复为原始颜色(透明)。
目标是通过创建尽可能少的文件并避免手动处理触摸事件来实现这一点

简单地使用
StateListDrawable
不是一个好方法,因为它用另一个图像替换图像,而不仅仅是向图像添加背景。在这种情况下,每个按钮应有两个图像:一个用于按钮的向上状态,一个用于按钮的向下状态。目前,我只为向上的状态,并希望保持这样

另一种方法是使用一个
层列表
,然后每个按钮都应该有一个单独的xml用于关闭状态,它将结合背景色和“前景”图像

有没有其他的方法,一些通用的方法,是我缺少的?

Android按钮支持,不需要代码


该示例显示如何使用图像文件,但您也可以定义形状。

您可以使用
ColorFilter
。像这样:

public class MyButton extends Button{
    int releasedColor;
    int pressedColor;
    public MyButton(Context context) {
        super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP){
            getBackground().setColorFilter(releasedColor, PorterDuff.Mode.SRC_IN);
        }
        else if (event.getAction() == MotionEvent.ACTION_DOWN){
            getBackground().setColorFilter(pressedColor, PorterDuff.Mode.SRC_IN);
        }
        return super.onTouchEvent(event);
    }
}

您可以更改
模式
参数,以便为您的案例获得最佳结果。

是否涵盖了您要查找的内容?@helleye您能解释一下吗?假设您有10个按钮,您是想在按下按钮时更改所有按钮的颜色,还是想在按下按钮时对按钮应用相同的效果,而不对所有按钮进行编码?@Charuka,后者,我想对多个按钮应用相同的效果。@helleye为什么不使用drawble选择器xml并将其设置为按钮的背景?因为您希望在单击单个按钮时为所有按钮显示相同的更改?在做决定之前,试着把事情弄清楚answer@Charuka当我按下一个按钮时,我想将它的背景更改为一种颜色,当我松开按钮时,它应该返回到原始背景。我想将这种行为应用于许多按钮。但如果我按下一个按钮,只有它的背景应该改变。然而,你的建议和Yoni Gross已经给出的答案是一样的。有没有人愿意解释一下为什么我使用内置Android机制的建议被否决了?所以我没有注意到我也可以使用选择器作为背景。谢谢你。但我无意中发现了一个问题,即实际上到处都在使用选择器的一个实例。因此,当您按下一个按钮时,所有使用相同背景可绘制xml的按钮都会更改其背景颜色:(虽然文档中说对于相同的资源共享状态都可绘制,但我猜它不适用于
StateListDrawable
,或者操作系统正在使用drawable.mutate()或者其他一些在XML中使用的变通方法。我刚刚尝试过,它工作得很好。它对我来说不太好,但至少按照文档所述工作。我在API 17上进行了测试。我想我可以接受对我使用的每个按钮进行变异的需要。这很奇怪。我用SDK 17编译并在API 17 emulator上运行它,但在XML中设置选择器的行为与预期一样。
...
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
v.setBackgroundColor(Color.WHITE);
 break;
...