Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何区分轻快和轻触?_Java_Android_Listview_Gesture Recognition_Viewflipper - Fatal编程技术网

Java 如何区分轻快和轻触?

Java 如何区分轻快和轻触?,java,android,listview,gesture-recognition,viewflipper,Java,Android,Listview,Gesture Recognition,Viewflipper,我在ViewFlipper中有一个ListView,当用户在屏幕上滑动时,我正在翻转它。单击列表视图将打开浏览器。有时,当我刷卡时,它会在ListView上被检测为触摸,并打开浏览器。这可能很烦人。我怎样才能防止这种情况发生 class MyGestureDetector extends SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2

我在ViewFlipper中有一个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;  
        }  

您是否尝试过使用SimpleOnGestureListener.OnSingleTapConfiged(MotionEvent)作为触控事件(“单击”)?只有在探测器确信用户的第一次点击是真正的点击,而不是双击(或者希望是一次放纵)之后,才会调用此函数


这通常是通过父视图的方法完成的
onInterceptTouchEvent
有机会在视图的子对象之前看到任何触摸事件。如果
onInterceptTouchEvent
返回
true
则先前处理触摸事件的子视图将收到
操作\u取消
,并且从该点开始的事件将发送到父视图的
onTouchEvent
方法进行常规处理。它还可以返回
false
,并在事件沿视图层次结构向下移动到其常用目标时监视事件

基本上,您希望在父视图上检测抛弹的
onInterceptTouchEvent
中执行此操作:

  • 操作下
    ,记录触摸的位置。返回
    false
  • 在动作移动时,检查初始触地位置和当前位置之间的差值。如果超过阈值,(框架使用
    ViewConfiguration
    中的或其他适当的值来处理类似的事情),则返回
    true
  • 根据
    onTouchEvent
    ,像往常一样检测并处理投掷
一旦您截获,列表视图将取消其触摸处理,您不会在列表项上获得不需要的点击事件
ListView
还设置为,一旦用户开始垂直滚动列表,就不允许其父级截取事件,这意味着如果用户不小心垂直滚动列表,则不会出现错误的水平滚动


这就是像股票Android Launcher或新闻和天气这样的东西如何进行滚动/点击内容的侧对侧分页。

触摸只需片刻。一次狂欢可以持续几天。通常,一次放纵是由许多接触组成的……与手头的问题完全无关,但我笑了,对设计师感到沮丧。^)我还没有,但我不确定如何将我的ListView连接到这个?我尝试实现onInterceptTouchEvent,但该方法从未被调用。查看我更新的代码OnInterceptTouchEvent是一个要重写的视图方法,而不是侦听器方法。我不太清楚你的意思是什么?你能给我举个例子吗?这是来自Android开源项目中的stock launcher代码。
Workspace
类扩展了
ViewGroup
并覆盖了
onInterceptTouchEvent
onTouchEvent
VelocityTracker
检查快速运动,以在拖动滚动结束时发出投掷信号。
滚动条用于在用户释放后移动到最终页面位置。它执行一些您不一定需要的平滑,但本质上它实现了上面描述的内容。您的代码不需要像这样复杂,就可以完成您要做的事情。
class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onSingleTapConfirmed(MotionEvent event) {
        // Code...
    }
}