Подтвердить что ты не робот

Как blit() в android?

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

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

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

4b9b3361

Ответ 1

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

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, если вы делаете анимацию. Проблема с invalidate заключается в том, что она только рисует, как только поток простаивает, поэтому вы не можете использовать его в цикле - он будет рисовать только последний кадр. Вот некоторые ссылки на другие вопросы, которые я ответил о графике, они могут быть полезны, чтобы объяснить, что я имею в виду.


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

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

Canvas canvas = new Canvas(yourBitmap)

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

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

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

Ответ 2

В андроиде вы рисуете на холсте, и когда вы хотите его обновить, вы вызываете 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();
}

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