自定义ToggleButton

本文介绍了一个自定义的ToggleButton控件的实现方式。该控件通过滑动改变开关状态,并提供了打开与关闭两种状态。文章详细展示了ToggleButton类的代码,包括初始化、绘制、触摸事件处理及监听器设置等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ToggleButton .java

public class ToggleButton extends View{

    private ToggleState toggleState;
    private Bitmap switchBg;
    private Bitmap slideBg;
    private int currentX;
    private boolean isSliding = false;

    public ToggleButton(Context context) {
        super(context);
    }

    public ToggleButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ToggleButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    public void setToggleState(ToggleState toggleState) {
        this.toggleState = toggleState;
    }

    public enum ToggleState{
        Open,Close
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(switchBg.getWidth(), switchBg.getHeight());
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int left = 0;
        canvas.drawBitmap(switchBg,0,0,null);
        if(isSliding){
            left  = currentX-slideBg.getWidth()/2;
            if(left<0){
                left = 0;
            }else if(left>switchBg.getWidth()-slideBg.getWidth()){
                left = switchBg.getWidth()-slideBg.getWidth();
            }
        }else{
            if(toggleState == ToggleState.Open){
                left = switchBg.getWidth()-slideBg.getWidth();
            }else{
                left = 0;
            }
        }

        canvas.drawBitmap(slideBg,left,0,null);
    }

    public void setSlideBackgroundResource(int slideBackgroundResource) {
        switchBg  = BitmapFactory.decodeResource(getResources(), slideBackgroundResource);
    }

    public void setSwitchBackgroundResource(int switchBackgroundResource) {
        slideBg = BitmapFactory.decodeResource(getResources(), switchBackgroundResource);
    }


    @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;
                if(currentX<switchBg.getWidth()/2){
                    if(toggleState != ToggleState.Close){
                        toggleState = ToggleState.Close;
                        if(listener!=null){
                            listener.OnToggleStateChange(toggleState);
                        }
                    }

                }else{
                    if(toggleState != ToggleState.Open){
                        toggleState = ToggleState.Open;
                        if(listener!=null){
                            listener.OnToggleStateChange(toggleState);
                        }
                    }
                }


                break;
        }
        invalidate();
        return true;
    }

    public void setOnToggleStateChangeListener(OnToggleStateChangeListener listener) {
        this.listener = listener;
    }

    private OnToggleStateChangeListener listener;
    public interface OnToggleStateChangeListener{
        public void OnToggleStateChange(ToggleState toggleState);
    }
}

MainActivity.java

public class MainActivity extends Activity {
    private ToggleButton toggleBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toggleBtn = (ToggleButton) findViewById(R.id.toggleBtn);
        toggleBtn.setSlideBackgroundResource(R.drawable.switch_background);
        toggleBtn.setSwitchBackgroundResource(R.drawable.slide_button);
        toggleBtn.setToggleState(ToggleButton.ToggleState.Close);
        toggleBtn.setOnToggleStateChangeListener(new ToggleButton.OnToggleStateChangeListener() {
            @Override
            public void OnToggleStateChange(ToggleButton.ToggleState toggleState) {
                Toast.makeText(MainActivity.this, toggleState== ToggleButton.ToggleState.Close?"关闭":"开启" , Toast.LENGTH_SHORT).show();
            }
        });
    }
}

这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值