我正在創建一個具有大約15個ImageButton的Android應用程序。該應用程序將有一個活動和幾個片段。某些按鈕的onclick事件處理將通過片段完成,其餘部分將通過活動完成。在ImageButton上應用色調
我想在按鈕上應用按鈕的色調。我不想爲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中指定可繪製文件。我寫了一個可繪製的文件,就像這樣。
<?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個按鍵。
有沒有簡單的方法來做到這一點?我想保持簡單的事情在一個地方。
我觀察到的另外一件事是,上述兩種方法產生的結果是不同的。當我在每種情況下應用相同的色調值時,我會看到不同的顏色。