android自定义按钮示例(重写imagebutton控件实现图片按钮)
在Android开发中,自定义控件是提升应用用户体验和界面个性化的重要手段。在这个示例中,我们看到开发者重写了`ImageButton`控件,创建了一个名为`CmButton`的自定义图片按钮。这个自定义控件的主要特点是当按钮被触摸时,其图像会变为灰度效果,提供了一种视觉反馈,让用户知道按钮已被按下。 我们来看`CmButton`类的构造方法。这里设置了`OnTouchListener`和`OnFocusChangeListener`监听器,确保在按钮获得焦点或被触摸时能够触发相应的处理逻辑。 ```java public CmButton(Context context) { super(context); this.setOnTouchListener(this); this.setOnFocusChangeListener(this); } public CmButton(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.imageButtonStyle); this.setOnTouchListener(this); this.setOnFocusChangeListener(this); } public CmButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setFocusable(true); this.setOnTouchListener(this); this.setOnFocusChangeListener(this); } ``` 接下来,`onFocusChange()`方法负责处理按钮焦点变化时的逻辑。当按钮获得焦点时,通过`ColorMatrix`对象设置饱和度为0,使图像变为灰度;反之,如果失去焦点,则清除颜色过滤器,恢复原图像。 ```java @Override public void onFocusChange(View v, boolean hasFocus) { ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0); if (hasFocus) { ((ImageButton) v).getDrawable().setColorFilter(new ColorMatrixColorFilter(cm)); } else { ((ImageButton) v).getDrawable().clearColorFilter(); } } ``` `onTouch()`方法则处理按钮被触摸时的事件。当用户按下按钮(`ACTION_DOWN`),同样使用灰度效果;当用户松开按钮(`ACTION_UP`),清除颜色过滤器,恢复原图。 ```java @Override public boolean onTouch(View v, MotionEvent event) { ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0); if (event.getAction() == MotionEvent.ACTION_DOWN) { ((ImageButton) v).getDrawable().setColorFilter(new ColorMatrixColorFilter(cm)); } else if (event.getAction() == MotionEvent.ACTION_UP) { ((ImageButton) v).getDrawable().clearColorFilter(); } return false; } ``` 在布局文件中,我们可以看到`<me.henji.widget.CmButton>`标签的使用,表明这个自定义控件已经被正确地引入到项目中,并且可以像使用原生`ImageButton`那样进行配置。 ```xml <me.henji.widget.CmButton android:id="@+id/btn_login" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/ic_login" /> ``` 这个示例展示了如何通过继承`ImageButton`并重写相关方法来自定义按钮的行为。开发者可以通过这种方法实现各种个性化的交互效果,例如改变颜色、添加动画等,以满足特定的设计需求。在实际项目中,这种自定义控件的使用可以提高代码的复用性,降低维护成本,同时提升应用的整体质量。
- 粉丝: 3
- 资源: 992
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助