Рассмотрим подробнее метод 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.Останется только добавить в наше приложение панель с кнопками для выбора цвета, толщины линий и т.п. и простенькая "рисовалка" готова :).
С какого перепугу цвет (color)задается как целое (int?
ОтветитьУдалитьЗачем нужна переменная initColor если в PaintView она нигде не используется?
А содержание MainActivity увидеть можно?
ОтветитьУдалитьЧто представляет собой метод getPoints() ?
ОтветитьУдалитьБуду очень благодарен за ответы
В MainActivity содержится массив точек изображения в виде ArrayList. Метод act.addPoint(Point point) добавляет точку в ArrayList а метод act.getPoints() возвращает ArrayList всех точек.
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьСПАСИБО БОЛЬШОЕ!!!
ОтветитьУдалитьТеперь буду думать над методом "ластик".
Ещё один нубский вопрос:
ОтветитьУдалитьКак изменять цвет области рисования?
Спасибо
Сам себе отвечу:
ОтветитьУдалитьМетодом setBackgroundColor() класса View
Автору ещё раз большое спасибо!
Здравствуйте!
ОтветитьУдалитьРеализуя данное чудо столкнулся с проблемой сохранения прорисованного в файл.
При попытке хотябы создать bitmap программа "ложиться".
Ниже привожу метод сожранения картинки:
private static void SavePicture(PaintView v, String folderToSave)
{
Bitmap b = Bitmap.createBitmap(v.getHeight(), v.getWidth(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
OutputStream fOut = null;
Time time = new Time();
time.setToNow();
try {
File file = new File(folderToSave, Integer.toString(time.year) + Integer.toString(time.month) + Integer.toString(time.monthDay) + Integer.toString(time.hour) + Integer.toString(time.minute) + Integer.toString(time.second) +".jpg"); // создать уникальное имя для файла основываясь на дате сохранения
fOut = new FileOutputStream(file);
b.compress(Bitmap.CompressFormat.JPEG, 85, fOut); // сохранять картинку в jpeg-формате с 85% сжатия.
fOut.flush();
fOut.close();
}
catch (Exception e)
{}
}
Довёл таки до кондиции рисовалку.
ОтветитьУдалитьПри linew > 1 рисовать не реально. Нужно очевидно не прямоугольник а круг рисовать, а для этого наверное придется отдельный класс "кружочков" создавать.
Автору большое спасибо!
А можете показать весь код MainActivity?А то я немножко не понял
ОтветитьУдалитьЭтож что за пример такой, автор видимо перепостил откуда-то, рисовать line и rect, накуй спаршивается, все инатми задается брееед, но все равно спасибо, у кого есть желание тот разберется, для тех кто хочет видеть MainActivity
ОтветитьУдалитьpublic class MainActivity extends Activity {
ArrayList arrayPoint = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Resources res = getResources();
int h = res.getDisplayMetrics().heightPixels;
int w = res.getDisplayMetrics().widthPixels;
PaintView paintView = new PaintView(this, 3, 100, 2, w, h);
setContentView(paintView);
}
public void addPoint(Point point) {
arrayPoint.add(point);
}
public ArrayList getPoints() {
return arrayPoint;
}
}
После ArrayList надо поставить Point в знаках меньше и больше <>, при размещение комментария они съедаются
УдалитьБольшое вам спасибо!!!
ОтветитьУдалитьА можно сами исходники? очень нужно)
ОтветитьУдалить