android自定义滑动开关

自定义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);
}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值