重寫View的onTouchEvent()方法,傳遞進來MotionEvent對象
調用MotionEvent對象的getAction()方法,獲取當前動作
switch判斷一下當前動作
事件為MotionEvent.ACTION_DOWN是手指第一次觸摸屏幕
事件為MotionEvent.ACTION_MOVE是手指在屏幕上移動
事件為MotionEvent.ACTION_UP是手指離開屏幕
當手指觸摸到屏幕
定義手指最后的坐標lastX
調用MotionEvent對象的getX() 方法,得到lastX的值
當手指在屏幕上移動
定義手指橫向移動的距離dis
調用getX()-lastX就是移動的距離
定義滑動按鈕的左邊就是這個移動的距離
判斷slideBtnLeft位於合理的位置,0到背景圖的寬度-滑動按鈕的寬度
調用invalidate()方法,刷新視圖
onClick事件和onTouchEvent是有沖突
定義一個標志isDrag變量,如果有拖動發生,就把這個變量賦值true
在onCllick()方法里面對這個變量進行判斷
當手指抬起的時候
判斷當前slideBtnLeft來確定當前按鈕是開還是關的狀態
slideBtnLeft比較 maxLeft的一半就能判斷當前狀態
package com.tsh.myswitchbtn; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; public class MyToggleBtn extends View implements OnClickListener { //背景圖片 private Bitmap bitmapBackground; //按鈕圖片 private Bitmap bitmapBtn; private Paint paint; /** * 布局文件中使用 * @param context * @param attrs */ public MyToggleBtn(Context context, AttributeSet attrs) { super(context, attrs); initView(); } /** * 初始化view */ private void initView() { bitmapBackground=BitmapFactory.decodeResource(getResources(), R.drawable.switch_background); bitmapBtn=BitmapFactory.decodeResource(getResources(), R.drawable.slide_button); paint=new Paint(); paint.setAntiAlias(true); //點擊事件 setOnClickListener(this); } /** * 計算大小 */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(bitmapBackground.getWidth(), bitmapBackground.getHeight()); } //當前狀態 private boolean currentState=false; //滑動按鈕的當前left private float slideBtnLeft=0; /** * 繪制view */ @Override protected void onDraw(Canvas canvas) { //繪制背景 canvas.drawBitmap(bitmapBackground, 0, 0, paint); //繪制滑動按鈕 canvas.drawBitmap(bitmapBtn, slideBtnLeft, 0, paint); } private boolean isDrag=false; /** * 點擊事件 */ @Override public void onClick(View v) { //解決與移動事件的沖突 if(!isDrag){ currentState = !currentState; flushState(); } } private int lastX; /** * 觸摸事件 */ private int firstX; @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); switch(event.getAction()){ //手指按下 case MotionEvent.ACTION_DOWN: firstX=lastX=(int) event.getX(); isDrag=false; break; //手指移動 case MotionEvent.ACTION_MOVE: //解決與點擊事件沖突 if(Math.abs(event.getX()-firstX)>5){ isDrag=true; } int dis=(int) event.getX()-lastX; slideBtnLeft=slideBtnLeft+dis; lastX=(int) event.getX(); break; //手指抬起 case MotionEvent.ACTION_UP: if(isDrag){ int maxLeft = bitmapBackground.getWidth() - bitmapBtn.getWidth(); if (slideBtnLeft >= maxLeft / 2) { currentState = true; } else { currentState = false; } flushState(); } break; } flushView(); return true; } /** * 刷新狀態 */ private void flushState() { if (currentState == true) { slideBtnLeft = bitmapBackground.getWidth() - bitmapBtn.getWidth(); } else { slideBtnLeft = 0; } invalidate(); } /** * 刷新視圖 */ private void flushView() { int maxLeft=bitmapBackground.getWidth()-bitmapBtn.getWidth(); slideBtnLeft=(slideBtnLeft>0) ? slideBtnLeft : 0; slideBtnLeft=(slideBtnLeft<maxLeft) ? slideBtnLeft:maxLeft; invalidate(); } }