我根据这个主题实现了我的手势监听器:ListView Horizontal 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;
}
评估此方法需要时间
EDIT2: 我想问题是因为listview已经拥有自己的手势监听器并附加我的覆盖它。这是一个问题,因为listview手势监听器也会考虑速度和加速度,以提供良好的移动效果。我的听众非常原始,所以列表滚动不再平滑.. 即使我的onFLing方法总是返回false(因此它不消耗事件)列表滚动也会受到影响...
EDIT3: 好吧也许我找到了解决方案,但我需要你的帮助! 我可以在容器布局上设置onTouchListener,问题是listview实际上覆盖了父的onTouch,所以我需要反转这种情况:listview上的onTouchEvent必须被父进程拦截,所以返回false就是对listview的影响
答案 0 :(得分: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!
}
}
我不知道这是否是最佳解决方案,但仍然......它有效!