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