重写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(); } }
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/5401.html