Эффективность Android MotionEvent ACTION_MOVE. Как улучшить производительность? - PullRequest
5 голосов
/ 13 декабря 2011

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

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

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? Как я могу получить больше баллов? Или есть что-то еще, что я должен делать?

---- EDIT ----

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

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

* +1034 * Пример: * * одна тысяча тридцать пять
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.

Был бы признателен за подробный ответ

Ответы [ 4 ]

7 голосов
/ 20 декабря 2011

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

Если вы работаете на Android 3.0+, нарисуйте все эти сумасшедшие вещи на GPU.Добавьте атрибут

android:hardwareAccelerated="true"

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

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

7 голосов
/ 16 декабря 2011

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

0 голосов
/ 22 декабря 2011

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

0 голосов
/ 16 декабря 2011

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

Thread.sleep(100);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...