Android中的Button、ImageButton自定义点击效果

简介:
使用Button时为了让用户有“按下”的效果,有两种实现方式:

1.在代码里面。

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>  


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

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

 

代码可以适当修改实现3个不同的状态:正常,获取焦点,点击。

出处: http://blog.csdn.net/sytzz/archive/2010/06/16/5673662.aspx

相关文章
|
20天前
|
Java API 调度
Android系统 自定义开机广播,禁止后台服务,运行手动安装应用接收开机广播
Android系统 自定义开机广播,禁止后台服务,运行手动安装应用接收开机广播
41 0
|
20天前
|
存储 Java Linux
Android Mstar增加IR 自定义遥控头码完整调试过程
Android Mstar增加IR 自定义遥控头码完整调试过程
27 1
|
1月前
|
缓存 测试技术 Android开发
深入探究Android中的自定义View绘制优化策略
【4月更文挑战第8天】 在Android开发实践中,自定义View的绘制性能至关重要,尤其是当涉及到复杂图形和动画时。本文将探讨几种提高自定义View绘制效率的策略,包括合理使用硬件加速、减少不必要的绘制区域以及利用缓存机制等。这些方法不仅能改善用户体验,还能提升应用的整体性能表现。通过实例分析和性能测试结果,我们将展示如何有效地实现这些优化措施,并为开发者提供实用的技术指南。
|
1月前
|
前端开发 Android开发 开发者
深入探究Android中的自定义View组件开发
【4月更文挑战第3天】 在现代Android应用程序的开发过程中,创建具有独特功能和高度定制化的用户界面是一个常见需求。为此,理解并掌握自定义View组件的开发成为了开发者必备的技能之一。本文将深入探讨如何在Android中创建自定义View,从基础的绘制原理到事件处理机制,再到性能优化技巧,旨在为读者提供一个全面的技术视角,并通过实例代码演示如何实现一个功能丰富、响应迅速的自定义View组件。
|
1月前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
59 1
|
1月前
|
XML Android开发 数据格式
android点击FrameLayout、LinearLayout等父布局没响应的原因以及解决方案
android点击FrameLayout、LinearLayout等父布局没响应的原因以及解决方案
32 2
|
1天前
|
存储 消息中间件 缓存
Android应用开发:实现自定义View的高效绘制
【5月更文挑战第12天】 在Android开发中,创建高性能的自定义视图是一项挑战,它要求开发者深入理解Android的绘图机制以及UI渲染过程。本文将探讨如何优化自定义View的绘制流程,减少不必要的重绘和布局计算,以提升应用的响应速度和流畅度。我们将介绍几种关键策略,包括利用硬件加速、缓存绘制内容和使用高效的数据结构来存储视图状态。通过实例分析和性能对比,读者将学会如何在自己的应用中运用这些技巧,从而打造出更加流畅和响应迅速的用户界面。
|
3天前
|
XML Android开发 数据格式
Android下自定义Button样式
Android下自定义Button样式
10 3
|
3天前
|
XML Java Android开发
如何美化android程序:自定义ListView背景
如何美化android程序:自定义ListView背景
|
3天前
|
搜索推荐 Android开发
自定义Android标题栏TitleBar布局
自定义Android标题栏TitleBar布局