В этом уроке:

- работаем с 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 

- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня




Language

Автор сайта

Дмитрий Виноградов

Подробнее можно посмотреть или почитать.

Никакие другие люди не имеют к этому сайту никакого отношения и просто занимаются плагиатом.

Социальные сети

 

В канале я публикую ссылки на интересные и полезные статьи по Android

В чате можно обсудить вопросы и проблемы, возникающие при разработке



Группа ВКонтакте



Поддержка проекта

Яндекс
410011180491924

WebMoney
R248743991365
Z551306702056

Paypal