Android自定義SwitchButton左右滑動開關按鈕控制元件
阿新 • • 發佈:2019-02-11
以前在專案中做過一個類似滑動開關的、但是可惜的是隻能用點的方式去操作、總感覺不完美、在網上查閱資料後、稍稍的改進了一下、添加了滑動事件、封裝了一個 SwitchButton 的類、分享給大家、希望對大家有用
MySwitchButton.java
public class MySwitchButton extends View implements OnTouchListener { private Bitmap switchOnBkg; // 開關開啟時的背景 private Bitmap switchOffBkg; // 開關關閉時的背景 private Bitmap slipSwitchButton; // 滑動開關的圖片 private Rect onRect; // 左半邊矩形 private Rect offRect; // 右半邊矩形 private boolean isSlipping = false; // 是否正在滑動 // 當前開關的狀態,true表示開啟,flase表示關閉 private boolean isSwitchOn = false; private float previousX; // 手指按下時的水平座標x private float currentX; // 當前的水平座標X // 開關監聽器 private ArrayList<OnSwitchListener> onSwitchListenerList; public MySwitchButton(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { this.setOnTouchListener(this); // 設定觸控監聽器 onSwitchListenerList = new ArrayList<OnSwitchListener>(); } public void setImageResource(int switchBkg, int slipBtn) { switchOnBkg = BitmapFactory.decodeResource(this .getResources(), switchBkg); switchOffBkg = BitmapFactory.decodeResource(this .getResources(), switchBkg); slipSwitchButton = BitmapFactory.decodeResource(this .getResources(), slipBtn); // 右半邊rect,滑動開關在右半邊時表示開啟 onRect = new Rect(switchOnBkg.getWidth() - slipSwitchButton.getWidth(), 0, switchOnBkg.getWidth(), slipSwitchButton.getHeight()); // 左半邊rect,滑動開關在左半邊時表示關閉 offRect = new Rect(0, 0, slipSwitchButton.getWidth(), slipSwitchButton.getHeight()); } public void setSwitchState(boolean switchState) { this.isSwitchOn = switchState; this.invalidate(); } public boolean getSwitchState() { return this.isSwitchOn; } public void setOnSwitchStateListener(OnSwitchListener listener){ onSwitchListenerList.add(listener); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Matrix matrix = new Matrix(); Paint paint = new Paint(); float leftSlipBtnX; // 滑動按鈕的左邊座標 System.out.println("currentX=" currentX " switchOnBkg.width=" switchOnBkg.getWidth()); canvas.drawBitmap(switchOnBkg, matrix, paint); if (isSlipping) { // 如果正在滑動 if (currentX > switchOnBkg.getWidth()) { leftSlipBtnX = switchOnBkg.getWidth() - slipSwitchButton.getWidth(); } else { leftSlipBtnX = currentX - slipSwitchButton.getWidth(); } } else { if (isSwitchOn) { leftSlipBtnX = switchOnBkg.getWidth() - slipSwitchButton.getWidth(); } else { leftSlipBtnX = 0; } } if (leftSlipBtnX < 0) { leftSlipBtnX = 0; } else if (leftSlipBtnX > switchOnBkg.getWidth() - slipSwitchButton.getWidth()) { leftSlipBtnX = switchOnBkg.getWidth() - slipSwitchButton.getWidth(); } canvas.drawBitmap(slipSwitchButton, leftSlipBtnX, 0, paint); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(switchOnBkg.getWidth(), switchOnBkg.getHeight()); } @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_MOVE: currentX = event.getX(); break; case MotionEvent.ACTION_DOWN: isSlipping = true; break; case MotionEvent.ACTION_UP: isSlipping = false; boolean previousState = isSwitchOn; if (event.getX() > (switchOnBkg.getWidth() / 2)) { isSwitchOn = true; } else { isSwitchOn = false; } if(previousState != isSwitchOn){ if(onSwitchListenerList.size() > 0){ for(OnSwitchListener listener : onSwitchListenerList){ listener.onSwitched(isSwitchOn); } } } break; default: break; } this.invalidate(); return true; } }
最後貼上Demo原始碼、有興趣的哥們可以下載看看、Demo裡面圖片可能跟你的專案風格不搭配、可以自己改一下圖片就ok了哈
感謝你的訪問、祝您愉快、有任何疑問或要獲取更多程式碼、可以在下面進行評論哈
(以上均屬轉載)