Imaging icon indicating copy to clipboard operation
Imaging copied to clipboard

涂鸦模式时,双指缩放后左上角会出现一个红点

Open anpoz opened this issue 5 years ago • 6 comments

通过断点发现是IMGView.onTouch有个关于mPointerCount>1的判断,双指缩放时存在mPointerCount=1的情况,导致当mPointerCount=2走向onPathDone时会把空数据存进path list中。

anpoz avatar Feb 27 '19 06:02 anpoz

解决了吗?我也发现这个问题了

通过断点发现是IMGView.onTouch有个关于mPointerCount>1的判断,双指缩放时存在mPointerCount=1的情况,导致当mPointerCount=2走向onPathDone时会把空数据存进path list中。

chenli3238 avatar Mar 01 '19 10:03 chenli3238

我目前这样解决,涂鸦时取消双指缩放和拖拽

chenli3238 avatar Mar 04 '19 03:03 chenli3238

在onTouch方法中修改如下代码:

else if (mPointerCount > 1) { // scaledTouchSlop=ViewConfiguration.get(getContext()).getScaledTouchSlop(); if (event.getX() - downX >= scaledTouchSlop || event.getY() - downY >= scaledTouchSlop) { onPathDone(); } else { mPen.reset(); }

        handled |= onTouchNONE(event);
    } 

MrxMo avatar Apr 15 '20 04:04 MrxMo

@MrxMo Could you expand more detail? Which file with onTouch method thats you are mentioning? I have onTouch Method on IMGView, but it seem doesn't same with you.

boolean onTouch(MotionEvent event) {

        if (isHoming()) {
            // Homing
            return false;
        }

        mPointerCount = event.getPointerCount();

        boolean handled = mSGDetector.onTouchEvent(event);

        IMGMode mode = mImage.getMode();

        if (mode == IMGMode.NONE || mode == IMGMode.CLIP) {
            handled |= onTouchNONE(event);
        } else if (mPointerCount > 1) {
            onPathDone();
            handled |= onTouchNONE(event);
        } else {
            handled |= onTouchPath(event);
        }

        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                mImage.onTouchDown(event.getX(), event.getY());
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                mImage.onTouchUp(getScrollX(), getScrollY());
                onHoming();
                break;
        }

        return handled;
    }

sinhpn92 avatar Apr 20 '20 08:04 sinhpn92

@sinhpn92

boolean onTouch(MotionEvent event) {

    if (isHoming()) {
        // Homing
        return false;
    }

    mPointerCount = event.getPointerCount();

    boolean handled = mSGDetector.onTouchEvent(event);

    IMGMode mode = mImage.getMode();

    if (mode == IMGMode.NONE || mode == IMGMode.CLIP) {
        handled |= onTouchNONE(event);
    } else if (mPointerCount > 1) {
        if (event.getX() - downX >= scaledTouchSlop || event.getY() - downY >= scaledTouchSlop) {
            onPathDone();
        } else {
            mPen.reset();
        }

        handled |= onTouchNONE(event);
    } else {
        handled |= onTouchPath(event);
    }

    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_DOWN:
            mImage.onTouchDown(event.getX(), event.getY());
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            mImage.onTouchUp(getScrollX(), getScrollY());
            onHoming();
            break;
    }

    return handled;
}

MrxMo avatar May 26 '20 02:05 MrxMo

private boolean mNeedDraw;

private boolean onPathBegin(MotionEvent event) {
    mNeedDraw = false;
    mPen.reset(event.getX(), event.getY());
    mPen.setIdentity(event.getPointerId(0));
    return true;
}

private boolean onPathMove(MotionEvent event) {
    if (mPen.isIdentity(event.getPointerId(0))) {
        mNeedDraw = true;
        mPen.lineTo(event.getX(), event.getY());
        invalidate();
        return true;
    }
    return false;
}

private boolean onPathDone() {
    if (mPen.isEmpty()) {
        return false;
    }
    if (mNeedDraw){
        mNeedDraw = false;
        mImage.addPath(mPen.toPath(), getScrollX(), getScrollY());
    }
    mPen.reset();
    invalidate();
    return true;
}

zhuyingfa avatar Jun 17 '20 03:06 zhuyingfa