Android中的MotionEvent.ACTION_DOWN过于敏感。即使屏幕被触摸片刻,也会收到此事件

时间:2015-04-22 08:58:04

标签: android gesture ontouchlistener

我有一个布局(表格布局)。每当用户执行" down"手势,需要调用特定的功能。但是,ontouchlistener会立即捕获事件,而不是等到用户执行正确的"拉下"手势。

我的代码是:

homePageTableLayout.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View view, MotionEvent event) {
                if ((event.getAction() == MotionEvent.ACTION_DOWN)) {
                    startSyncData();
                }
                return true;
            }
        });

目前,正在发生的事情是立即调用startSyncData()函数。 最终结果应该与常用的" pulltorefresh"用于Android的库,但在这个用例中,我不必更新视图。我只需要将一些数据发布到服务器上。 我无法使用" pulltorefresh"因为它不支持" pull"一个tablelayout。我尝试将tablelayout放在scrollview中,但这只会破坏UI。

3 个答案:

答案 0 :(得分:5)

您可以尝试在ACTION_MOVEACTION_UP中执行此操作 - 如果您需要专门执行向下滑动手势,这应该有所帮助,引入四个全局floats:{{1然后在x, y, x1, y1

ACTION_DOWN

x = event.getX(); y = event.getY(); ACTION_MOVE

ACTION_UP

然后在x1 = event.getX(); y1 = event.getY();

ACTION_UP

答案 1 :(得分:4)

不是那么容易。它正在捕捉MotionEvent.ACTION_DOWN,因此它可以正常工作。它并不意味着像向下滑动这样的手势意味着用户触摸屏幕(手指向下,触摸或手势刚刚开始)。现在你需要抓住MotionEvent.ACTION_UP(手指向上,手势或触摸结束)并确定是否有你需要的手势。 http://developer.android.com/training/gestures/detector.html
http://developer.android.com/training/gestures/index.html

答案 2 :(得分:3)

反复调用

MotionEvent.ACTION_MOVE。因此,如果您想在移动一定距离后运行startSyncData(),请计算在运行该方法之前您希望用户移动多少。

关键是ACTION_DOWN不是屏幕上的向下移动,但这意味着用户按下了屏幕。

homePageTableLayout.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View view, MotionEvent event) {
            if ((event.getAction() == MotionEvent.ACTION_DOWN)) {
                startFlg = 1;
            } else if ((event.getAction() == MotionEvent.ACTION_MOVE)) {
                if (startFlg==1){
                    // Calculate distance moved by using event.getRawX() and event.getRawX() and THEN run your method
                    startSyncData();
                }
            }
            return true;
        }
    });