自定义控件之开关效果Demo
来源:互联网 发布:阿里云香港服务器 翻墙 编辑:程序博客网 时间:2024/05/17 04:35
自定义控件之开关效果Demo
Button控件是我们经常用到的一种系统控件,由于其样式不怎么美观,很难满足我们的需求,这里我们就需要自定义一个自己想要的Button。
自定义Toggle
思路步骤说明:
- 首先准备两张背景图 :
,
; - 自定义一个类,继承View.重写它的构造方法
- 测量出控件的高宽
- 绘制出控件
- 给控件添加触摸事件,使控件能被拖拽
- 通过接口回调,是控件在开关状态能执行相应的逻辑
代码实现
具体步骤请看代码注释
public class ToggleButton extends View { private Bitmap mBackground; //按钮背景图 private Bitmap mSlidButton; //滑动层背景图 private int downX; //点击按下的X轴坐标 private int mDistance; //滑动距离距离 private int maxWidth; //能滑动的最大宽度 private OnToggleListener onToggleListener ; //接口的引用 public void setOnToggleListener(OnToggleListener onToggleListener) { this.onToggleListener = onToggleListener; } //获取两张背景图片,初始化能滑动的最大宽度 public ToggleButton(Context context, AttributeSet attrs) { super(context, attrs); mBackground = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background); mSlidButton = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button_background); maxWidth = mBackground.getWidth() - mSlidButton.getWidth(); } //测量控件的宽高 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(mBackground.getWidth(), mBackground.getHeight()); } //绘制控件 @Override protected void onDraw(Canvas canvas) { // super.onDraw(canvas); canvas.drawBitmap(mBackground, 0, 0, null); canvas.drawBitmap(mSlidButton, mDistance, 0, null); } //通过触摸事件获取拖拽的距离 @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = (int) event.getX(); //获取按下时的水平坐标 break; case MotionEvent.ACTION_MOVE: int moveX = (int) event.getX(); //移动后的水平坐标 int dx = moveX - downX; //移动的距离 downX = moveX; mDistance = mDistance + dx; //控制拖拽的范围 if (mDistance < 0 ) { mDistance = 0; } if (mDistance > maxWidth) { mDistance = maxWidth; } invalidate(); //重新绘制控制 break; case MotionEvent.ACTION_UP: //通过控件移动的位置设置控件的状态 if (mDistance >= maxWidth/2) { open(); }else { close(); } break; } return true; } //打开状态 private void close() { mDistance = 0; invalidate(); if (onToggleListener != null) { onToggleListener.onClose(); } } //关闭状态 private void open() { mDistance = maxWidth; invalidate(); if (onToggleListener != null) { onToggleListener.onOpen(); } } //定义接口 public interface OnToggleListener{ public void onClose(); public void onOpen(); }}
6.在外部引用这个自定义控件
xml布局文件
<com.example.togglebuttondemo.ToggleButton android:id="@+id/bt_toggle" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
Activity
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ToggleButton toggleButton = (ToggleButton) findViewById(R.id.bt_toggle); toggleButton.setOnToggleListener(new OnToggleListener() { @Override public void onOpen() { Toast.makeText(MainActivity.this, "Open", Toast.LENGTH_SHORT).show(); } @Override public void onClose() { Toast.makeText(MainActivity.this, "Close", Toast.LENGTH_SHORT).show(); } });}
0 0
- 自定义控件之开关效果Demo
- 自定义控件之自定义开关
- 13、自定义控件之开关
- 自定义控件之功能开关
- 自定义控件之滑动开关
- Android之自定义开关控件
- 自定义开关控件 点击和滑动效果
- 自定义控件一:实现开关效果SwitchButton
- [Qt]自定义控件之开关控件
- 自定义控件专题之二:滑动开关
- Android自定义控件之滑动开关
- Android进阶自定义控件之滑动开关
- Qt之自定义控件(开关按钮)
- Qt之自定义控件(开关按钮)
- 自定义View体验之开关控件
- Android自定义控件之状态开关
- Qt之自定义控件(开关按钮)
- 自定义控件:onDraw 方法实现仿 iOS 的开关效果
- 关于 iOS 开发者账号过期的总结
- MySQL for MAC 的安装配置,error解决方法小结
- 在IonicApp中调用微信进行登录
- 剑指offer
- unity-与Android交互(unity5、android studio)
- 自定义控件之开关效果Demo
- 动态规划初步
- 新博客地址
- 20160131AVI视频文件增加音量的步骤MKV(草稿)
- extern "c"用法解析
- VC判断指定进程是否存在IsExistProcess
- Mac上搭建基于GitHub的Hexo博客 (亲测可用)
- 自定义控件实现ListView下拉刷新和上拉加载
- 计算机网络基础(二)