ToggleButton 自定義控件的哪些坑

更具項目需求,我需要寫一個自定義的選擇器, 自己寫有底氣,用系統的togglebutton。。。。。。我宣簡潔的啦(臺灣腔讀)··········

下面是我寫的自定義控件:

        注意:當設置回調函數的時候,要判斷接口是否是null,因爲如果不判斷的話,會出很多問題。

                    如在activity中使用該控件,app會直接死掉。fragment中使用該控件的話,會直接導致fragment重新加載。。。。   

        最關鍵的是   手機啥信息都不會反饋給你  。。淚奔大哭

public class ToggleButton extends View {

    private Bitmap backgroundPic = null;
    private Bitmap slideBtn;
    private Paint paint;
    private float slideBtn_letf = 0;
    private static boolean currentState = false ;//開關狀態 true爲打開
    private boolean isDrag = false; //是否是拖拽
    private OnToggleStateChangedListener onToggleStateChangedListener = null;


    public boolean isCurrentState() {
        return currentState;
    }

    public void setCurrentState(boolean currentState) {
        this.currentState = currentState;
    }

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

    private void initView() {

        backgroundPic = BitmapFactory.decodeResource(getResources() , R.mipmap.switch_background);
        slideBtn = BitmapFactory.decodeResource(getResources() ,R.mipmap.slide_button);

        paint = new Paint();
        paint.setAntiAlias(true);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        setMeasuredDimension(backgroundPic.getWidth() ,backgroundPic.getHeight());
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.save();

        canvas.drawBitmap(backgroundPic , 0 , 0 , paint);
        canvas.drawBitmap(slideBtn , slideBtn_letf , 0 , paint);

        canvas.restore();
    }

    private void flushState(){
        if(currentState){
            slideBtn_letf = backgroundPic.getWidth() - slideBtn.getWidth();
        }else{
            slideBtn_letf = 0;
        }
//        onToggleStateChangedListener.getCurrentState(currentState);
        invalidate();
    }

    private void flushView(){
        //對slideBtn的值進行判斷,確保其在合理的位置

        int maxLeft = backgroundPic.getWidth() - slideBtn.getWidth();
        slideBtn_letf = (slideBtn_letf > 0) ? slideBtn_letf : 0;
        slideBtn_letf = (slideBtn_letf < maxLeft) ? slideBtn_letf :maxLeft;

//        invalidate();
    }

    private int firstX;
    private int lastX;

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                lastX = firstX = (int) event.getX();
                isDrag = false;
                break;
            case MotionEvent.ACTION_MOVE:
                if(Math.abs(event.getX() - firstX) > 5){
                    int dis = (int) (event.getX() - lastX);
                    slideBtn_letf += dis;
                    isDrag = true;
                }
                break;
            case MotionEvent.ACTION_UP:
                int maxLetf = backgroundPic.getWidth() - slideBtn.getWidth();
                if(slideBtn_letf > maxLetf /2){
                    currentState = true;
                    if(onToggleStateChangedListener != null){
                        onToggleStateChangedListener.getCurrentState(currentState);
                    }
                }else{
                    currentState = false;
                    if(onToggleStateChangedListener != null){
                        onToggleStateChangedListener.getCurrentState(currentState);
                    }
                }

                flushState();

                break;
        }

        flushView();


        return true;

    }


    public interface OnToggleStateChangedListener{
      public void  getCurrentState(boolean currentState);
    }

    public void setOnToggleStateChangeListener(OnToggleStateChangedListener onToggleStateChangeListener){
        this.onToggleStateChangedListener = onToggleStateChangeListener;
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章