Освой Android играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Почитайте статью Генератор случайных котов за 8 шагов. В ней рассказывается о создании кошачьих морд на холсте через JavaScript. Ваша задача - портировать идею на Android.
Допустим, вы ещё плохо ориентируетесь в программировании под Android. Поэтому я дам вам "плохой" код, который послужит основой.
Для начала создадим отдельный класс CatFaceView. В конструкторе инициализируем настойки для кисти и выберем радиус для морды.
private void init() {
mFacePaint.setAntiAlias(true);
mFacePaint.setColor(Color.BLACK); // черный цвет
mFacePaint.setStyle(Paint.Style.STROKE); // обводка
// Выбираем радиус от некоторого минимального значения до некоторого максимального значения
Random random = new Random();
mRadius = random.nextInt(MAX_RADIUS - MIN_RADIUS + 1) + MIN_RADIUS;
}
Рисование происходит в методе onDraw(). Разобъём задачу на отдельные блоки - рисуем морду, глаза, уши, нос, рот и т.д.
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(250, 300, mRadius, mFacePaint);
drawWhiskers(canvas);
drawLefEye(canvas);
drawRightEye(canvas);
drawLeftEar(canvas);
drawRightEar(canvas);
drawNose(canvas);
}
Каждый отдельный метод вызывает простейшие графические операции Canvas - нарисовать круг, овал, линию и т.п.
Я взял конкретное китайское устройство с определённым разрешением экрана и вручную стал подбирать значения, чтобы получить что-то похожее на морду кота.
Если вы запустите мой пример на своём устройстве, то можете получить совсем не такой результат. Поэтому в качестве домашнего задания вам нужно доработать приложение, чтобы оно стало универсальным и хорошо работало на любых устройствах. А также вы должны реализовать весь функционал, который описан в статье, на которую я дал ссылку выше.
Вы можете затем присылать свои варианты отдельных фрагментов кода. Лучшие из них буду добавлять в статью. Так мы сможем получить самый лучший генератор котов. Дерзайте!
Полный код класса
package ru.alexanderklimov.catface;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import java.util.Random;
public class CatFaceView extends View {
private Paint mFacePaint = new Paint();
private int mRadius;
private final int MAX_RADIUS = 90;
private final int MIN_RADIUS = 80;
public CatFaceView(Context context) {
super(context);
init();
}
public CatFaceView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CatFaceView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(250, 300, mRadius, mFacePaint);
drawWhiskers(canvas);
drawLefEye(canvas);
drawRightEye(canvas);
drawLeftEar(canvas);
drawRightEar(canvas);
drawNose(canvas);
}
private void init() {
mFacePaint.setAntiAlias(true);
mFacePaint.setColor(Color.BLACK);
mFacePaint.setStyle(Paint.Style.STROKE);
Random random = new Random();
mRadius = random.nextInt(MAX_RADIUS - MIN_RADIUS + 1) + MIN_RADIUS;
}
private void drawWhiskers(Canvas canvas) {
canvas.drawLine(60, 280, 200, 310, mFacePaint);
canvas.drawLine(65, 295, 200, 315, mFacePaint);
canvas.drawLine(75, 345, 210, 320, mFacePaint);
canvas.drawLine(300, 310, 440, 280, mFacePaint);
canvas.drawLine(300, 315, 440, 295, mFacePaint);
canvas.drawLine(295, 325, 435, 345, mFacePaint);
}
private void drawLefEye(Canvas canvas) {
mFacePaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(205, 270, 10, mFacePaint);
mFacePaint.setStyle(Paint.Style.STROKE);
}
private void drawRightEye(Canvas canvas) {
mFacePaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(295, 270, 10, mFacePaint);
mFacePaint.setStyle(Paint.Style.STROKE);
}
private void drawLeftEar(Canvas canvas) {
canvas.drawLine(190, 165, 225, 220, mFacePaint);
canvas.drawLine(190, 165, 175, 258, mFacePaint);
}
private void drawRightEar(Canvas canvas) {
canvas.drawLine(290, 165, 295, 225, mFacePaint);
canvas.drawLine(290, 165, 260, 220, mFacePaint);
}
private void drawNose(Canvas canvas) {
mFacePaint.setStyle(Paint.Style.FILL);
RectF oval = new RectF();
oval.set(180F, 295F, 300F, 350F);
canvas.drawArc(oval, 250, 50, true, mFacePaint);
mFacePaint.setStyle(Paint.Style.STROKE);
}
}
Вызываем класс в главной активности.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new CatFaceView(this));
}