閱讀333 返回首頁    go 技術社區[雲棲]


安卓控件之Button與ImageButton詳解以及其按下效果的實現


   Android係統控件Button是一種按鈕控件,用戶能夠在該控件上點擊,並後引發相應的事件處理方法;ImageButton用以實現能夠顯示圖像功能的控件按鈕。

 button的使用十分簡單,button的相關屬性如:styleandroid: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

  上一篇:go 牛腩新聞發布係統總結(四)--知識點滴
  下一篇:go Logistic Regression 分類算法