在onLongPress之后继续触发onScroll事件

3

有人知道如何结合onLongPress(MotionEvent e)onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)吗?想法是从onLongPress开始,但继续滑动跨越某些视图。

我现在的代码:

private class CustomListener implements View.OnTouchListener {

    ImagePreviewer imagePreviewer = new ImagePreviewer();

    private GestureDetector gestureDetector = new GestureDetector(getActivity(), new GestureDetector.SimpleOnGestureListener() {

        ImageView currentImageView;

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {

            float x = e2.getX();
            float y = e2.getY() + mConstraintLayoutContainerCoordinates[1];

            currentImageView = getProperImage(mCurrentImagesNumberForPoll, (int) x, (int) y);

            if(currentImageView != null) {
                imagePreviewer.show(getActivity(), currentImageView);
            }

            return super.onScroll(e1, e2, distanceX, distanceY);
        }

        @Override
        public void onLongPress(MotionEvent e) {

            Log.d(TAG, "LONG PRESS");

            float x = e.getX();
            float y = e.getY() + mConstraintLayoutContainerCoordinates[1];
            currentImageView = getProperImage(mCurrentImagesNumberForPoll, (int) x, (int) y);
            if(currentImageView != null) {
                imagePreviewer.show(getActivity(), currentImageView);
            }

            super.onLongPress(e);
        }
    });

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {
            Log.d("TAG", "DOWN  or CANCEL ");
            imagePreviewer.hide();
        }
        gestureDetector.onTouchEvent(event);
        return true;
    }
}

问题在于无论是手指滑动视图还是长按视图,都会调用onScroll()方法,但我想先使用onLongPress()方法,然后检测手指滑动,以便根据需要选择正确的视图进行显示。


你能检查并验证一下我的答案是否有效吗? - Anmol
3个回答

3

GestureDetectorCompat 在检测到 onLongPress 之后会阻止对 onScroll 的调用。可以通过向探测器发送 ACTION_CANCEL 来取消该阻止。

@Override
public void onLongPress(MotionEvent e) {
    isLongPressed = true;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (detector.onTouchEvent(event)) {
        return true;
    }

    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_MOVE:
            if (isLongPressed) {
                isLongPressed = false;
                MotionEvent cancel = MotionEvent.obtain(event);
                cancel.setAction(MotionEvent.ACTION_CANCEL);
                detector.onTouchEvent(cancel);
            }
            break;
    }
    return super.onTouchEvent(event);
}

谢谢 - 这个方法非常有效!它允许检测长按,同时允许其继续成为移动手势。非常准确! - Taqras

1

0
我以稍微不同的方式实现了上述功能。我使用onLongPress(MotionEvent e)来获取是否触发了长按,并创建一个标志,即mLongClicked = true,一旦完成,我在onTouch()中自己滚动,因为一旦调用longPress,框架就不会调用onScroll。 这只是一个解决方法,而且完美地工作。
override fun onTouchEvent(event: MotionEvent?): Boolean {
        gestureDetector.onTouchEvent(event)    

        when (event.action) {
            MotionEvent.ACTION_MOVE -> {
                if (dragEvent) {
                    //Add on Move logic here for scroll
                    scrollListener.onDragEvent(DragEventType.move, event.x, event.y)
                    return false
                }
                if (mLongClicked) {
                    mLongClicked = false
                    dragEvent = true
                }
            }
            MotionEvent.ACTION_UP -> {
                if (dragEvent) {
                    //Add on Up logic here for scroll
                    scrollListener.onDragEvent(DragEventType.up, event.x, event.y)
                    dragEvent = false
                }
            }
        }
        return true
    }

而 onLongPress() 将会像这样:

override fun onLongPress(event: MotionEvent) {
            mLongClicked = true
            //Add on Down logic here for scroll
            zoomViewListener.onDragEvent(DragEventType.down, event.x, event.y)
        }

注意:我正在使用监听器来滚动视图以外的事件并进行操作,您可以在此处完成。如果您考虑到向下事件,则由onLongPress()处理。

我更喜欢Kotlin而不是Java :p


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接