333
技術社區[雲棲]
安卓控件之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=""屬性值了,否則圖片的按下效果就出不來了。
另外,添加點擊事件的監聽器是實現一個按鈕基本功能的基礎,當然實現起來也比較簡單:
button.setOnClickListener(newView.OnClickListener() { public void onClick(View view) { textView.setText("Button按鈕"); } }); imageButton.setOnClickListener(newView.OnClickListener() { public void onClick(View view) { textView.setText("ImageButton按鈕"); } });
通過上麵的Demo就能很簡單的給按鈕添加點擊事件的監聽了。
在本段代碼中,第1行代碼中button對象通過調用setOnClickListener()方法,注冊一個點擊(Click)事件的監聽器View.OnClickListener()。
第2行代碼是點擊事件的回調方法。
第3行代碼將TextView的顯示內容更改為“Button按鈕”。
這裏我們來了解一下View.OnClickListener()。
View.OnClickListener()是View定義的點擊事件的監聽器接口,並在接口中僅定義了onClick()方法。當Button從Android界麵框架中接收到事件後,首先檢查這個事件是否是點擊事件,如果是點擊事件,同時Button又注冊了監聽器,則會調用該監聽器中的onClick()方法。每個View僅可以注冊一個點擊事件的監聽器,如果使用setOnClickListener()方法注冊第二個點擊事件的監聽器,之前注冊的監聽器將被自動注銷。
還有一種情況,如果需要多個按鈕注冊到同一個點擊事件的監聽器上,可以這樣:
Button.OnClickListener buttonListener = new Button.OnClickListener(){ @Override public void onClick(View v) { switch(v.getId()){ case R.id.Button01: textView.setText("Button按鈕"); return; case R.id.ImageButton01: textView.setText("ImageButton按鈕"); return; } }}; Button.setOnClickListener(buttonListener); ImageButton.setOnClickListener(buttonListener);
該段代碼中,第1行至第12行代碼定義了一個名為buttonListener的點擊事件監聽器;第13行代碼將該監聽器注冊到Button上;第14行代碼將該監聽器注冊到ImageButton上。
說完這些還有一個重要的問題:
跟Button按鈕的區別是可以在Imagebutton上加載一個圖片。從ImageButton這個字麵意思上來看,它是一個圖片按鈕,那麼我們就可以使用它做一個我們想要的圖片按鈕了,但是我們在實際使用的過程當中,就會發現該按鈕的使用並沒有想像中的那麼簡單,需要再增加一些代碼或再配置XML才能實現圖片按鈕按下的效果。
這就得說說自定義button背景和selector的使用了:
,
使用Button的時候,實現“按下”的效果是很重要的,也是很常見的,
這裏就常常需要我們使用selector了,不過還有另外幾種方式。
總結起來主要有下麵三種方式:
1.在java代碼中:
imageButton.setOnTouchListener(new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN){ //更改為按下時的背景圖片 v.setBackgroundResource(R.drawable.pressed); }else if(event.getAction() == MotionEvent.ACTION_UP){ //改為抬起時的圖片 v.setBackgroundResource(R.drawable.released); } return false; } });
2.xml文件實現:(selector)
<span ><?xml version="1.0" encoding="UTF-8"?> <selector xmlns:andro> <item android:state_pressed="false" android:drawable="@drawable/button_add" /> <item android:state_pressed="true" android:drawable="@drawable/button_add_pressed" /> <item android:state_focused="true" android:drawable="@drawable/button_add_pressed" /> <item android:drawable="@drawable/button_add" /> </selector> </span><span > </span>
把上麵的xml文件,命名為button_regist.xml放在drawable目錄下,使用的方法如下:
<span ><ImageButton android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#00000000" android:src="@drawable/button_regist " > </ImageButton> </span>
以上兩種方式比較簡單也比較常用,但是需要很多的圖片和布局文件,如果項目中的圖片按鈕比較多,那就很浪費資源。第三種方式使用矩陣顏色濾鏡。
顏色過濾矩陣是一個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的範圍內。
代碼如下:
以下內容來自:https://blog.csdn.net/sytzz/archive/2010/06/16/5673662.aspx
/** * 按下這個按鈕進行的顏色過濾 */ public final static float[] BT_SELECTED=new float[] { 2, 0, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 2, 0, 0, 0, 1, 0 }; /** * 按鈕恢複原狀的顏色過濾 */ public final static float[] BT_NOT_SELECTED=new float[] { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 }; /** * 按鈕焦點改變 */ public final static OnFocusChangeListener buttonOnFocusChangeListener=new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_SELECTED)); v.setBackgroundDrawable(v.getBackground()); } else { v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_NOT_SELECTED)); v.setBackgroundDrawable(v.getBackground()); } } }; /** * 按鈕觸碰按下效果 */ public final static OnTouchListener buttonOnTouchListener=new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN){ v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_SELECTED)); v.setBackgroundDrawable(v.getBackground()); } else if(event.getAction() == MotionEvent.ACTION_UP){ v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_NOT_SELECTED)); v.setBackgroundDrawable(v.getBackground()); } return false; } }; /** * 設置圖片按鈕獲取焦點改變狀態 * @param inImageButton */ public final static void setButtonFocusChanged(View inView) { inView.setOnTouchListener(buttonOnTouchListener); inView.setOnFocusChangeListener(buttonOnFocusChangeListener); }
使用時,調用方法
public final static void setButtonFocusChanged(View inView)
即可。
【原理】
利用Drawable類的setColorFilter方法對圖片進行顏色偏移過濾處理。
最後更新:2017-04-03 05:39:34