Android中ImageButton自定义按钮的按下效果的代码实现方法,附网上2种经典解决方法。

Wesley13
• 阅读 506

首先看看网上的2种方法:

【以下为引用网络,来源:http://www.eoeandroid.com/thread-7931-1-1.html

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

1.在代码里面。

[java] view plaincopy

  1. imageButton.setOnTouchListener(new OnTouchListener(){
  2. @Override
  3. public boolean onTouch(View v, MotionEvent event) {
  4. if(event.getAction() == MotionEvent.ACTION_DOWN){
  5. //更改为按下时的背景图片
  6. v.setBackgroundResource(R.drawable.pressed);
  7. }else if(event.getAction() == MotionEvent.ACTION_UP){
  8. //改为抬起时的图片
  9. v.setBackgroundResource(R.drawable.released);
  10. }
  11. return false;
  12. }
  13. });
  14. imageButton.setOnTouchListener(new OnTouchListener(){
  15. @Override
  16. public boolean onTouch(View v, MotionEvent event) {
  17. if(event.getAction() == MotionEvent.ACTION_DOWN){
  18. //更改为按下时的背景图片
  19. v.setBackgroundResource(R.drawable.pressed);
  20. }else if(event.getAction() == MotionEvent.ACTION_UP){
  21. //改为抬起时的图片
  22. v.setBackgroundResource(R.drawable.released);
  23. }
  24. return false;
  25. }
  26. });

2.用XML文件实现。

[xhtml] view plaincopy

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

  2. <item android:state_pressed="false"  android:drawable="@drawable/button_add" />

  3. <item android:state_pressed="true"   android:drawable="@drawable/button_add_pressed" />

  4. <item android:state_focused="true"    android:drawable="@drawable/button_add_pressed" />

  5. <item android:drawable="@drawable/button_add" />

  6. </selector>

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

  8. <item android:state_pressed="false"  android:drawable="@drawable/button_add" />

  9. <item android:state_pressed="true"  android:drawable="@drawable/button_add_pressed" />

  10. <item android:state_focused="true"  android:drawable="@drawable/button_add_pressed" />

  11. <item android:drawable="@drawable/button_add" />

  12. </selector>

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

使用的时候

[xhtml] view plaincopy

  1. <ImageButton
  2. android:id="@+id/ImageButton"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:background="#00000000"
  6. android:src="@drawable/button_add_x" >
  7. </ImageButton>
  8. <ImageButton
  9. android:id="@+id/ImageButton"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:background="#00000000"
  13. android:src="@drawable/button_add_x" >
  14. </ImageButton>

【以上为引用网络,来源:http://www.eoeandroid.com/thread-7931-1-1.html

【以下为原创,转载请注明出处:http://blog.csdn.net/sytzz/archive/2010/06/16/5673662.aspx

我自己摸索摸索,发现这样的实现过程虽然通用性好,但是很麻烦,一个按钮实现效果需要多张图片甚至再加一个布局…

那一个游戏要是有几百个按钮怎么办呢?

于是:以下代码被酝酿出来了:

[java] view plaincopy

  1. /**

  2. * 按下这个按钮进行的颜色过滤

  3. */

  4. public final static float[] BT_SELECTED=new float[] {

  5. 2, 0, 0, 0, 2,

  6. 0, 2, 0, 0, 2,

  7. 0, 0, 2, 0, 2,

  8. 0, 0, 0, 1, 0 };

  9. /**

  10. * 按钮恢复原状的颜色过滤

  11. */

  12. public final static float[] BT_NOT_SELECTED=new float[] {

  13. 1, 0, 0, 0, 0,

  14. 0, 1, 0, 0, 0,

  15. 0, 0, 1, 0, 0,

  16. 0, 0, 0, 1, 0 };

  17. /**

  18. * 按钮焦点改变

  19. */

  20. public final static OnFocusChangeListener buttonOnFocusChangeListener=new OnFocusChangeListener() {

  21. @Override

  22. public void onFocusChange(View v, boolean hasFocus) {

  23. if (hasFocus) {

  24. v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_SELECTED));

  25. v.setBackgroundDrawable(v.getBackground());

  26. }

  27. else

  28. {

  29. v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_NOT_SELECTED));

  30. v.setBackgroundDrawable(v.getBackground());

  31. }

  32. }

  33. };

  34. /**

  35. * 按钮触碰按下效果

  36. */

  37. public final static OnTouchListener buttonOnTouchListener=new OnTouchListener() {

  38. @Override

  39. public boolean onTouch(View v, MotionEvent event) {

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

  41. v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_SELECTED));

  42. v.setBackgroundDrawable(v.getBackground());

  43. }

  44. else if(event.getAction() == MotionEvent.ACTION_UP){

  45. v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_NOT_SELECTED));

  46. v.setBackgroundDrawable(v.getBackground());

  47. }

  48. return false;

  49. }

  50. };

  51. /**

  52. * 设置图片按钮获取焦点改变状态

  53. * @param inImageButton

  54. */

  55. public final static void setButtonFocusChanged(View inView)

  56. {

  57. inView.setOnTouchListener(buttonOnTouchListener);

  58. inView.setOnFocusChangeListener(buttonOnFocusChangeListener);

  59. }

