[android] 切换按钮-自定义控件-拖动效果详解手机开发

 

重写ViewonTouchEvent()方法,传递进来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

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论