android自定义滑动开关
2016-11-14 19:52
239 查看
自定义View一般分以下步骤:
测量:onMeasure 设置控件显示在屏幕上的宽高布局:onLayout 设置控件显示在屏幕上的位置(只有在自定义ViewGroup中才用到)
绘制:onDraw 控制显示在屏幕上的样子
而View和ViewGroup的区别
1.他们都需要进行测量操作2.ViewGroup主要是控制子view如何摆放,所以必须实现onLayout
View没有子view,所以不需要onLayout方法,但是必须实现onDraw
而自定义滑动开关这里继承View,效果图:
public class ToggleButton extends View {
private Bitmap slideBg; private Bitmap swithcBg; private ToggleState toggleState = ToggleState.OPEN; private int currentX = 0; private boolean isSliding = false; //自定义View在xml布局文件使用时才调用此构造方法 public ToggleButton(Context context, AttributeSet attrs) { super(context, attrs); } //view在java代码中动态生成,调用此构造方法 public ToggleButton(Context context) { super(context); } /** * 设置滑动块图片 * * @param slideBackgroudResourec */ public void setSlideBackgroudResourec(int slideBackgroudResourec) { slideBg = BitmapFactory.decodeResource(getResources(), slideBackgroudResourec); } /** * 设置滑动背景图 * * @param switchBackgroudResourec */ public void setSwitchBackgroudResourec(int switchBackgroudResourec) { swithcBg = BitmapFactory.decodeResource(getResources(), switchBackgroudResourec); } @Override public boolean onTouchEvent(MotionEvent event) { currentX = (int) event.getX(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: isSliding = true; break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: isSliding = false; //如果滑动点大于背景图一半,此时状态为开 int centerX = swithcBg.getWidth()/2; if (currentX > centerX){ if (toggleState != ToggleState.OPEN){ toggleState = ToggleState.OPEN; if (listner != null){ listner.onToggleStateChange(toggleState); } } }else{ if (toggleState != ToggleState.CLOSE){ toggleState = ToggleState.CLOSE; if (listner != null){ listner.onToggleStateChange(toggleState); } } } break; } //刷新控件让系统调用onDraw方法 invalidate(); return true; } //设置当前控件显示在屏幕的宽高 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(swithcBg.getWidth(), swithcBg.getHeight()); } //设置当前控件显示在屏幕的样子 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); /** * 1.绘制的背景图 * 2.left:屏幕的左边X座标 * 3.top:屏幕顶端的y座标 * 4.画笔工具,需要显示颜色和画笔大小才用 */ canvas.drawBitmap(swithcBg, 0, 0, null); if (isSliding){ int left = currentX - slideBg.getWidth() / 2; if (left <= 0) left = 0; if (left > swithcBg.getWidth() - slideBg.getWidth()){ left = swithcBg.getWidth() - slideBg.getWidth(); } canvas.drawBitmap(slideBg, left, 0, null); }else{ if (toggleState == ToggleState.OPEN) { canvas.drawBitmap(slideBg, swithcBg.getWidth() - slideBg.getWidth(), 0, null); } else { canvas.drawBitmap(slideBg, 0, 0, null); } } } public void setToggleState(ToggleState toggleState) { this.toggleState = toggleState; } public enum ToggleState { OPEN, CLOSE } private onToggleStateChangeListner listner; public void setOnToggleStateChangeListner(onToggleStateChangeListner listner){ this.listner = listner; } public interface onToggleStateChangeListner{ void onToggleStateChange(ToggleState state); }
}
相关文章推荐
- android自定义滑动开关控件,适合所有的android系统
- Android 三档自定义滑动开关,禁止点击功能的实现,用默认的seekbar组件实现
- android自定义滑动开关控件,适合所有的android系统 《转载》
- Android_自定义滑动开关
- Android自定义控件之滑动开关
- 【Android界面实现】自定义滑动开关控件的实现与使用
- 【视图控件篇】自定义Android控件之IOS滑动开关模拟详解
- 【Android进阶】Android自定义滑动开关控件,适合所有的android系统
- Android自定义控件之滑动开关
- Android开发进阶自定义控件之滑动开关实现方法【附demo源码下载】
- android三档自定义滑动开关,禁止点击功能的实现,用默认的seekbar组件实现
- Android-自定义可滑动开关控件之SlidingSwitchView
- Android自定义View-------IOS风格的滑动开关
- android自定义滑动开关组件【转】
- Android自定义View示例(二)—滑动开关
- android自定义View之滑动开关SlideButton
- Android自定义控件之旅(一)滑动开关
- 自定义的滑动开关适用所有的Android系统
- Android自定义开关(可滑动,点击)
- android自定义滑动开关控件,适合所有的android系统