我正在尝试在Android中实现“滑动并按住”手势,即用户从左侧的一个点向右侧的另一个点滑动,然后继续保持在正确的位置,直到服务器端操作完成。这样的想法是,如果用户放弃保留,则服务器端操作将被取消。
我一直试图按照以下方式进行操作,但是在握住手势的部分时遇到了问题。我想发生的事情是,当用户到达右侧的B点时,只要事件ACTION_DOWN继续,手势就会以某种方式将ACTION_MOVE转换为右侧视图的ACTION DOWN。有效,但如果用户放开或离开视图区域,则无效。因此,问题是,一旦用户到达右侧的B点,是否可以将ACTION_MOVE从左到右链接为“保持”手势?我尝试在滑动后将onTouch添加到B点,但是唯一可行的方法是,如果用户放开滑动,然后再次按下B点。这是可能的,还是我应该以其他方式(例如拖放)进行操作?
下面发现的点A和B当前是图像视图,但是占位符比任何东西都重要。
private boolean mValidGesture = false;
Rect outRect = new Rect();
int[] location = new int[2];
private boolean isViewInBounds(View view, int x, int y){
view.getDrawingRect(outRect);
view.getLocationOnScreen(location);
outRect.offset(location[0], location[1]);
return outRect.contains(x, y);
}
...
mPointA.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int)event.getRawX();
int y = (int)event.getRawY();
if(event.getAction() == MotionEvent.ACTION_MOVE){
if (isViewInBounds(mPointB, x, y)) {
mPointB.dispatchTouchEvent(event);
Log.d(TAG, "onTouch ViewB");
Toast.makeText(MainActivity.this, "Swipe complete", Toast.LENGTH_SHORT).show();
//This is the part that happens only after you let go of the swipe :(
mPointB.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
mValidGesture = true;
Log.d(TAG, "Gesture: " + String.valueOf(mValidGesture));
return true;
case MotionEvent.ACTION_UP:
mValidGesture = false;
Log.d(TAG, "Gesture: " + String.valueOf(mValidGesture));
return true;
}
return false;
}
});
} else if(isViewInBounds(mPointA, x, y)){
Log.d(TAG, "onTouch ViewA");
}
}
// Further touch is not handled
return false;
}
});
答案 0 :(得分:1)
您不需要将touchListener放在pointB上。尝试这样的事情:
boolean serverActionStarted = false;
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int)event.getRawX();
int y = (int)event.getRawY();
if(event.getAction() == MotionEvent.ACTION_MOVE){
if (isViewInBounds(mPointB, x, y)) {
// TODO : swipe completed. Start server action
serverActionStarted=true;
}
}else if(event.getAction() == MotionEvent.ACTION_UP && serverActionStarted){
// TODO : cancel the server action
serverActionStarted = false;
}
因此,基本上,当用户从pointA滑动到pointB时,您将启动服务器操作并将布尔值serverActionStarted
设置为true。之后,如果发生ACTION_UP
事件,并且severAction已启动,则取消服务器操作。