0

我正在創建一個具有大約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個按鍵。

有沒有簡單的方法來做到這一點?我想保持簡單的事情在一個地方。

我觀察到的另外一件事是,上述兩種方法產生的結果是不同的。當我在每種情況下應用相同的色調值時,我會看到不同的顏色。

回答

0

您需要使用getBackground()編寫colorfilter代碼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.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; 
    } 
}; 

我希望它能幫助你。