Рисование фигур пальцами
от aNNiMON
В Android очень легко рисовать простые фигуры пальцами.
Для начала нужно создать пользовательский View:
Затем понадобятся объекты: Bitmap, Canvas и Paint.
Для инициализации изображения и канвы в DrawingView нужно переопределить метод:
Для создания канваса нужен Bitmap на котором собственно и будет выполняться рисование.
Теперь нужно создать объект рисования. Paint хранит информацию о стиле и цвете, которым в данный момент выполняется рисование. Например:
Здесь можно использовать любой желаемый стиль.
Наконец, следует переопределить методы onDraw() и onTouchEvent().
Можно применить подобную логику для рисования линий, сглаженных линий, окружностей, квадратов, прямоугольников, треугольников...
В начале рисования срабатывает событие MotionEvent.ACTION_DOWN. Здесь можно сохранить начальную точку, потому что она может пригодиться в последующих шагах.
Когда мы водим пальцем по экрану, срабатывает событие MotionEvent.ACTION_MOVE, а когда палец отрывается от экрана, срабатывает MotionEvent.ACTION_UP.
Метод invalidate() передаёт управление методу onDraw(), что приводит к перерисовке экрана.
Демо видео
Исходный код: GitHub
Автор оригинала: Gabriele Mariotti
Для начала нужно создать пользовательский View:
- public class DrawingView extends View { }
- protected Paint mPaint;
- protected Bitmap mBitmap;
- protected Canvas mCanvas;
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
- mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
- mCanvas = new Canvas(mBitmap);
- }
Теперь нужно создать объект рисования. Paint хранит информацию о стиле и цвете, которым в данный момент выполняется рисование. Например:
- public DrawingView(Context context) {
- super(context);
- init();
- }
- protected void init() {
- mPaint = new Paint(Paint.DITHER_FLAG);
- mPaint.setAntiAlias(true);
- mPaint.setDither(true);
- mPaint.setColor(getContext().getResources().getColor(android.R.color.holo_blue_dark));
- mPaint.setStyle(Paint.Style.STROKE);
- mPaint.setStrokeJoin(Paint.Join.ROUND);
- mPaint.setStrokeCap(Paint.Cap.ROUND);
- mPaint.setStrokeWidth(TOUCH_STROKE_WIDTH);
- }
Наконец, следует переопределить методы onDraw() и onTouchEvent().
Можно применить подобную логику для рисования линий, сглаженных линий, окружностей, квадратов, прямоугольников, треугольников...
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- // Получаем точку касания
- mx = event.getX();
- my = event.getY();
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- // Первое касание. Сохраняем начальную позицию
- invalidate();
- case MotionEvent.ACTION_MOVE:
- // Рисуем
- invalidate();
- case MotionEvent.ACTION_UP:
- // Завершаем рисование и рисуем всё в канвас.
- invalidate();
- }
- return true;
- }
В начале рисования срабатывает событие MotionEvent.ACTION_DOWN. Здесь можно сохранить начальную точку, потому что она может пригодиться в последующих шагах.
Когда мы водим пальцем по экрану, срабатывает событие MotionEvent.ACTION_MOVE, а когда палец отрывается от экрана, срабатывает MotionEvent.ACTION_UP.
Метод invalidate() передаёт управление методу onDraw(), что приводит к перерисовке экрана.
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- canvas.drawBitmap(mBitmap, 0, 0, mPaint);
- // Рисуем фигуру
- }
Прямоугольник
Квадрат
Окружность
Прямая линия
Сглаженная линия
Треугольник
Теперь можно дать ребёнку поиграться с этим приложением и он нарисует маленький домик у моря с прекрасным солнцем на небе.Демо видео
Исходный код: GitHub
Автор оригинала: Gabriele Mariotti