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

Я нашел этот небольшой пример кода, чтобы сделать рисунок пальцем:
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) Файлы cookie сеансов Cordova не работают на Android Lollipop Как я могу использовать точку останова в Eclipse во время исполнения кода Android? Как удалить заголовок при запуске приложения для Android? Почему мой onItemSelectedListener не вызван в ListView? Как добавить фрагмент в Activity с программно созданным контентом С использованием ресурсов по умолчанию в выпадающей папке (размер MDPI), какая точка в папке drawable-mdpi? Recycleview в Coordinatorlayout Где ansroid.os.SystemProperties хранит свой ключ / значения? JniLibs не расширены в градусах Run-as Пакет «abc» неизвестен – Galaxy S4 Jellybean или Android 4.3 Как игнорировать пусковые установки AndroidManifest.xml проекта библиотеки «Идентификатор ресурса не найден для атрибута« showAsAction »в пакете« Android ». Настройка EditText с помощью «url» inputType Android mediarecorder записывает только ужасное видео