当前位置:编程学习 > JAVA >>

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 interface 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() {  
                        @Override  
                        public 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() {  
            @Override  
            public void onDoubleClick() {  
                //这里我的项目需要的功能是双击返回上一级Activity  
                finish();  
            }  
        });  
    }  
      
    @Override   
    public boolean dispatchTouchEvent(MotionEvent event) {  
          
        if(doubleClick == null) {  
            return super.dispatchTouchEvent(event);   
        }else{  
            doubleClick.dispatchTouchEvent(event);  
        }  
        return super.dispatchTouchEvent(event);  
    }   
 
 
更多Android项目工具类,请关注本人GitHub主页。
 
除公司项目源码不能公开,本人所有源码都开
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,