类似于ImageButton控件按下时的动…

来源:互联网 发布:淘宝衣服真空袋小号 编辑:程序博客网 时间:2024/06/05 09:58

    我们在开发程序时,经常需要控件的设计按下动画,比如Button或者TextView按下变色等,这在android中有2中实现方式:

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里实现

<?xml version="1.0" encoding="UTF-8"?>     

<selector xmlns:android="http://schemas.android.com/apk/res/android">     

    <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>     

这个文件放在drawable目录下面。命名为button_add_x.xml

使用的时候:

 

<ImageButton     

                        android:id="@+id/ImageButton"     

                        android:layout_width="wrap_content"     

                        android:layout_height="wrap_content"     

                        android:background="#00000000"     

                        android:src="@drawable/button_add_x"     

</ImageButton>    

以下为转载http://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 staticOnFocusChangeListener buttonOnFocusChangeListener=newOnFocusChangeListener() {   

    

  @Override 

  public void onFocusChange(Viewv, boolean hasFocus) {   

   if(hasFocus) {   

   v.getBackground().setColorFilter(newColorMatrixColorFilter(BT_SELECTED));  

   v.setBackgroundDrawable(v.getBackground());  

    

   else 

    

   v.getBackground().setColorFilter(newColorMatrixColorFilter(BT_NOT_SELECTED));  

    v.setBackgroundDrawable(v.getBackground());  

    

  

 };  

   

   

 public final staticOnTouchListener buttonOnTouchListener=new OnTouchListener() {  

  @Override 

  public boolean onTouch(View v,MotionEvent event) {   

  if(event.getAction() == MotionEvent.ACTION_DOWN){  

   v.getBackground().setColorFilter(newColorMatrixColorFilter(BT_SELECTED));  

   v.setBackgroundDrawable(v.getBackground());  

    

    elseif(event.getAction() == MotionEvent.ACTION_UP){  

    v.getBackground().setColorFilter(newColorMatrixColorFilter(BT_NOT_SELECTED));  

    v.setBackgroundDrawable(v.getBackground());  

    

   returnfalse;   

  

 };  

   

   

 public final static voidsetButtonFocusChanged(View inView)  

  

 inView.setOnTouchListener(buttonOnTouchListener);  

 inView.setOnFocusChangeListener(buttonOnFocusChangeListener);  

 }  

 

使用时,调用方法

public finalstatic void setButtonFocusChanged(ViewinView)

即可。

 

【原理】

 

利用Drawable类的setColorFilter方法对图片进行颜色偏移过滤处理。


0 0
原创粉丝点击