zoukankan      html  css  js  c++  java
  • 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方法对图片进行颜色偏移过滤处理。
    以下为效果图,登陆按钮此时为获取焦点状态。

  • 相关阅读:
    AM335x kernel 4.4.12 i2c eeprom AT24c02驱动移植
    AM335x tscadc platform driver 相关代码跟踪
    Linux kernel make 常用选项介绍
    Linux kernel 文件夹说明
    shell 脚本之获取命令输出字符串以及函数参数传递
    Treeview控件如何获得子节点的所有父节点的名称
    浅谈Delphi高效使用TreeView
    Delphi下Treeview控件基于节点编号的访问
    delphi中TTreeView的使用方法
    学习 TTreeView [2]
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4560766.html
Copyright © 2011-2022 走看看