• ImageButton自定义按钮的按下效果的高效实现方法(非一般)


    通常情况下,我们可以采用如下方式实现:

        <?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" />   

    这样的实现过程虽然通用性好,但是很麻烦,一个按钮实现效果需要多张图片甚至再加一个布局…
    那一个游戏要是有几百个按钮怎么办呢?
    于是:以下代码被酝酿出来了:

        /**   
           * 按下这个按钮进行的颜色过滤   
           */    
          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方法对图片进行颜色偏移过滤处理。
    以下为效果图,登陆按钮此时为获取焦点状态。

  • 相关阅读:
    20200721训练记录
    20200717训练记录
    打家劫舍III(力扣第337题)
    HBase API的删除数据操作的分析
    相交链表(第160题)
    删除排序链表中的重复元素(第83题)
    合并两个有序链表(力扣第21题)
    删除链表的倒数第N个节点(第19题)
    HBase的架构原理
    回文链表、链表求和(234、445)
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4560766.html
Copyright © 2020-2023  润新知