我正在尝试在Android上捕获一个手势,我想在用户在视图上滑动时触发一个动作,当用户在相同视图上滑动时触发另一个动作。 我正在使用SetOntouchListener来捕获手势,这里是代码:
LinearLayout arrowIv = (LinearLayout)findViewById(R.id.arrowInfoPanel);
arrowIv.setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
int action = MotionEventCompat.getActionMasked(event);
Log.d("TAGTAG", "action: " + action);
return true;
}
});
这是我的听众的输出
action: 0
action: 2
action: 2
action: 2
action: 2
action: 2
action: 2
action: 2
action: 2
action: 2
action: 2
action: 2
action: 2
action: 2
action: 2
action: 2
action: 1
问题是:onTouch事件被多次调用,我该如何处理它并说“这是一个slideUp动作”? 根据谷歌的另一个细节“... ACTION_DOWN是所有触摸事件的起点。”,然后甚至是一个以ACTION_DOWN开始的slideUp。
答案 0 :(得分:0)
arrowIv.imageView.setOnTouchListener(new OnSwipeTouchListener() {
public void onSwipeTop() {
Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show();
}
public void onSwipeBottom() {
Toast.makeText(MyActivity.this, "bottom", Toast.LENGTH_SHORT).show();
}
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});
public class OnSwipeTouchListener implements OnTouchListener {
private final GestureDetector gestureDetector;
public OnSwipeTouchListener (Context ctx){
gestureDetector = new GestureDetector(ctx, new GestureListener());
}
private final class GestureListener extends SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
onSwipeBottom();
} else {
onSwipeTop();
}
}
result = true;
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
public void onSwipeTop() {
}
public void onSwipeBottom() {
}
}
答案 1 :(得分:0)
据我所知,您想要检测用户是否在视图上向上或向下滑动?如果我得到您的问题,也许这是一个解决方法。 作为文件:
public static final int ACTION_DOWN按下的手势已经开始了 motion包含初始起始位置。
public static final int ACTION_UP按下的手势已经完成, motion包含最终发布位置以及任何中间位置 自上次下跌或移动事件以来的点数。
知道向上滑动或向下滑动我认为你需要在ACTION_DOWN获得开始位置并在ACTION_UP结束位置。开始位置和结束位置的差异将让您知道向上或向下滑动。
StartPostion.Y - EndPosition.Y > 0 => slide up
StartPostion.Y - EndPosition.Y < 0 => slide down