android在画布上的缩放和变换图像上绘制线条

android在画布上的缩放和变换图像上绘制线条,android,image-manipulation,android-canvas,Android,Image Manipulation,Android Canvas,我在画布上缩放和变换的图像上画线有问题,对于变换的图像,我可以在图像上画线,但如果图像被缩放(放大或缩小),则使用手指触摸意外地画线。由于我正在绘制应用程序,但没有更多关于这方面的知识,所以我需要您的帮助,我已经在谷歌上搜索了它,但没有运气,我没有找到任何东西 这里是第一张图片,默认正常工作,第二张移动图片正常工作,画线正常 而在第三个缩放图像中,没有正确绘制,我的意思是如果从左上角开始绘制,那么绘制的线点与这里不同 如果您需要代码,请说出来,我会编辑这个问题。好的,经过多次实施,我找到了解

我在画布上缩放和变换的图像上画线有问题,对于变换的图像,我可以在图像上画线,但如果图像被缩放(放大或缩小),则使用手指触摸意外地画线。由于我正在绘制应用程序,但没有更多关于这方面的知识,所以我需要您的帮助,我已经在谷歌上搜索了它,但没有运气,我没有找到任何东西

这里是第一张图片,默认正常工作,第二张移动图片正常工作,画线正常

而在第三个缩放图像中,没有正确绘制,我的意思是如果从左上角开始绘制,那么绘制的线点与这里不同


如果您需要代码,请说出来,我会编辑这个问题。

好的,经过多次实施,我找到了解决方案

这是我在onDraw()中绘制的代码

在这里,您必须检查用于还原画布的比例因子值。如果比例因子值为默认值,即1.f,且图像仅在绘制线/路径后移动然后恢复,如果比例因子不等于1.f(默认值),则在使用手指触摸绘制时先恢复画布,然后绘制线/路径

这是我的onTouch()代码


你能发布你的观点类吗?是的,请发布你的观点类。陷入了同样的问题!
@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.save();
    canvas.translate(mPosX, mPosY);
    canvas.scale(mScaleFactor, mScaleFactor);

    canvas.drawBitmap(MoveImageTestActivity.bmp, 0,0,null);
    if(mScaleFactor!=1.f)
        canvas.restore();

    if(isDrawing)
        canvas.drawPath(tempPath,get_paint());

    if(mScaleFactor==1.f)
        canvas.restore();
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
    mScaleDetector.onTouchEvent(ev);
    final int action = ev.getAction();
    switch (action & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN: {
        final float x = ev.getX();
        final float y = ev.getY();

        if(isDrawing){
            float dx = ev.getX();
            float dy = ev.getY();;

            if(mScaleFactor==1.f){
                dx = ev.getX() - mPosX;
                dy = ev.getY() - mPosY;
            }
            tempPath = new Path();
            tempPath.moveTo(dx,dy);
        }else{
            mLastTouchX = x;
            mLastTouchY = y;
            // Save the ID of this pointer
            mActivePointerId = ev.getPointerId(0);
        }
        break;
    }

    case MotionEvent.ACTION_MOVE: {
        // Find the index of the active pointer and fetch its position
        if(isDrawing){
            float dx = ev.getX();
            float dy = ev.getY();;

            if(mScaleFactor==1.f){
                dx = ev.getX() - mPosX;
                dy = ev.getY() - mPosY;
            }
            tempPath.lineTo(dx,dy);
        }else{
            final int pointerIndex = ev.findPointerIndex(mActivePointerId);
            final float x = ev.getX(pointerIndex);
            final float y = ev.getY(pointerIndex);

            final float dx = x - mLastTouchX;
            final float dy = y - mLastTouchY;

            mPosX += dx;
            mPosY += dy;

            mLastTouchX = x;
            mLastTouchY = y;
        }
        break;
    }
    case MotionEvent.ACTION_UP: {
        points.clear();
        mActivePointerId = INVALID_POINTER_ID;
        break;
    }

    case MotionEvent.ACTION_CANCEL: {
        mActivePointerId = INVALID_POINTER_ID;
        break;
    }

    case MotionEvent.ACTION_POINTER_UP: {
        if(!isDrawing){
            // Extract the index of the pointer that left the touch sensor
            final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
            final int pointerId = ev.getPointerId(pointerIndex);
            if (pointerId == mActivePointerId) {
                // This was our active pointer going up. Choose a new
                // active pointer and adjust accordingly.
                final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                mLastTouchX = ev.getX(newPointerIndex);
                mLastTouchY = ev.getY(newPointerIndex);
                mActivePointerId = ev.getPointerId(newPointerIndex);
            }
        }
        break;
    }
    }
    invalidate();
    return true;
}