android手势检测类的扩展支持单点和多点触摸

来源:互联网 发布:购买汽车配件的软件 编辑:程序博客网 时间:2024/05/21 15:47

android提供的手势检测类不支持多点手势的检测,这个挺奇怪的。而工作中经常会有手势放大缩小之类的需求,如果每次要在自己在实现类里

判断手势,一来代码冗余不利于维护,二来判断手势的代码有时候写起来还比较费劲的(你看android手势检测类就知道了,那么多的变量)。

我想要的只是在一个手势的回调方法里实现自己的业务代码,多省事。

基于以上的原因还是封装一个吧,这样就一劳永逸了。实现的原理是:

鉴于原来就有手势检测类,google大神写的肯定比我等靠谱和高效,所以能拿来用的就继续用,不能的就自己实现了,

原本的手势检测类里提供了很多常用的回调,比如:点击,长按,双击,滑动等等。

新提供了四个新的接口放大、缩小、向左滑、向右滑,主要是我的业务里用到了这几个哈哈。。。

使用方法跟GestureDetector一样,详见demo。

好吧!小菜鸟一个如果代码写的不好请批评指正,谢谢!

demo下载地址:http://download.csdn.net/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{@Overridepublic boolean onMoveLef(MotionEvent ev) {return false;}@Overridepublic boolean onMoveRight(MotionEvent ev) {return false;}@Overridepublic boolean onZoomDown(MotionEvent ev) {return false;}@Overridepublic boolean onZoomUp(MotionEvent ev) {return false;}/** * 猛的一划,最后手指离开屏幕 */@Overridepublic 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);}}




0 0