Intereting Posts
Alarm Manager – Планирование нескольких неповторяющихся событий Утечка активности при использовании слушателей волейбола Android: макеты «скользят» с экрана? Мягкая клавиатура в веб-просмотре – нет «следующей» кнопки для вкладок между полями ввода Как получить видео с 360 VR в правильном формате для Android VR View Приложение Создать UUID? PagerSlidingTabStrip изменить шрифт заголовков Как получить все имена файлов внутри папки в папке с ресурсами в Android? Задержка действий в android Как курсор SQLite работает внутри? Apache http client или URLConnection Лучший способ показать три пункта пункта меню в панели действий, не используя метод «взломать» Я предложил пользователю включить gps-настройки, но как я могу проверить, действительно ли пользователь включил местоположение gps на своем телефоне? Android: animateLayoutChanges не будет работать в родительском макете Android OCR: невозможно разрешить ошибку для getBoundingBox

Эффективность Android MotionEvent ACTION_MOVE. Как повысить производительность?

В настоящее время я работаю над приложением, которое позволяет свободно рисовать.

Текущий метод, который я использую, выглядит следующим образом:

CurrentLine – это список, в котором хранится история всех точек, возвращаемых ACTION_MOVE .

 public boolean onTouchEvent (MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_MOVE: Point p = new Point(event.getX(),event.getY()); currentLine.addPoint(p); invalidate(); break; } return true; } 

Затем я беру эти точки и рисую их в методе onDraw своего класса.

 @Override protected void onDraw(Canvas c) { super.onDraw(c); //Draw Background Color c.drawColor(Color.BLUE); //Setup Paint Paint p = new Paint(); p.setStyle(Style.FILL); p.setColor(COLOR.WHITE); //iterate through points if(currentLine.size()>0){ for(int x = 0;x<currentLine.size();x++){ c.drawCircle(currentLine.get(x).getX(), currentLine.get(x).getY(), 3, p); } } } 

И этот метод отлично работает, без каких-либо отставаний.

Кроме того, он не получает достаточного количества очков, которые ему нужны.

Например, если мне нужно быстро перетащить палец по всему экрану, он может набрать только 15 очков всего события.

Как я могу улучшить производительность / скорость MotionEvent? Как я могу получить больше очков? Или есть что-то еще, что я должен делать?

—-РЕДАКТИРОВАТЬ—-

Мне удалось решить это сам.

Вместо использования drawCircle я переключился на drawLine .

Пример:

 if(points.size()>0){ for(int x = 0;x<points.size()-1;x++){ c.drawLine(points.get(x).getX(), points.get(x).getY(), points.get(x+1).getX(), points.get(x+1).getY(), p); } } 

Это создает сплошные линии, чего я хотел.

Однако, ради знания, я все равно хотел бы знать, как ускорить MotionEvents.

Подробный ответ будет оценен

Очевидно, узким местом является метод рисования.

Если вы работаете над android 3.0+, нарисуйте все эти сумасшедшие вещи на графическом процессоре. Добавить атрибут

 android:hardwareAccelerated="true" 

<application> в вашем манифесте. Это невероятно увеличит время рисования.

Кроме того, попробуйте не перерисовывать все это, если нужно лишь немного обновить. Вызовите invalidate (Rect dirty) вместо invalidate ().

Вы также должны получить больше очков, используя функции event.getHistoricalX / Y ()

Поместите небольшой нить в событие движения; Что помогло мне решить проблему, когда тонна событий движения заклинила слушателя.

 Thread.sleep(100); 

недействительными (); Вредно для производительности. Попробуйте вычислить границы rect и вызвать invalidate (bounds)