android系統控件button是一種按鈕控件,使用者能夠在該控件上點選,并後引發相應的事件處理方法;imagebutton用以實作能夠顯示圖像功能的控件按鈕。
button的使用十分簡單,button的相關屬性如:style、android:text
、android:gravity
、 android:layout_weight也無需贅述了。
需要注意一下使用java代碼引入資源的時候一般利用setimageresource()方法,将新加入的資源檔案如:r.drawable.download傳遞給imagebutton。也就是說設定imagebutton的圖檔可通過android:src屬性,也可以通過setimageresource(int)方法來實作。需要特别注意的是在imagebutton中,如果使用xml配置檔案來設定圖檔的效果的話,就不要再指定它的android:src=""屬性值了,否則圖檔的按下效果就出不來了。
另外,添加點選事件的監聽器是實作一個按鈕基本功能的基礎,當然實作起來也比較簡單:
通過上面的demo就能很簡單的給按鈕添加點選事件的監聽了。
在本段代碼中,第1行代碼中button對象通過調用setonclicklistener()方法,注冊一個點選(click)事件的監聽器view.onclicklistener()。
第2行代碼是點選事件的回調方法。
第3行代碼将textview的顯示内容更改為“button按鈕”。
這裡我們來了解一下view.onclicklistener()。
view.onclicklistener()是view定義的點選事件的監聽器接口,并在接口中僅定義了onclick()方法。當button從android界面架構中接收到事件後,首先檢查這個事件是否是點選事件,如果是點選事件,同時button又注冊了監聽器,則會調用該監聽器中的onclick()方法。每個view僅可以注冊一個點選事件的監聽器,如果使用setonclicklistener()方法注冊第二個點選事件的監聽器,之前注冊的監聽器将被自動登出。
還有一種情況,如果需要多個按鈕注冊到同一個點選事件的監聽器上,可以這樣:
該段代碼中,第1行至第12行代碼定義了一個名為buttonlistener的點選事件監聽器;第13行代碼将該監聽器注冊到button上;第14行代碼将該監聽器注冊到imagebutton上。
說完這些還有一個重要的問題:
跟button按鈕的差別是可以在imagebutton上加載一個圖檔。從imagebutton這個字面意思上來看,它是一個圖檔按鈕,那麼我們就可以使用它做一個我們想要的圖檔按鈕了,但是我們在實際使用的過程當中,就會發現該按鈕的使用并沒有想像中的那麼簡單,需要再增加一些代碼或再配置xml才能實作圖檔按鈕按下的效果。
這就得說說自定義button背景和selector的使用了:
,
使用button的時候,實作“按下”的效果是很重要的,也是很常見的,
這裡就常常需要我們使用selector了,不過還有另外幾種方式。
總結起來主要有下面三種方式:
1.在java代碼中:
2.xml檔案實作:(selector)
把上面的xml檔案,命名為button_regist.xml放在drawable目錄下,使用的方法如下:
以上兩種方式比較簡單也比較常用,但是需要很多的圖檔和布局檔案,如果項目中的圖檔按鈕比較多,那就很浪費資源。第三種方式使用矩陣顔色濾鏡。
顔色過濾矩陣是一個4x5的矩陣, 四行分别是 紅色通道值,綠色通道值,藍色通道值和alpha通道值。五列分别是 對應通道的紅色值,綠色值,藍色值,alpha值和偏移量。
rgb和alpha的終值計算方法如下:
red通道終值 = a[0] * srcr +a[1] * srcg + a[2] * srcb + a[3] * srca + a[4]
green通道終值 = a[5] * srcr +a[6] * srcg + a[7] * srcb + a[8] * srca + a[9]
blue通道終值 = a[10] * srcr +a[11] * srcg + a[12] * srcb + a[13] * srca + a[14]
alpha通道終值 = a[15] * srcr +a[16] * srcg + a[17] * srcb + a[18] * srca + a[19]
備注:
srcr為原圖red通道值,srcg為原圖green通道值,srcb為原圖blue通道值,srca為原圖alpha通道值。
每個通道的源值和終值都在0到255的範圍内。即使計算結果大于255或小于0,值都将被限制在0到255的範圍内。
代碼如下:
使用時,調用方法
public final static void setbuttonfocuschanged(view inview)
即可。
【原理】
利用drawable類的setcolorfilter方法對圖檔進行顔色偏移過濾處理。