Работаем с графикой. Основы

Цель нашего урока - понять основы графики. Мы напишем простую рисовалку - хотя это слишком громко сказано. Пока мы сами рисовать ничего не будем - за нас это будет делать глупая машина, т.е. Android. Но тем не менее некоторые полезные вещи мы узнаем, а значит повысим свой профессиональный уровень. Продолжить своё обучение можно в разделе Котошоп.

Создадим новый проект SimplePaint. Далее в нём создадим новый класс Draw2D, который будет наследоваться от View. Именно в нем мы и будем проводить графические опыты. Щелкаем правой кнопкой мыши на имени проекта и выбираем в меню New→Class. В открывшемся диалоговом окне устанавливаем имя для класса Draw2D и указываем свой пакет в поле Package. Остальные настройки можем не трогать. Щелкаем кнопку Finish. Появится заготовка для класса.

Удаляем содержимое заготовки и вставляем следующие строки


package ru.alexanderklimov.simplepaint; // у вас будет свой пакет

public class Draw2D extends View{
    public Draw2D(Context context) {
	        super(context);
	}  
	@Override
	protected void onDraw(Canvas canvas){
	    super.onDraw(canvas);
    }
}

В данном коде мы наследуемся от класса android.view.View и создаем свой метод onDraw(Canvac canvas). Все строчки, которые будет подчеркивать Eclipse, нужно проверить и импортировать необходимые пакеты самостоятельно.

Далее необходимо загрузить наш созданный класс при старте программы. Открываем основной java-файл и заменяем строчку после super.onCreate(savedInstanceState):


// эта строчка нам не нужна: setContentView(R.layout.main);
Draw2D d = new Draw2D(this);
setContentView(d);

Подготовительные работы закончены. Перейдем к графике. Весь дальнейший код мы будем писать в классе Draw2D. Совсем коротко о теории рисования. Для графики используется холст Canvas - некая графическая поверхность для рисования. Прежде чем что-то рисовать, нужно определить некоторые параметры - цвет, толщина, фигура. Представьте себе, что вы рисуете на бумаге и в вашем распоряжении есть цветные карандаши, фломастеры, циркуль и т.п. Например, вы берете толстый красный фломастер и рисуете жирную линию, затем берете циркуль с желтым карандашом и рисуете окружность. Улавливаете аналогию? Теория закончена.

Вся работа с графикой происходит в методе onDraw класса Draw2D. Для начала сделаем холст белым, для этого сразу после строчки super.onDraw(c) пишем:


Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);

// закрашиваем холст белым цветом
paint.setColor(Color.WHITE);
canvas.drawPaint(paint);

Итак, холст готов. Далее начинается собственно рисование. Следуя описанному выше принципу мы задаем перед каждым рисованием свои настройки и вызываем нужный метод. Например, для того, чтобы нарисовать желтый круг мы включаем режим сглаживания, устанавливаем желтый цвет и вызываем метод drawCircle с нужными координатами и заливаем окружность выбранным цветом. У нас получилось симпатичное солнышко.


// Рисуем желтый круг
paint.setAntiAlias(true);
paint.setColor(Color.YELLOW);
canvas.drawCircle(450, 30, 25, paint);

Для рисования зеленого прямоугольника мы также задаем координаты и цвет. У нас получится красивая лужайка.


// Рисуем зеленый прямоугольник
paint.setColor(Color.GREEN);
canvas.drawRect(20, 200, 460, 230, paint);

Далее выведем текст поверх лужайки, чтобы все видели, что она предназначена только для котов. Устанавливаем синий цвет, стиль заливки, режим сглаживания и размер прямоугольника, в который будет вписан наш текст.


// Рисуем текст
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
paint.setTextSize(30);
canvas.drawText("Лужайка для котов", 30, 200, paint);

При желании можно вывести текст под углом. Пусть это будет лучик солнца.


// Текст под углом
int x = 310;
int y = 190;
 
paint.setColor(Color.GRAY);
paint.setTextSize(25);
String str2rotate = "Лучик солнца!";

// Создаем ограничивающий прямоугольник для наклонного текста
Rect rect = new Rect();

// поворачиваем холст по центру текста
canvas.rotate(-45, x + rect.exactCenterX(), y + rect.exactCenterY());

// Рисуем текст
paint.setStyle(Paint.Style.FILL);
canvas.drawText(str2rotate, x, y, paint);

// восстанавливаем холст
canvas.restore();

И завершим мы нашу композицию выводом стандартного значка приложения в нижнем углу экрана.


// Выводим значок из ресурсов
Resources res = this.getResources();
Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.icon);
canvas.drawBitmap(bitmap, 415, 655, paint);

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

Финальный рисунок выглядит следующим образом.

Основы графики

Исходный код к статье