【问题标题】:How to combine ScaleGestureDetector.SimpleOnScaleGestureListener and GestureDetector.SimpleOnGestureListener properly?如何正确组合 ScaleGestureDetector.SimpleOnScaleGestureListener 和 GestureDetector.SimpleOnGestureListener?
【发布时间】:2013-11-04 18:08:09
【问题描述】:

我的应用需要检测简单的手势(滚动、点击、长按)和捏缩放。任何一个检测器都可以自己正常工作 - GestureDetector.SimpleOnGestureListener 用于点击/滚动,ScaleGestureDetector.SimpleOnScaleGestureListener 用于捏缩放。问题是将两者结合起来。更具体地说,很难开始捏缩放,因此在onScaleBegin 之前不会生成几个onScroll 事件。

有什么好的方法可以解决这个问题吗?我能想到的唯一解决方案是在处理它们之前缓冲一些事件(事件队列),并在检测到onScaleBegin 时丢弃onScroll / onTap 而不进行处理。但这会引入输入延迟(我的应用已经存在,我不想让它变得更糟)。

【问题讨论】:

    标签: android gesture gestures gesture-recognition


    【解决方案1】:

    试试这个:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean res = mScaleGestureDetector.onTouchEvent(event);
        if (!mScaleGestureDetector.isInProgress()) {
            res = mGestureDetector.onTouchEvent(event);
        }
        return res;
    }
    

    【讨论】:

    • 我就是这样做的。问题是,您不能同时将两个手指放在屏幕上。你会先放一根手指,然后再放第二根手指。如果在此期间您的第一根手指稍微移动 - 那就是 onScroll
    • 所以在 onScroll 方法中添加一些阈值
    • 有一些门槛。我现在正在微调它,但它似乎也不是一个好的解决方案。
    • 我们所说的距离 X/Y 的值是多少?
    • 另一种可能性是在开始滚动之前跟踪旧位置。当检测到缩放事件时,取消滚动效果,并将位置恢复到旧位置。这样一来,普通滚动就没有额外的延迟,并且缩放会发生在原地。
    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 2023-03-25
    • 2014-12-20
    • 2013-06-11
    • 2022-07-01
    • 2012-07-19
    相关资源
    最近更新 更多