使用时,调用方法

public final static void setButtonFocusChanged(View inView)

即可。

【原理】

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

以下为效果图,登陆按钮此时为获取焦点状态。

Android中ImageButton自定义按钮的按下效果的代码实现方法,附网上2种经典解决方法。

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

【以上为原创,转载请注明出处:http://blog.csdn.net/sytzz/archive/2010/06/16/5673662.aspx

*附docx文件下载】需要收费,您的支持就是我的动力,谢谢啦*

http://www.docin.com/DocinViewer-60345763-144.swf

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
iphone之使用讯飞语音sdk实现语音识别功能
1、首先下载讯飞sdk及文档:http://open.voicecloud.cn/(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fopen.voicecloud.cn%2F)2、学习里面的demo简单实现了一个小的语音识别功能先做一个简单demo,看看识别效果。注:语音识别必须联
Wesley13 Wesley13
3年前
Ubuntu Navicat for MySQL安装以及破解方案
首先上官网上下载LINUX版本: http://www.navicat.com/download/navicatformysql(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.navicat.com%2Fdownload)1\.下载navicat110\_m
Wesley13 Wesley13
3年前
4. Nginx模块
Nginx官方模块1.ngx\_http\_stub\_status\_modulehttp://nginx.org/en/docs/http/ngx\_http\_stub\_status\_module.html。(https://www.oschina.net/action/GoToLink?urlhttp%3A%2
Wesley13 Wesley13
3年前
P2P技术揭秘.P2P网络技术原理与典型系统开发
Modular.Java(2009.06)\.Craig.Walls.文字版.pdf:http://www.t00y.com/file/59501950(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.t00y.com%2Ffile%2F59501950)\More.E
Stella981 Stella981
3年前
Android Studio 升级和新版本下载
开源中国这里不时可以看到AndroidStudio升级的消息,但是去http://developer.android.com/(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fdeveloper.android.com%2F)只能下载到老版本不说,还不能自动更新。经过网上搜索发现需要
Wesley13 Wesley13
3年前
3D页面切换效果
最近看到魅族、小米等官网上面产品介绍页面做的很炫酷,于是找啊找,找到了类似的效果,大家可以看看学校学习,希望对你有用:Demo地址:http://www.slashie.org/space.js/demo2.html(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.slas
Easter79 Easter79
3年前
Swift项目兼容Objective
!456.jpg(http://static.oschina.net/uploads/img/201509/13172704_1KcG.jpg"1433497731426906.jpg")本文是投稿文章,作者:一叶(博客(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2F00red
Wesley13 Wesley13
3年前
Java中静态代码块、构造代码块、构造函数、普通代码块
转载来源http://www.cnblogs.com/ysocean/(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.cnblogs.com%2Fysocean%2F)1、静态代码块①、格式  在java类中(方法中不能存在静态代码块)使用s
Stella981 Stella981
3年前
DataGear 制作按行滚动的轮播表格数据可视化看板
通过DataGear(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fdatagear.tech%2F)的表格图表轮播设置项(1.13.0版本新增),可以轻松制作按行滚动的轮播表格数据可视化看板。首先,新建表格所需的数据集,以如下CSV数据集为例:name,v
Stella981 Stella981
3年前
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法参考文章:(1)Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.codeprj.com%2Fblo