Частичная аннулирование Android не работает должным образом с аппаратным ускорением
Я знаю, что это тот же вопрос, что и частичное недопустимое ускорение андроида-просмотра-с-аппаратным ускорением, но я подумал, что объясню свою проблему более подробно, и надеюсь, что кто-то найдет ответ на вопрос, как ее решить.
Я написал простое приложение TicTacToe, которое отлично работало на эмуляторе. Но не работал на устройстве, так как я обнаружил, что оно работало как положено на устройстве, когда я отключил аппаратное ускорение.
Все поля нарисованы с Canvas.drawBitmap()
также "пустые" поля с пустым белым изображением. Линии нарисованы с Canvas.drawLine()
Я использую частичное аннулирование с invalidate(Rect)
потому что я хочу перерисовать только область, которая была выбрана, чтобы установить крест / круг с соответствующим изображением, используя снова Canvas.drawBitmap()
, Но тогда вся область становится недействительной, то есть я вижу, что вся область / экран серого цвета (белые изображения и линии исчезли), и в выбранной области установлено только изображение для креста / круга.
Когда я распечатаю недействительное поле прямоугольник с Canvas.getClipBounds()
в методе onDraw()
с аппаратным ускорением это целая область (пример "0,0,320,407") и без аппаратного ускорения тот же прямоугольник, который я аннулировал invalidate(Rect)
(например, "106,135,106,135").
На данный момент в качестве обходного пути я перерисовываю все поля с соответствующим изображением и строками. Как я могу предотвратить аннулирование всей области с аппаратным ускорением?
Если это имеет значение: я использую Android версии 4.1.2 на Samsung Galaxy Young Duos S6312.
С уважением Сандро
1 ответ
Я разместил свой ответ в указанной вами ссылке. Чтобы понять проблему, вы должны знать разницу между программным рендерингом и аппаратным рендерингом. Это действительно большая тема, которую я не буду здесь освещать. Я думаю, что лучший подход - это прочитать исходный код(я сделал то же самое несколько дней назад). Ключевой вопрос "что такое DisplayList
и когда он используется ". Повторите мой ответ здесь, Canvas
в onDraw
просто используется для перестройки DisplayList. Это не значит, что все в вашем представлении будет перерисовано.