Android自定义实现简单开关

在这里插入图片描述
在这里插入图片描述
这里还有个点
MainActivity:

public class MainActivity extends Activity implements WiperSwitch.OnChangedListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //实例化WiperSwitch
        WiperSwitch wiperSwitch = (WiperSwitch)findViewById(R.id.wiperSwitch);

        //设置初始状态为false
        wiperSwitch.setChecked(false);

        //设置监听
        wiperSwitch.setOnChangedListener(this);
    }


    @Override
    public void OnChanged(WiperSwitch wiperSwitch, boolean checkState) {
        if (checkState){
            Toast.makeText(MainActivity2.this,"开关开启了",Toast.LENGTH_SHORT).show();
        }else if (!checkState){
            Toast.makeText(MainActivity2.this,"开关关闭了",Toast.LENGTH_SHORT).show();
        }
    }

}

xml:

<com.android.test.WiperSwitch
            android:id="@+id/wiperSwitch"
            android:layout_width="50dp"
            android:layout_height="30dp"
            android:layout_gravity="center"
            />

自定义的WiperSwitch:

public class WiperSwitch extends View implements View.OnTouchListener {
    private Bitmap bg_on, bg_off, slipper_btn;
    /**
     * 按下时的x和当前的x
     */
    private float downX, nowX;
 
    /**
     * 记录用户是否在滑动
     */
    private boolean onSlip = false;
 
    /**
     * 当前的状态
     */
    private boolean nowStatus = false;
 
    /**
     * 监听接口
     */
    private OnChangedListener listener;
 
 
    public WiperSwitch(Context context) {
        super(context);
        init();
    }
 
    public WiperSwitch(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
 
    public void init(){
        //载入图片资源
        bg_on = BitmapFactory.decodeResource(getResources(), R.drawable.kai);
        bg_off = BitmapFactory.decodeResource(getResources(), R.drawable.guan);
        slipper_btn = BitmapFactory.decodeResource(getResources(), R.drawable.dian);
 
        setOnTouchListener(this);
    }
 
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Matrix matrix = new Matrix();
        Paint paint = new Paint();
        float x = 0;
 
        //根据nowX设置背景,开或者关状态
        if (nowX < (bg_on.getWidth()/2)){
            canvas.drawBitmap(bg_off, matrix, paint);//画出关闭时的背景
        }else{
            canvas.drawBitmap(bg_on, matrix, paint);//画出打开时的背景
        }
        if (onSlip) {//是否是在滑动状态,
            if(nowX >= bg_on.getWidth())//是否划出指定范围,不能让滑块跑到外头,必须做这个判断
                x = bg_on.getWidth() - slipper_btn.getWidth()/2;//减去滑块1/2的长度
            else
                x = nowX - slipper_btn.getWidth()/2;
        }else {
            if(nowStatus){//根据当前的状态设置滑块的x值
                x = bg_on.getWidth() - slipper_btn.getWidth();
            }else{
                x = 0;
            }
        }
 
        //对滑块滑动进行异常处理,不能让滑块出界
        if (x < 0 ){
            x = 0;
        }
        else if(x > bg_on.getWidth() - slipper_btn.getWidth()){
            x = bg_on.getWidth() - slipper_btn.getWidth();
        }
 
        //画出滑块
        canvas.drawBitmap(slipper_btn, x , 0, paint);
    }
 
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()){
            case MotionEvent.ACTION_DOWN:{
                if (event.getX() > bg_off.getWidth() || event.getY() > bg_off.getHeight()){
                    return false;
                }else{
                    onSlip = true;
                    downX = event.getX();
                    nowX = downX;
                }
                break;
            }
            case MotionEvent.ACTION_MOVE:{
                nowX = event.getX();
                break;
            }
            case MotionEvent.ACTION_UP:{
                onSlip = false;
                if(event.getX() >= (bg_on.getWidth()/2)){
                    nowStatus = true;
                    nowX = bg_on.getWidth() - slipper_btn.getWidth();
                }else{
                    nowStatus = false;
                    nowX = 0;
                }
 
                if(listener != null){
                    listener.OnChanged(WiperSwitch.this, nowStatus);
                }
                break;
            }
        }
        //刷新界面
        invalidate();
        return true;
    }
 
 
 
    /**
     * 为WiperSwitch设置一个监听,供外部调用的方法
     */
    public void setOnChangedListener(OnChangedListener listener){
        this.listener = listener;
    }
 
 
    /**
     * 设置滑动开关的初始状态,供外部调用
     */
    public void setChecked(boolean checked){
        if(checked){
            nowX = bg_off.getWidth();
        }else{
            nowX = 0;
        }
        nowStatus = checked;
    }
 
 
    /**
     * 回调接口
     *
     */
    public interface OnChangedListener {
        public void OnChanged(WiperSwitch wiperSwitch, boolean checkState);
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值