Я используюсь для обработки графики с олдскульными библиотеками (аллегро, GD, pygame), где, если я хочу скопировать часть битового массива в другого... Я просто использую копирование битового массива.
Я пытаюсь выяснить, как сделать это в андроиде, и я стал очень смущенным. Так... у нас есть они Холст, которые только для записи, и Битовые массивы, которые только для чтения? Кажется слишком глупым быть реальным, должно быть что-то, что я пропускаю, но я действительно не могу понять это.
править: чтобы быть более точным..., если битовые массивы только для чтения, и холст, только для записи, я не могу блитировать в B, и затем B в C?
Код для копирования одного растрового изображения в другой выглядит следующим образом:
Rect src = new Rect(0, 0, 50, 50);
Rect dst = new Rect(50, 50, 200, 200);
canvas.drawBitmap(originalBitmap, src, dst, null);
Он указывает, что вы хотите скопировать верхний левый угол (50x50) растрового изображения, а затем растянуть его в растровое изображение 150x150 и записать его со смещением 50 пикселей от левый верхний угол холста.
Вы можете запускать рисование с помощью invalidate (), но я рекомендую использовать SurfaceView, если вы делаете анимацию. Проблема с invalidate заключается в том, что он отрисовывается только тогда, когда поток переходит в режим ожидания, поэтому вы не можете использовать его в цикле - он будет рисовать только последний кадр. Вот несколько ссылок на другие вопросы о графике, на которые я ответил, они могут быть полезны, чтобы объяснить, что я имею в виду.
В ответ на комментарии вот дополнительная информация: {{1} } Если вы получаете Canvas из SurfaceHolder.lockCanvas (), то я не думаю, что вы можете скопировать остаточные данные, которые были в нем, в Bitmap. Но этот элемент управления предназначен не для этого - вы используете только тогда, когда вы все разобрали и готовы рисовать.
Что вы хотите сделать, так это создать холст, который преобразуется в растровое изображение, используя
Canvas canvas = new Canvas(yourBitmap)
. Затем вы можете выполнять любые преобразования и операции рисования, какие захотите. yourBitmap будет содержать всю самую свежую информацию. Затем вы используете держатель поверхности следующим образом:
Canvas someOtherCanvas = surfaceHolder.lockCanvas()
someOtherCanvas.drawBitmap(yourBitmap, ....)
Таким образом, вы всегда получаете свой Bitmap, в котором содержится вся информация, которую вы пытаетесь сохранить.
В 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();
}
Приведенный выше код просто постоянно перерисовывает растровое изображение, конечно, вы хотите добавить дополнительную вещь для рисования и рассмотреть возможность использования функции времени который вызывает недействительность, поэтому он не работает постоянно. Я бы посоветовал взглянуть на источники о лунных жителях.