0

我正在尝试实施投掷。问题是我只有在 X 位于偏移量 0(这意味着在屏幕边缘)时才得到它。当我尝试在屏幕中间乱跳时,什么也没有发生。这只发生在 X 上。Y 表现正常。这是代码:

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
    try {

        if ((e1.getY() < CARD_POSITION) && (e2.getY() < CARD_POSITION)
                && (Math.abs(e1.getX() - e2.getX()) >SWIPE_MIN_DISTANCE )
                ) {
            Log.v("Fling:",Double.toString(e1.getX())); 
            return true;
        } else {


            return false;
        }
    } catch (Exception e) {
        return false;
    }

}
4

1 回答 1

0

我过去遇到过类似的问题。它最终成为我如何将 x 位置与我使用的最小距离阈值进行比较的数学错误。根据您结合发布的代码所描述的内容,听起来好像 x 方向抛掷不起作用,因为 x1 和 x2 之间的差异在应用绝对值后并没有达到您的想法。

从 0 偏移开始,滑动整个屏幕,您就可以注册一个手指,因为距离这么远,两个值之间的差异足以触发您的阈值。但是从屏幕中间,说 x1 = 400 和 x2 = 无论移动事件被注册,你都没有触发那个阈值。

对我有用的是消除绝对值

public boolean onFling(MovtionEvent e1, MotionEvent e2, float velocityX, float velocityY){

if(e2.getX() - e1.getX() > MIN_SWIPE_DISTANCE && Math.abs(velocityX)){
    Log.d("Swipe", "Left to right")
    return true;
} else if (e2.getX() - e1.getX() > MIN_SWIPE_DISTANCE && Math.abs(velocityX)){
    Log.d("Swipe", "Right to Left")
    return true;
}

我的推理基于描述 e1 和 e2 代表的GestureDetector文档:

e1 开始滚动的第一个向下运动事件。
e2 触发当前 onFling 的移动动作事件。

错误原来是一个假设,其中 e1 初始值ACTION_DOWN相对于ACTION_MOVEfrom e2发生的位置

于 2013-05-24T15:16:09.707 回答