如何在Android中实现滑动并保持手势?

时间:2018-09-26 22:55:29

标签: android

我正在尝试在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;
        }
    });

1 个答案:

答案 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已启动,则取消服务器操作。