我有一个布局(表格布局)。每当用户执行" down"手势,需要调用特定的功能。但是,ontouchlistener会立即捕获事件,而不是等到用户执行正确的"拉下"手势。
我的代码是:
homePageTableLayout.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View view, MotionEvent event) {
if ((event.getAction() == MotionEvent.ACTION_DOWN)) {
startSyncData();
}
return true;
}
});
目前,正在发生的事情是立即调用startSyncData()函数。 最终结果应该与常用的" pulltorefresh"用于Android的库,但在这个用例中,我不必更新视图。我只需要将一些数据发布到服务器上。 我无法使用" pulltorefresh"因为它不支持" pull"一个tablelayout。我尝试将tablelayout放在scrollview中,但这只会破坏UI。
答案 0 :(得分:5)
您可以尝试在ACTION_MOVE
或ACTION_UP
中执行此操作 - 如果您需要专门执行向下滑动手势,这应该有所帮助,引入四个全局floats
:{{1然后在x, y, x1, y1
:
ACTION_DOWN
x = event.getX();
y = event.getY();
或ACTION_MOVE
:
ACTION_UP
然后在x1 = event.getX();
y1 = event.getY();
:
ACTION_UP
答案 1 :(得分:4)
不是那么容易。它正在捕捉MotionEvent.ACTION_DOWN
,因此它可以正常工作。它并不意味着像向下滑动这样的手势意味着用户触摸屏幕(手指向下,触摸或手势刚刚开始)。现在你需要抓住MotionEvent.ACTION_UP
(手指向上,手势或触摸结束)并确定是否有你需要的手势。 http://developer.android.com/training/gestures/detector.html
http://developer.android.com/training/gestures/index.html
答案 2 :(得分:3)
MotionEvent.ACTION_MOVE
。因此,如果您想在移动一定距离后运行startSyncData()
,请计算在运行该方法之前您希望用户移动多少。
关键是ACTION_DOWN
不是屏幕上的向下移动,但这意味着用户按下了屏幕。
homePageTableLayout.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View view, MotionEvent event) {
if ((event.getAction() == MotionEvent.ACTION_DOWN)) {
startFlg = 1;
} else if ((event.getAction() == MotionEvent.ACTION_MOVE)) {
if (startFlg==1){
// Calculate distance moved by using event.getRawX() and event.getRawX() and THEN run your method
startSyncData();
}
}
return true;
}
});