android提供的手势检测类不支持多点手势的检测,这个挺奇怪的。而工作中经常会有手势放大缩小之类的需求,如果每次要在自己在实现类里
判断手势,一来代码冗余不利于维护,二来判断手势的代码有时候写起来还比较费劲的(你看android手势检测类就知道了,那么多的变量)。
我想要的只是在一个手势的回调方法里实现自己的业务代码,多省事。
基于以上的原因还是封装一个吧,这样就一劳永逸了。实现的原理是:
鉴于原来就有手势检测类,google大神写的肯定比我等靠谱和高效,所以能拿来用的就继续用,不能的就自己实现了,
原本的手势检测类里提供了很多常用的回调,比如:点击,长按,双击,滑动等等。
新提供了四个新的接口放大、缩小、向左滑、向右滑,主要是我的业务里用到了这几个哈哈。。。
使用方法跟GestureDetector一样,详见demo。
好吧!小菜鸟一个如果代码写的不好请批评指正,谢谢!
demo下载地址:http://download.youkuaiyun.com/detail/q384415054/7015103
贴一下主要的代码:
/**
自己实现的监听器
*/
public interface CustomGestureListener {
public abstract boolean onZoomUp(MotionEvent ev);
public abstract boolean onZoomDown(MotionEvent ev);
public abstract boolean onMoveLef(MotionEvent ev);
public abstract boolean onMoveRight(MotionEvent ev);
}
/**
检测手势的主要方法,很简单吧,主要还是靠系统的手势检测类
*
public boolean onDetectorGesture(MotionEvent ev){
if (ev == null) {
return false;
}
boolean isConsumed = false;
switch (ev.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_POINTER_DOWN:
mIsMultiple = true;
mLastDistance = calculateDistance(ev);
System.out.println("ACTION_POINTER_DOWN_distance0=" + mLastDistance);
break;
case MotionEvent.ACTION_MOVE:
if (mIsMultiple) {
float distance = calculateDistance(ev);
// System.out.println("distance=" + distance + ", mLastDistance=" + mLastDistance);
if (distance - mLastDistance > 50f) {
mLastDistance = distance;
isConsumed = mGestureListener.onZoomUp(ev);
} else if (distance - mLastDistance < -50f) {
mLastDistance = distance;
isConsumed = mGestureListener.onZoomDown(ev);
}
}
break;
case MotionEvent.ACTION_UP:
System.out.println("ACTION_UP");
mIsMultiple = false;
break;
}
return isConsumed ? isConsumed : mGestureDetector.onTouchEvent(ev);
}
实现了系统的监听和自定义的监听器的抽象类
*/
public abstract class AbsGestureListener extends SimpleOnGestureListener implements CustomGestureListener{
@Override
public boolean onMoveLef(MotionEvent ev) {
return false;
}
@Override
public boolean onMoveRight(MotionEvent ev) {
return false;
}
@Override
public boolean onZoomDown(MotionEvent ev) {
return false;
}
@Override
public boolean onZoomUp(MotionEvent ev) {
return false;
}
/**
* 猛的一划,最后手指离开屏幕
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
float diffX = e1.getX() - e2.getX();
float diffY = e1.getY() - e2.getY();
//X轴上的移动距离较大并且X轴上的移动速度大于300像素每秒
if (Math.abs(diffX) > Math.abs(diffY) && Math.abs(velocityX) > 300f) {
if (diffX < -50f) {
return onMoveRight(e2);
} else if (diffX > 50f) {
return onMoveLef(e2);
}
}
return super.onFling(e1, e2, velocityX, velocityY);
}
}