1. 程式人生 > >android 自定義SwitchButton 開關狀態

android 自定義SwitchButton 開關狀態

//自定義類繼承View

public class SwitchButton extends View {

    private Bitmap back;
    private Bitmap slide;
    private int currentX;//處理事件
    private boolean isTouch;//判斷是否在觸控狀態
    private boolean state;//開關的狀態
    private OnStateChangeListener onStateChangeListener;//監聽物件 介面物件
    //new的時候呼叫
    public SwitchButton(Context context) {
        this(context,null);
    }
    //使用style的使用呼叫
    public SwitchButton(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }
    //寫在佈局檔案裡面的時候呼叫
    public SwitchButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //初始化兩張圖片
        //將資源 檔案轉成Bitmap物件
        //getResources() 包含圖片資源的資源物件
        //R.drawable.background 圖片資源的id
        back = BitmapFactory.decodeResource(getResources(), R.drawable.background);
        slide = BitmapFactory.decodeResource(getResources(), R.drawable.slide);

    }
    //將圖片繪製到控制元件上面

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //繪製
        //引數1.圖片物件
        //引數2.x軸的開始位置
        //引數3.y軸的開始位置
        //引數4.畫筆
        canvas.drawBitmap(back,0,0,null);
        int left = 0;
            if(isTouch){
                //滑塊和手指一起移動
                //判斷是否在觸控狀態
                left = currentX;//修正位置
                left = currentX - slide.getWidth() / 2;
                //處理邊界問題
                if(left<0){
                    left=0;
                }
                if(left>back.getWidth()-slide.getWidth()){
                    left=back.getWidth()-slide.getWidth();
                }
                canvas.drawBitmap(slide, left, 0, null);//滑塊兒
            }else{
                //根據開關的狀態繪製滑塊
                if(state){
                    //getWidth()---背景的寬度
                    left=back.getWidth()-slide.getWidth();
                }else{
                    left=0;
                }
                canvas.drawBitmap(slide, left, 0, null); //滑塊兒
            }

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
         super.onTouchEvent(event);
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                currentX = (int) event.getX();
                isTouch=true;
                break;
            case MotionEvent.ACTION_MOVE:
                currentX = (int) event.getX();
                isTouch=true;
                break;
            case MotionEvent.ACTION_UP:
                isTouch=false;
                currentX = (int) event.getX();
                //當手指擡起的時候,應該判斷一下滑塊兒的位置,然後設定開關的狀態
                //currentX 在中間位置的那邊
                int centerX = back.getWidth()/2;//獲取圖片的寬度
                //如果擡起時的位置大於圖片寬度的一半
                if(currentX>centerX){
                    state = true;
                }else{
                    state=false;
                }
                //呼叫接口裡的方法
                onStateChangeListener.onStateChange(state);
               break;
        }
        //重新繪製
        invalidate();
        return true;
    }

    //將控制元件的尺寸重新設定一下

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //根據背景圖設定控制元件的寬高
        setMeasuredDimension(back.getWidth(),back.getHeight());//將需要的寬高設定進去
    }


    //介面回撥
    public interface OnStateChangeListener{
        void onStateChange(boolean state);
    }
    //提供一個外部訪問的方法
    public void setOnStateChange(OnStateChangeListener onStateChangeListener){
        this.onStateChangeListener = onStateChangeListener;
    }

    //給外部提供一個設定開關的方法
    public void setState(boolean state) {
        this.state = state;
    }
    public boolean getState(){
        return state;
    };
}
2.MainActivity
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SwitchButton sb=findViewById(R.id.sb);
        //在外部設定監聽
        sb.setOnStateChange(new SwitchButton.OnStateChangeListener() {
            @Override
            public void onStateChange(boolean state) {
                Toast.makeText(MainActivity.this,"當前狀態---"+state, Toast.LENGTH_SHORT).show();
            }
        });
    }
}
3.佈局檔案
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.bwie.day04_switchbutton.MainActivity">

   <com.bwie.day04_switchbutton.views.SwitchButton
       android:id="@+id/sb"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content" />

</LinearLayout>