Android рисовать линии на масштабированном и преобразованном изображении на холсте - PullRequest
2 голосов
/ 16 января 2012

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

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

enter image description here enter image description here

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

enter image description here

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

1 Ответ

2 голосов
/ 18 января 2012

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

Это мой код для рисования в 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;
}
...