Как блит () в андроид? - PullRequest
       47

Как блит () в андроид?

14 голосов
/ 11 апреля 2010

Я привык обрабатывать графику с помощью библиотек старой школы (allegro, GD, pygame), где, если я хочу скопировать часть растрового изображения в другое ... Я просто использую blit.

Я пытаюсь понять, как это сделать в Android, и я очень запутался. Итак ... у нас есть эти холсты, которые только для записи, и растровые изображения, которые только для чтения? Это кажется слишком глупым, чтобы быть реальным, должно быть, что-то мне не хватает, но я действительно не могу понять это.

edit : если быть более точным ... если растровые изображения доступны только для чтения, а canvas - только для записи, я не могу разбить A в B, а затем B в C? *

Ответы [ 2 ]

17 голосов
/ 21 апреля 2010

Код для копирования одного растрового изображения в другое выглядит так:

Rect src = new Rect(0, 0, 50, 50); 
Rect dst = new Rect(50, 50, 200, 200);  
canvas.drawBitmap(originalBitmap, src, dst, null);

Это означает, что вы хотите скопировать верхний левый угол (50x50) растрового изображения, а затем растянуть его в растровое изображение 150x150 и записать его со смещением 50px от верхнего левого угла вашего холста.

Вы можете запустить рисование с помощью invalidate (), но я рекомендую использовать SurfaceView, если вы делаете анимацию. Проблема с инвалидом состоит в том, что он рисует только тогда, когда поток простаивает, поэтому вы не можете использовать его в цикле - он будет рисовать только последний кадр. Вот несколько ссылок на другие вопросы, которые я ответил о графике, они могут быть полезны, чтобы объяснить, что я имею в виду.


В ответ на комментарии вот дополнительная информация: Если вы получаете Canvas из SurfaceHolder.lockCanvas (), то я не думаю, что вы сможете скопировать оставшиеся в нем данные в растровое изображение. Но это не то, для чего предназначен этот элемент управления - вы используете его только тогда, когда вы все разобрались и готовы рисовать.

То, что вы хотите сделать, это создать холст, который рисует в растровое изображение, используя

Canvas canvas = new Canvas(yourBitmap)

Затем вы можете делать любые преобразования и рисовать операции, которые вы хотите. yourBitmap будет содержать всю новейшую информацию. Тогда Вы используете держатель поверхности следующим образом:

Canvas someOtherCanvas = surfaceHolder.lockCanvas()
someOtherCanvas.drawBitmap(yourBitmap, ....)

Таким образом, у вас всегда есть ваш Bitmap, в котором есть вся информация, которую вы пытаетесь сохранить.

0 голосов
/ 21 апреля 2010

В Android вы рисуете на холст, и когда вы хотите обновить его, вы вызываете invalidate, который перерисовывает этот холст на экран. Я предполагаю, что вы переопределили метод onDraw своего представления, поэтому просто добавьте invalidate ();

@Override
public void onDraw(Canvas canvas) {
    // Draw a bitmap to the canvas at 0,0
    canvas.drawBitmap(mBitmap, 0, 0, null);
    // Add in your drawing functions here
    super.onDraw(canvas);
    // Call invalidate to draw to screen
    invalidate();
}

Приведенный выше код просто постоянно перерисовывает растровое изображение, разумеется, вы хотите добавить дополнительные элементы для рисования и рассмотреть возможность использования функции синхронизации, которая вызывает аннулирование, чтобы он не работал постоянно. Я бы посоветовал взглянуть на источники лунных жителей.

...