【问题标题】:Horizontal Fling starts only on offset 0水平投掷仅在偏移量 0 处开始
【发布时间】:2013-05-24 23:16:09
【问题描述】:

我正在尝试实施投掷。问题是我只有在 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;
    }

}

【问题讨论】:

    标签: android gestures onfling


    【解决方案1】:

    我过去遇到过类似的问题。它最终成为我如何将 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;
    }
    

    我的推理基于 GestureDetector 文档,该文档描述了 e1 和 e2 代表的含义:

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

    错误原来是一个假设,即 e1 初始 ACTION_DOWN 相对于来自 e2 的 ACTION_MOVE 发生的位置

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      相关资源
      最近更新 更多