Как blit () в android?

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

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

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

Solutions Collecting From Web of "Как blit () в android?"

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

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

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

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

  • Как нарисовать прямоугольник (пустой или заполненный, и несколько других вариантов)
  • Как создать пользовательский SurfaceView для анимации
  • Ссылки на код для приложения со случайным ударом шаров на экране, также включая сенсорный контроль
  • Дополнительная информация о SurfaceView и Invalidate ()
  • Некоторые трудности с рутинными вещами

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

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

 Canvas canvas = new Canvas(yourBitmap) 

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

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

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

В 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(); } 

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