我正在创建一个Android应用程序,它有大约15个ImageButtons。该应用程序将有一个活动和几个片段。某些按钮的onclick事件处理将由片段完成,其余部分将由活动完成。
我想在按下按钮时在按钮上应用色调。我不想在Normal和Pressed状态下使用不同的图像,但是想以编程方式应用色调,因为为每个按钮维护两个图像是一件很麻烦的事。
当我在Stackoverflow上搜索时,可以有多种方式。 1)处理onTouchEvent。在Action_Down事件上应用色调,并在Action_Up上取消色调效果。可以使用按钮上的setColorFilter应用色调。
View.OnTouchListener onTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
ImageButton view = (ImageButton) v;
view.setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP);
v.invalidate();
break;
}
case MotionEvent.ACTION_UP
// Your action here on button click
case MotionEvent.ACTION_CANCEL: {
ImageButton view = (ImageButton) v;
view.clearColorFilter();
view.invalidate();
break;
}
}
return true;
}
};
这种方法的问题在于,由于我处理按钮点击不同的地方(活动和片段),我必须在每个难以维护的地方进行此更改。另外,为了处理onClick操作,我在Action_Up事件中为每个按钮添加了一个switch语句。
2)使用Drawables,我为每个按钮创建drawable,在按钮的src中指定drawable文件。我写了一个像这样的可绘制文件。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/btn_pressed_drawable" /><!-- pressed -->
<item android:state_focused="true"
android:drawable="@drawable/button_image" /> <!-- focused -->
<item android:drawable="@drawable/button_image" /> <!-- default -->
</selector>
,btn_pressed_drawable的代码是
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/button_image"
android:tint="#770000"/>
但这种方法的问题是我需要为每个按钮创建两个文件,我有大约15个按钮。
有一种简单的方法吗?我想把事情简单地放在一个地方。
我观察到的另一件事是,上述两种方法产生的结果是不同的。当我在每种情况下应用相同的色调值时,我看到不同的颜色。
答案 0 :(得分:0)
您需要使用setColorFilter(..)
编写colorfilter代码getBackground()
。
之后,您的代码如下所示:
View.OnTouchListener onTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
ImageButton view = (ImageButton) v;
view.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP);//line changed
v.invalidate();
break;
}
case MotionEvent.ACTION_UP
// Your action here on button click
case MotionEvent.ACTION_CANCEL: {
ImageButton view = (ImageButton) v;
view.getBackground().clearColorFilter();//line changed
view.invalidate();
break;
}
}
return true;
}
};
我希望它对你有所帮助。