Рисование пальцами

Я нашел этот небольшой пример кода, чтобы сделать рисунок пальцем:
http://marakana.com/tutorials/android/2d-graphics-example.html

Вот некоторые из соответствующих кода:

List<Point> points = new ArrayList<Point>(); @Override public void onDraw(Canvas canvas) { for (Point point : points) { canvas.drawCircle(point.x, point.y, 5, paint); } } public boolean onTouch(View view, MotionEvent event) { Point point = new Point(); point.x = event.getX(); point.y = event.getY(); points.add(point); invalidate(); Log.d(TAG, "point: " + point); return true; } 

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

После тестирования на моем Samsung GS3 я покрасил весь экран с размером круга 20, и чем ближе он добрался до полноцветного изображения, тем медленнее потребовалось рисование, а затем круги стали разнесены.

Нет, это имеет смысл в этом примере.

Он перебирает все точки, которые он хочет нарисовать. Это означает, что он добавляет каждую точку в массив, поэтому он может сразу перебирать все объекты.

Вы часто это видите в игровом программировании.


Это также очень расширяемо.

  1. Вы можете добавить столько очков, сколько хотите.
  2. Он поддерживает полиморфизм
  3. Вам не нужно создавать переменные для нескольких точек> Меньше кода

Во-первых, используйте штрих (не круги) для рисования линии. Во-вторых, приблизительный. Вот резюме:

  1. Измените Paint чтобы использовать штрих с width=5 . Это уменьшает необходимость рисовать так много кругов.
  2. Выберите порог, например 3px после которого вы добавите точку в onTouch() .

     if (Math.abs(previousX - event.getX()) < THRESHOLD && Math.abs(previousY - event.getY()) < THRESHOLD) { return; } previousX = event.getX(); previousY = event.getY(); // drawing update goes here 

    Это должно уменьшить количество (незаметных) точек.

  3. Используйте класс Picture или Path для рисования линии и используйте Canvas.drawPath() или Canvas.drawPicture() . Это, особенно для большого количества точек, действительно ускорит чертеж, поскольку все команды рисования будут переданы внутренней функции рисования в один вызов.

  4. Упростите форму при необходимости. Например, вы можете удалить старшие точки (что было бы идеальным вариантом для использования кругового буфера ), использовать алгоритм Ramer-Douglas-Peucker, который довольно легко реализовать, дает хорошие результаты и имеет сложность O(nlogn) .

Intereting Posts
Android textAllCaps в теме RelativeLayout не правильно обновляет ширину пользовательского вида Как реализовать несколько push-уведомлений GCM в одном приложении? Создание меню, но одна из двух кнопок не работает должным образом Как вызвать метод MainActivity из ViewHolder в RecyclerView.Adapter? Как отключить вкладку на экране Android? Установите индикатор выполнения поверх RecylerView и удалите после загрузки данных. Как импортировать или вставлять контакты из .vcf-файла в Android программно? Android несколько EditText с OnTextChangedListener Есть ли способ получить отладочный вывод с копированием и удалением в эмуляторе Android SDK? MediaPlayer setDataSource, лучше использовать путь или FileDescriptor? Android, как получить предпочтение экрана экрана checkBoxPreference Как получить список координат для уличных дорожек с помощью API Google Maps API? Android AsyncTask Лучший способ доступа к контексту активности Android – настройка экрана при появлении клавиатуры?