android自定义滑动开关

来源:互联网 发布:决战武林进阶数据地煞8 编辑:程序博客网 时间:2024/05/04 15:38

自定义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);}@Overridepublic 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;}//设置当前控件显示在屏幕的宽高@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    setMeasuredDimension(swithcBg.getWidth(), swithcBg.getHeight());}//设置当前控件显示在屏幕的样子@Overrideprotected 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);}

}

0 0
原创粉丝点击