[android] 切换按钮-自定义控件-拖动效果
生活随笔
收集整理的這篇文章主要介紹了
[android] 切换按钮-自定义控件-拖动效果
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
重寫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);}/*** 計算大小*/@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(bitmapBackground.getWidth(), bitmapBackground.getHeight());}//當前狀態private boolean currentState=false;//滑動按鈕的當前leftprivate float slideBtnLeft=0;/*** 繪制view*/@Overrideprotected void onDraw(Canvas canvas) {//繪制背景canvas.drawBitmap(bitmapBackground, 0, 0, paint);//繪制滑動按鈕canvas.drawBitmap(bitmapBtn, slideBtnLeft, 0, paint);}private boolean isDrag=false;/*** 點擊事件*/@Overridepublic void onClick(View v) {//解決與移動事件的沖突if(!isDrag){currentState = !currentState;flushState();}}private int lastX;/*** 觸摸事件*/private int firstX;@Overridepublic 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();} }?
總結
以上是生活随笔為你收集整理的[android] 切换按钮-自定义控件-拖动效果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第93课:SparkStreaming
- 下一篇: HoloLens开发手记 - 手势输入