Событие касания ViewPager конфликтует с перетаскиваемым представлением в его фрагменте - PullRequest
1 голос
/ 24 апреля 2019

Я реализовал перетаскивание для закрытия и масштабирования в Fragment of ViewPager.Теперь, его смахивание не было гладким, потому что касания ViewPager и представления во фрагменте конфликтуют друг с другом.Итак, я написал класс CustomViewPager для переопределения метода ' onInterceptTouchEvent ', чтобы я мог обнаружить, что если это горизонтальное перелистывание, а представление фрагмента еще не увеличено или не перетаскивается, то ViewPager должен использовать касания, чтобы избежать конфликтов и сделатьпроведите гладкоНо проблема, с которой я сталкиваюсь, заключается в том, что нажатие кнопок также не вызывает действий, так как ViewPager не передает их касание, и если я не перехватываю касание в ViewPager, тогда ViewPager и конфликт фрагментов.Как я могу разрешить клики дочерних элементов, но использовать другие события, например ACTION_MOVE, пока я не хочу, чтобы он передавался дочерним элементам.

CustomViewPager:

public class DemoViewPager extends ViewPager {
    private final int THRESHOLD = ScreenUtils.dpToPx(20);
    float diffX, diffY;
    private float initialXValue;
    private float initialYValue;
    private MotionEventListener motionEventListener;

    public DemoViewPager(@NonNull Context context) {
        super(context);
    }

    public DemoViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {


        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:

                initialXValue = ev.getX();
                initialYValue = ev.getY();

                return true;
//                break;
            case MotionEvent.ACTION_MOVE:

                diffX = ev.getX() - initialXValue;
                diffY = ev.getY() - initialYValue;


                boolean isHorizontalSwipe = Math.abs(diffY) < THRESHOLD;
                boolean isDraggable = motionEventListener != null && (motionEventListener.isDragging() || motionEventListener.isZoomed());


                if (!isHorizontalSwipe || isDraggable) {
                    return true;
                }

//                return true;
            break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:

                break;
            //return true;
        }

        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {

       switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:

                initialXValue = ev.getX();
                initialYValue = ev.getY();

                if (motionEventListener != null)
                    motionEventListener.onMotionEventReceived(ev);

                break;
            case MotionEvent.ACTION_MOVE:

                diffX = ev.getX() - initialXValue;
                diffY = ev.getY() - initialYValue;

                boolean isHorizontalSwipe = Math.abs(diffY) < THRESHOLD;
                boolean isDraggable = motionEventListener != null && (motionEventListener.isDragging() || motionEventListener.isZoomed());


                if (!isHorizontalSwipe || isDraggable) {
                    if (motionEventListener != null)
                        motionEventListener.onMotionEventReceived(ev);

                    if (isDraggable)
                        return false;
                }

                break;

            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                if (motionEventListener != null)
                    motionEventListener.onMotionEventReceived(ev);

                break;
        }

        return super.onTouchEvent(ev);
    }

    public void setMotionEventListener(MotionEventListener motionEventListener) {
        this.motionEventListener = motionEventListener;
    }

    public interface MotionEventListener {
        void onMotionEventReceived(MotionEvent motionEvent);

        boolean isDragging();

        boolean isZoomed();
    }

}
...