Activity 双击事件监听(解决事件派发问题)
使用手势识别类GestureDetector可以用标准的SDK类实现双击监听,但存在一个局限性:由于GD是在OnTouchEvent方法中拦截事件进行处理,而Android事件派发流程,使得如果Activity内部的View会消耗点击事件,GD就无法接受到点击事件了。为此,本人实现一个可以完美监听Activity事件的工具类:DoubleClick。类的全部源码:[java]public class DoubleClick{private int clickCount;private long firstClickTime;private int CLICK_DELAY = 300;private final static int MOVE_OFFSET = 20;private float mLastMotionY;private float mLastMotionX;private Timer cleanClickTimer = new Timer();private OnDoubleClickListener listener;public DoubleClick(OnDoubleClickListener l){listener = l;}public inte易做图ce OnDoubleClickListener{void onDoubleClick();}public void dispatchTouchEvent(MotionEvent event){final float y = event.getY();final float x = event.getX();if (event.getAction() == MotionEvent.ACTION_DOWN) {mLastMotionY = y;mLastMotionX = x;clickCount++;if(clickCount == 1){firstClickTime = System.currentTimeMillis();//超过监听时间50MS还没有再次点击,则将点击次数,点击事件清零。cleanClickTimer.schedule(new TimerTask() {@Overridepublic void run() {clickCount = 0;firstClickTime = 0;}}, CLICK_DELAY+50);}else if(clickCount == 2){long secondClickTime = System.currentTimeMillis();if (secondClickTime - firstClickTime <= CLICK_DELAY) {listener.onDoubleClick();}clickCount = 0;firstClickTime = 0;}}if(event.getAction() == MotionEvent.ACTION_MOVE){final int yDiff = (int) Math.abs(y - mLastMotionY);final int xDiff = (int) Math.abs(x - mLastMotionX);boolean yMoved = yDiff > MOVE_OFFSET;boolean xMoved = xDiff > MOVE_OFFSET;// 判断是否是移动if (yMoved || xMoved) {clickCount = 0;firstClickTime = 0;}}}}使用实例:[java]private DoubleClick doubleClick;//当需要使用双击事件监听,调用此方法即可。protected void enableDClickReturn(){doubleClick = new DoubleClick(new DoubleClick.OnDoubleClickListener() {@Overridepublic void onDoubleClick() {//这里我的项目需要的功能是双击返回上一级Activityfinish();}});}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {if(doubleClick == null) {return super.dispatchTouchEvent(event);}else{doubleClick.dispatchTouchEvent(event);}return super.dispatchTouchEvent(event);}更多Android项目工具类,请关注本人GitHub主页。除公司项目源码不能公开,本人所有源码都开补充:软件开发 , Java ,
上一个:设计模式--创建模式--简单工厂模式--java
下一个:线性表
- 更多JAVA疑问解答:
- java怎么在线读取ftp服务器上的文件内容
- 关于程序员的职业规划
- HTML和JSP矛盾吗?
- java小程序如何打包?
- java怎么split路径文件名?
- jsp+javaBean中Column 'ordersPrice' specified twice的错误
- Java TCP/IP Socket网络编程系列
- 大家来讨论一下我到底该用什么好?Swing 还是 JavaFX
- 关于Hibernate实体自身多对一的抓取问题
- 关于apache2+tomcat群集出现的问题
- spring 获取上下文问题
- SSH 导入导出excel 谁有这块的资料吗?
- Ext TreePanel 刷新问题
- springmvc 加载一个jsp页面执行多个方法 报404
- checkbox数组action怎么向页面传值