1

我根据这个主题实现了我的手势监听器:ListView Horizo​​ntal Fling Gesture

但是,我可以看到列表滚动较慢,有时(当您滚动非常慢时)它也会阻塞。我认为问题出在听众身上:计算值需要时间,因此得到我正在寻找的实际“从左到右”的投掷......没有更有效的方法吗?

编辑

问题在这里:

@Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
            return false;
        }

        // right to left swipe
        if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            System.out.println("right to left");
            animatedStartActivity(0);

            // right to left swipe
        }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            System.out.println("left to right");
            animatedStartActivity(1);
        }

        return false;
    }

评估这种方法需要时间

编辑2: 我猜问题是因为listview已经有自己的手势监听器并且附加我的覆盖它。这是一个问题,因为 listview 手势侦听器也考虑了速度和加速度,以提供良好的移动效果。我的听众很原始,所以列表滚动不再流畅了..即使我的 onFLing 方法总是返回 false (所以它不消耗事件)列表滚动受到影响......

edit3:好吧,也许我找到了解决方案,但我需要你的帮助!我可以在容器布局上设置onTouchListener,问题是listview实际上覆盖了父级的onTouch,所以我需要扭转这种情况:listview上的onTouchEvent必须被父级拦截,所以返回false是对listview的影响

4

1 回答 1

0

解决了!!!问题是 ListView 的 onTouchEvent 执行了一些其他操作!所以我扩展了ListView:

public class FlingListView extends ListView{

private GestureDetector detector; //this is my detector

public void setDetector(GestureDetector detector){
    this.detector = detector;
}

public FlingListView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

public FlingListView(Context context,AttributeSet set) {
    super(context,set);
    // TODO Auto-generated constructor stub
}

public FlingListView(Context context,AttributeSet set, int a) {
    super(context,set,a);
    // TODO Auto-generated constructor stub
}

     //here I do the magic
@Override
public boolean onTouchEvent(MotionEvent ev) {
    // TODO Auto-generated method stub
    super.onTouchEvent(ev); //I always do the list on touch event
    return(detector.onTouchEvent(ev)); //..but I return the detector!

}
 }

我不知道这是否是最好的解决方案,但仍然......它有效!

于 2012-09-29T15:09:58.030 回答