She*_*lam 4 java android listview gesture-recognition viewflipper
我在ViewFlipper中有一个ListView,当用户在屏幕上滑动时我正在翻转它.单击ListView将打开浏览器.有时当我滑动时,它会在ListView上被检测为触摸并打开浏览器.这可能很烦人.我怎样才能防止这种情况发生?
class MyGestureDetector extends SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                    return false;
                // right to left swipe
                if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    viewFlipper.setInAnimation(slideLeftIn);
                    viewFlipper.setOutAnimation(slideLeftOut);
                    viewFlipper.showNext();
                } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    viewFlipper.setInAnimation(slideRightIn);
                    viewFlipper.setOutAnimation(slideRightOut);
                    viewFlipper.showPrevious();
                }
                if (viewFlipper.getDisplayedChild() == 0) {
                    // TODO: light up left
                    flipperPosition = 0;
                } else if (viewFlipper.getDisplayedChild() == 1) {
                    // TODO: light up middle
                    flipperPosition = 1;
                } else if (viewFlipper.getDisplayedChild() == 2) {
                    // TODO: light up right
                    flipperPosition = 2;
                }
            } catch (Exception e) {
                System.out.println(e);
            }
            return false;
        }
    }
protected MotionEvent downStart = null;  
        public boolean onInterceptTouchEvent(MotionEvent event) {  
            switch(event.getAction()) {  
            case MotionEvent.ACTION_DOWN:  
                // keep track of the starting down-event  
                downStart = MotionEvent.obtain(event);  
                break;  
            case MotionEvent.ACTION_MOVE:  
                // if moved horizontally more than slop*2, capture the event for ourselves  
                float deltaX = event.getX() - downStart.getX();  
                if(Math.abs(deltaX) > ViewConfiguration.getTouchSlop() * 2)  
                    return true;  
                break;  
            }  
            // otherwise let the event slip through to children  
            return false;  
        }  
ada*_*amp 13
通常这样做的onInterceptTouchEvent方法是通过父视图的方法.onInterceptTouchEvent有机会在观看孩子之前看到任何触摸事件.如果onInterceptTouchEvent返回true先前处理的子视图,则触摸事件接收到,ACTION_CANCEL并且从该点开始的事件被发送到父onTouchEvent方法以进行常规处理.false当它们沿着视图层次结构向下移动到通常的目标时,它也可以返回并简单地监视事件.
你想onInterceptTouchEvent在你正在检测flings的父视图中执行此操作:
ACTION_DOWN,记录触摸的位置.返回false.ACTION_MOVE,检查初始接地位置和当前位置之间的差值.如果它超过了一个阈值,(框架使用ViewConfiguration#getScaledTouchSlop()或其他适当的值来自这样ViewConfiguration的东西)返回true.onTouchEvent.拦截后,ListView将取消其触摸处理,您不会在列表项上获得不需要的点击事件.ListView也设置为禁止其父级在用户开始垂直滚动列表时拦截事件,这意味着如果用户在列表中垂直地翻动列表,则不会出现错误的水平偏移.
这就是Android启动器或新闻和天气这样的东西如何对滚动/可点击内容进行左右分页.
| 归档时间: | 
 | 
| 查看次数: | 6808 次 | 
| 最近记录: |