Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
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 - нарисовать круг, овал, линию и т.п.

Я взял конкретное китайское устройство с определённым разрешением экрана и вручную стал подбирать значения, чтобы получить что-то похожее на морду кота.

CatFace

Если вы запустите мой пример на своём устройстве, то можете получить совсем не такой результат. Поэтому в качестве домашнего задания вам нужно доработать приложение, чтобы оно стало универсальным и хорошо работало на любых устройствах. А также вы должны реализовать весь функционал, который описан в статье, на которую я дал ссылку выше.

Вы можете затем присылать свои варианты отдельных фрагментов кода. Лучшие из них буду добавлять в статью. Так мы сможем получить самый лучший генератор котов. Дерзайте!

Полный код класса


package ru.alexanderklimov.as21;

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));
}
Реклама