Рассмотрим подробнее метод onTouchEvent. Для событий прикосновения и перемещения мы получаем координаты точки на экране и создаём экземпляр Point, добавляя его в ArrayList с помощью метода addPoint(point) в MainActivity. Почему не хранить коллекцию точек прямо в классе? Так проще обрабатывать события, требующие перерисовки холста. Просто создаём новый холст, а данные для отрисовки он возьмёт в MainActivity.
- public class PaintView extends View {
- private int linecolor, alpha, lwidth;
- private int WIDTH;
- private int HEIGHT;
- MainActivity act;
- public PaintView(MainActivity act, int linecolor, int alpha, int lwidth, int width, int height) {
- super(act);
- this.act = act;
- this.linecolor = linecolor;
- this.alpha = alpha;
- this.WIDTH = width;
- this.HEIGHT = height;
- this.lwidth = lwidth;
- }
- @Override
- public boolean onTouchEvent(MotionEvent e) {
- int action = e.getAction();
- if (action == MotionEvent.ACTION_UP) {
- act.addPoint(null);
- } else if (action == MotionEvent.ACTION_MOVE || action == MotionEvent.ACTION_DOWN) {
- Point point = new Point(Math.round(e.getX()), Math.round(e.getY()), linecolor, alpha, lwidth);
- act.addPoint(point);
- postInvalidate();
- }
- return true;
- }
- @Override
- protected void onDraw(Canvas c) {
- Point curr = null;
- for (Point data : act.getPoints()) {
- if (curr != null && data != null) {
- Paint paint = new Paint();
- paint.setColor(data.getColor());
- paint.setAlpha(data.getAlpha());
- if (data.getWidth()==1) {
- c.drawLine(curr.getX(), curr.getY(), data.getX(), data.getY(), paint);
- } else {
- c.drawRect(curr.getX(), curr.getY(), data.getX()+data.getWidth(), data.getY()+data.getWidth(), paint);
- }
- }
- curr = data;
- }
- }
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- this.setMeasuredDimension(WIDTH, HEIGHT);
- }
- }
Класс Point выглядит просто:
public class Point {
private int x, y, color, alpha, width;
public Point(int x, int y, int color, int alpha, int width) {
this.x = x;
this.y = y;
this.color = color;
this.alpha = alpha;
this.width = width;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getColor() {
return color;
}
public int getAlpha() {
return alpha;
}
public int getWidth() {
return width;
}
}
...это обычное хранилище координат точки и её характеристик.Вызываем наш холст из MainActivity следующим образом:
PaintView paint = new PaintView(this, initColor, alpha, linew, w, h);
Тут:this - экземпляр MainActivity, из которого, собственно делаем вызов
initColor, alpha, linew - настройки цвета, прозрачности и толщины линии
w и h - ширина и высота доступной для рисования области в пикселях. Получаем её так:
Resources res = getResources();
int h = res.getDisplayMetrics().heightPixels;
int w = res.getDisplayMetrics().widthPixels;
Созданный экземпляр холста может быть добавлен в нашу структуру View с помощью метода addView родительского контейнера а контейнер верхнего уровня устанавливаем как контент окна методом setContentView.Останется только добавить в наше приложение панель с кнопками для выбора цвета, толщины линий и т.п. и простенькая "рисовалка" готова :).