首页 > 解决方案 > 可拖动父视图中的可缩放 ImageView 冲突

问题描述

我有一个具有 ViewPager 的活动,并且每个页面都是具有可缩放图像视图的片段。我已经在可缩放 imageView 的父视图上使用 onTouch 方法实现了拖动以关闭功能,并且拖动工作正常。但我想检查在 dispatchTouchEvent 中是否检测到 2 个数字,然后忽略 onTouch 方法并将触摸传递给子视图,以便我可以缩放图像。我试过写一个如下的类,但它不起作用。我该如何解决这个问题?因此,缩放和拖动不会相互冲突。

谢谢

自定义视图:

public class DraggableRelativeLayout extends RelativeLayout {
    private final int THRESHOLD = ScreenUtils.dpToPx(10);
    float diffX, diffY;
    private float initialXValue;
    private float initialYValue;

    public DraggableRelativeLayout(Context context) {
        super(context);
    }

    public DraggableRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public DraggableRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public DraggableRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                initialXValue = ev.getX();
                initialYValue = ev.getY();
                // return false;
                break;
            case MotionEvent.ACTION_MOVE:
                diffX = ev.getX() - initialXValue;
                diffY = ev.getY() - initialYValue;

                if (Math.abs(diffY) <THRESHOLD || ev.getPointerCount() > 1)
                    return true;
                else
                    return super.dispatchTouchEvent(ev);
                //break;
            case MotionEvent.ACTION_UP:
                break;

        }
        return super.dispatchTouchEvent(ev);
    }
}

onTouchListener:

public class PostDetailTouchListener implements View.OnTouchListener {


    public PostDetailTouchListener(Context context, View view, View viewToZoom, OnDragInteractionListener mListener) {
        dragView = view;
        dragListener = mListener;
        zoomView = viewToZoom;
     }


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

        // doing my work
    }

标签: androidontouchlistenerandroid-touch-event

解决方案


您可以使用手势检测器来实现此目的以获取详细链接

class GestureListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onDown(MotionEvent event) {
            return true;
        }
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            return true;
        }
        @Override
        public void onLongPress(MotionEvent e) {
        }
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            return true;
        }
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {
            return true;
        }
        @Override
        public boolean onFling(MotionEvent event1, MotionEvent event2,float velocityX, float velocityY) {
            return true;
        }
    }

推荐阅读