更具項目需求,我需要寫一個自定義的選擇器, 自己寫有底氣,用系統的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; } }