Случай использования:
Мне нужно нарисовать сотни строк и несколько фрагментов текста на моем представлении. Мне нужно дать эффект прокрутки, для которого я захватываю событие ACTION_MOVE
и перерисовываю все строки с обновленными точками. Чтобы получить результат желания, я попытался с разными подходами, но никто не работает по назначению.
Подход 1
Я создал собственный класс, который расширяет View
. Все чертежи и вычисления выполняются непосредственно в моем методе onDraw()
. Поскольку в методе onDraw()
выполняется так много операций, производительность приложения очень низкая. Я даже проверил производительность с помощью профиля GPU рендеринга, и я вижу, что линии очень высокие.
Подход 2
Я создал растровое изображение и после рисования всех строк на моем растровом изображении в другом потоке, я использовал postInvalidate()
для рисования растрового изображения в методе onDraw()
:
mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
mBufferedBitmap.eraseColor(Color.TRANSPARENT);
Canvas mBufferedCanvas = new Canvas(mBufferedBitmap);
drawLines(mBufferedCanvas)
postInvalidate();
Так как я стираю весь предыдущий рисунок на растровом изображении и рисую новые строки с обновленными точками, на экране появляется мерцание.
Подход 3
Я попытался расширить свой собственный класс до SurfaceView
и выполнить все операции над объектом canvas в другом потоке. Но поскольку SurfaceView
использует CPU для операций рисования, производительность будет низкой в мобильных телефонах с низкой конфигурацией.
Может ли кто-нибудь вести меня, как достичь этой задачи с лучшей производительностью?