自定义开关

本文介绍了一个自定义的Android View组件——开关按钮的实现方法。该组件通过滑动改变按钮状态,并能够触发回调通知主程序状态变化。文章详细展示了如何使用Bitmap进行绘制、处理触摸事件以实现滑动效果,并提供了完整的代码示例。

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

自定义view

public class cusbutton extends View{

    private Bitmap slide_button;
    private Bitmap button_background;
    private boolean state;
    private int courrent;
    private boolean isSliding;
    OnButtonChange onButtonChange;
    public cusbutton(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(button_background, 0, 0, null);
        int onleft = button_background.getWidth() - slide_button.getWidth();
        if (isSliding) {
            int left = courrent - slide_button.getWidth() / 2;
            if (left < 0) {
                left = 0;
            } else if (left > onleft) {
                left = onleft;
            }
            canvas.drawBitmap(slide_button, left, 0, null);
        } else {

            if (state) {
                canvas.drawBitmap(slide_button, onleft, 0, null);
            } else {
                canvas.drawBitmap(slide_button, 0, 0, null);
            }
        }
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {

        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                isSliding = false;
                courrent = (int) event.getX();
                break;
            case MotionEvent.ACTION_MOVE:
                courrent = (int) event.getX();
                break;
            case MotionEvent.ACTION_UP:
                isSliding = true;
                courrent = (int) event.getX();
                boolean flag=courrent>button_background.getWidth()/2;
                if (flag != state&&onButtonChange!=null) {
                    onButtonChange.OnButtonstate(flag);
                }
                if (courrent<button_background.getWidth()/2){
                    state=false;
                }else {
                    state=true;
                }
                break;
        }
        invalidate();
        return true;
    }

    public void setstate(boolean b) {
        state = b;
    }

    public void setButtonBackGround(int switch_background) {
        button_background = BitmapFactory.decodeResource(getResources(), switch_background);
    }

    public void setButtonSliding(int slide_button_background) {
        slide_button = BitmapFactory.decodeResource(getResources(), slide_button_background);

    }

    public void setOnButtonChange(OnButtonChange ButtonChange) {
        onButtonChange = ButtonChange;
    }
}

接口

public interface OnBtnChange {
    void OnBtnState(boolean state);
}

 主类 

public class MainActivity extends AppCompatActivity {

    private cusbutton myButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myButton = findViewById(R.id.myButton);
        myButton.setstate(false);
        myButton.setButtonBackGround(R.drawable.switch_background);
        myButton.setButtonSliding(R.drawable.slide_button_background);
        myButton.setOnButtonChange(new OnButtonChange() {
            @Override
            public void OnButtonstate(boolean state) {
                if (state){
                    Toast.makeText(MainActivity.this,"开关已开",Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(MainActivity.this,"开关已关",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值