7

我有用于检测 fling 的常用手势检测器,它是 a 的实例属性SurfaceView

GestureDetector flingDetector = new GestureDetector(getContext(),new SimpleOnGestureListener() {

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                    // Fling implementation
            return true;
        }
});

我在 a 上绘制了很多复杂的东西,canvas并且我有一个translate(dx,dy)onScroll.

所以我的问题是如何使用该translate方法实现投掷?

似乎有很多关于检测 fling 的问题,我的问题是关于实施它。

4

1 回答 1

5

我不确定这会回答你的问题,我会试一试。

检查http://developer.android.com/reference/android/view/MotionEvent.html以获取 MotionEvent。

您可以在 onFling 方法上使用作为 e1 和 e2 接收的两个事件,并使用 e1.getX()、e2.getX()、e1.getY()、e2.getY()...计算坐标差。您可以将 dx 和 dy 与 translate(dx,dy) 一起使用。

由于 fling 看起来更像是一种动态手势,因此您可以确定 fling 意味着更大的运动,并对 dx 和 dy 应用放大因子,这样当用户滚动时,他们会得到精确的运动,但在 fling 上,实际的运动被放大。

如果这个因素取决于速度,那么您对每个用户输入都有一个自定义响应。

(另一件事是为结果设置动画,我想这取决于其他事情)。

如果是我,我可能会尝试的一个例子:

  • 用户轻轻滚动:运动为 dx,dy。翻译(dx,dy)。
  • 用户投掷:
    真实运动:dx=(e2.getX()-e1.getX().dy = (e2.getY()-e1.getY()。投掷因子:(自定义实现)。修改后的运动:dxModified = dx *velocityX*F.dyModified = dy*velocityY*F. 最后:翻译 (dxModified,dyModified)

    希望这在一定程度上有所帮助。

    编辑:我没有意识到这个问题是从 2012 年开始的,希望这会对某人有所帮助。无论如何,很高兴知道最终的实现!

于 2014-05-18T16:16:28.723 回答