Android рисует линию на масштабированном и преобразованном изображении на холсте

У меня проблема с рисованием линии на масштабированном и преобразованном изображении на холсте, а для преобразованного я могу рисовать линию на изображении, но если изображение было масштабировано (увеличение или уменьшение), то линия неожиданно нарисовала пиксель с помощью касания пальцем. Поскольку я работаю над приложением для рисования, но не знал об этом больше, поэтому мне нужна ваша помощь, я искал его в Google, но не повезло, я ничего не нашел.

вот изображения 1-е по умолчанию работает правильно, а второе перемещенное изображение работает правильно, правильно рисует линию

введите здесь описание изображениявведите здесь описание изображения

в то время как в третьем на масштабированном изображении рисуется неправильно, я имею в виду, что если начать рисовать с верхнего/левого угла, то точка рисования линии будет другой, как здесь

введите здесь описание изображения

если вам нужен код, скажите, я отредактирую вопрос


person Pratik    schedule 16.01.2012    source источник


Ответы (1)


Хорошо, после многих реализаций я получил решение для этого.

Это мой код для рисования в onDraw()

@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();
}

здесь вы должны проверить значение коэффициента масштабирования для восстановления холста. Если значение коэффициента масштабирования было по умолчанию, то есть 1.f, и изображение было просто перемещено, затем восстановите его после линии/пути рисования, если коэффициент масштабирования не был равен 1.f (по умолчанию), затем восстановите холст 1-м, затем нарисуйте линию/ путь при использовании времени рисования касанием пальца.

вот мой код onTouch()

@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;
}
person Pratik    schedule 18.01.2012
comment
Вы можете опубликовать свой класс просмотра? - person kyogs; 14.05.2013
comment
Да, пожалуйста, опубликуйте свой класс просмотра. Столкнулся с той же проблемой! - person Iram Bukhari; 19.05.2014