В этом уроке:
- работаем с Picture
Мы можем записать операции рисования на канве в некий шаблон, а затем многократно воспроизводить его. Для этого используется объект Picture.
Создадим проект:
Project name: P1521_Picture
Build Target: Android 2.3.3
Application name: Picture
Package name: ru.startandroid.develop.p1521picture
Create Activity: MainActivity
В манифесте для Activity необходимо прописать такую строку
android:hardwareAccelerated="false"
Без нее не будет работать.
MainActivity.java:
package ru.startandroid.develop.p1521picture; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Picture; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new DrawView(this)); } class DrawView extends View { Paint p; Path path; Picture picture; public DrawView(Context context) { super(context); p = new Paint(Paint.ANTI_ALIAS_FLAG); picture = new Picture(); Canvas canvas = picture.beginRecording(300, 300); p.setColor(Color.GREEN); canvas.drawCircle(150, 100, 80, p); p.setColor(Color.BLUE); canvas.drawRect(20, 70, 150, 200, p); p.setColor(Color.RED); path = new Path(); path.moveTo(170,80); path.lineTo(240, 210); path.lineTo(100, 210); path.close(); canvas.drawPath(path, p); picture.endRecording(); } @Override protected void onDraw(Canvas canvas) { canvas.drawARGB(80, 102, 204, 255); canvas.drawPicture(picture); } } }
Сначала создаем объект Picture, затем методом beginRecording начинаем запись. Этот метод возвращает нам канву, на ней мы и будем выполнять все операции, которые будут записаны. А на вход методу beginRecording необходимо передать ширину и высоту изображения, которое вы собираетесь записывать. Т.е. наш шаблон будет размером 300х300.
Записываем рисование круга, квадрата и треугольника, и затем, методом endRecording, завершаем запись.
В onDraw методом drawPicture выводим на нашу канву все то, что записали в picture.
Результат:
Отобразились все наши записанные действия.
У drawPicture есть, также, реализация, где мы можем менять размер выводимого изображения.
Перепишем класс DrawView:
class DrawView extends View { Paint p; Path path; Picture picture; Rect rect; Rect rect1; public DrawView(Context context) { super(context); rect = new Rect(0, 0, 100, 100); rect1 = new Rect(0, 0, 500, 200); p = new Paint(Paint.ANTI_ALIAS_FLAG); picture = new Picture(); Canvas canvas = picture.beginRecording(300, 300); p.setColor(Color.GREEN); canvas.drawCircle(150, 100, 80, p); p.setColor(Color.BLUE); canvas.drawRect(20, 70, 150, 200, p); p.setColor(Color.RED); path = new Path(); path.moveTo(170, 80); path.lineTo(240, 210); path.lineTo(100, 210); path.close(); canvas.drawPath(path, p); picture.endRecording(); } @Override protected void onDraw(Canvas canvas) { canvas.drawARGB(80, 102, 204, 255); canvas.drawPicture(picture); canvas.translate(300, 0); canvas.drawPicture(picture, rect); canvas.translate(0, 300); canvas.drawPicture(picture, rect1); } }
В onDraw мы один раз выводим шаблон без изменений, а затем пару раз с указанием областей. Объектами rect и rect1 мы задаем размеры этих областей, и в эти размеры будет смасштабировано изображение
Результат:
Т.е. кроме оригинала мы вывели то же изображение в размерах 100х100 и 500х200 и наш шаблон подстроился под эти размеры.
У picture есть метод draw, который делает то же, что и canvas.drawPicture. Но метод канвы (drawPicture) сохраняет состояние канвы перед выводом picture, а затем восстанавливает его (о состояниях канвы можно прочесть в Уроке 146).
Если верить хелпу, то воспроизведение Picture может дать прибавку к скорости, по сравнению с вызовом методов канвы напрямую.
На следующем уроке:
- меняем цвет кисти с помощью ColorFilter
Присоединяйтесь к нам в Telegram:
- в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Compose, Kotlin, RxJava, Dagger, Тестирование, Performance
- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня