Масштабирование растрового изображения холста Android

У меня есть приложение для рисования, которое позволяет пользователю рисовать на пустом холсте. Я пытаюсь нарисовать масштабированную «миниатюру» текущего растрового изображения, чтобы, когда пользователь масштабировал в представлении, он мог ссылаться на миниатюру, чтобы получить представление о том, где они находятся на общем холсте рисования. У меня работает масштабирование, и я показываю миниатюру в правильном месте, но похоже, что миниатюра не обновляется при последующих onDraws, когда добавляются новые линии / фигуры.

Чтобы у меня был доступ к базовому растровому изображению для этого представления (чтобы показать эскиз, иметь возможность легко сохранить растровое изображение в файл и т. Д.), Я делаю следующее в onSizeChanged () для представления:

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);

    // set the canvas height, panning, etc, based on the now inflated View
    mWidth      = getWidth();
    mHeight     = getHeight();
    mAspectRatio    = mWidth / mHeight;
    mPanX       = 0;
    mPanY       = 0;

    // create the Bitmap, set it to the canvas
mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
mCanvas.setBitmap(mBitmap);
draw(mCanvas);
}

Затем, когда пользователь рисует и вызывается invalidate (), я делаю следующее в onDraw () для создания эскиза:

@Override
protected void onDraw(Canvas canvas) {
    <snipped code that draws paths, shapes to canvas>

    if (mScaled) {
        Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int) thumbHeight, false);
        canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint);
    }
}

Миниатюра отображается в пространстве, определяемом функцией thumbnailRectF с помощью thumbCanvasPaint, но в последующих вызовах onDraw () масштабированное растровое изображение не изменилось по сравнению с исходным состоянием, даже если полноразмерный активный холст показывает все рисунки и т. Д. при некотором тестировании мне кажется, что пока я устанавливаю Bitmap с помощью начального вызова draw (mCanvas);, последующие onDraws записывают в базовый Bitmap, а не в тот, который указан в onSizeChanged ().

Итак, я думаю, я пытаюсь понять, как связать холст onDraw с растровым изображением, к которому я могу получить доступ для изменения размеров, сохранения и т. Д. Глядя на этот вопрос, я думал, что draw (mCanvas); вызов привяжет onDraw к растровому изображению, указанному в mCanvas (в моем случае, mBitmap), но на практике он, похоже, не работает, поскольку это касается обновлений холста.

Спасибо,

Павел


person Paul Mennega    schedule 07.02.2011    source источник


Ответы (2)


canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint); 

должен измениться на

canvas.drawBitmap(out, new Rect(0,0,mBitmap.getWidht, mBitmap.getheight), thumbnailRectF, thumbCanvasPaint);

Нет необходимости в

Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int)....

Также проверьте, что mScaled всегда истинно, когда масштаб больше 1

person Lumis    schedule 08.02.2011
comment
Вау, да, эта связанная программа построена почти на 100% одинаково, за исключением моей проблемы с привязкой растрового изображения к холсту и т. Д. Пробуем это решение сейчас. - person Paul Mennega; 08.02.2011

Масштабируйте растровое изображение на Bitmap.createScaledBitmap, тогда рисовать не удастся.

Решение для масштабирования растрового изображения холста - использовать эту функцию (из docs)

void drawBitmap (Bitmap bitmap,  Rect src, Rect dst, Paint paint)
// dst : Rect: The rectangle that the bitmap will be scaled/translated to fit into

поэтому, изменив размер dst, размер вашего растрового изображения изменится

Вот пример, если я хочу нарисовать растровое изображение в верхнем левом углу и масштабировать его до 100px x 120px

Bitmap bitmap = BitmapFactory.decodeResource(...);//bitmap to be drawn

float left = 0;
float top = 0;
RectF dst = new RectF(left, top, left + 100, top + 120); // width=100, height=120

canvas.drawBitmap(bitmap, null, dst, null);
person Linh    schedule 30.11.2016