Android Scaling Canvas Bitmap - PullRequest
       3

Android Scaling Canvas Bitmap

5 голосов
/ 07 февраля 2011

У меня есть приложение для рисования, которое позволяет пользователю рисовать на пустой холст.Я пытаюсь нарисовать масштабированное «миниатюру» текущего растрового изображения, чтобы, когда пользователь масштабировал в представлении, они могли ссылаться на миниатюру, чтобы понять, где они находятся в общем холсте рисования.У меня работает масштабирование, и я отображаю миниатюру в правильном месте, но кажется, что миниатюра не обновляется при последующих 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);
}

Затем, когда пользовательВызывается drawable и 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 ()вызовы, масштабированное растровое изображение не изменилось по сравнению с его исходным состоянием, хотя полноразмерный активный холст показывает все чертежи и т. д. На основании некоторого тестирования мне кажется, что пока я устанавливаю растровое изображение с первоначальным вызовомdraw (mCanvas); последующие onDraws записывают в базовое растровое изображение, а не в однуcified in onSizeChanged ().

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

Спасибо,

Пол

Ответы [ 2 ]

7 голосов
/ 08 февраля 2011
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 имеет значение true все время, когда масштабирование превышает 1

0 голосов
/ 30 ноября 2016

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

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

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...