Частичная аннулирование в пользовательском представлении Android с аппаратным ускорением

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

В большинстве случаев, когда я хочу обновить элемент управления, я вызываю invalidate() без каких-либо параметров.

Однако в определенных обстоятельствах, когда я изменяю только небольшую область элемента управления, я вызываю invalidate(Rect) чтобы избежать перерисовки всего экрана. Это важно, потому что в этих ситуациях мне нужно, чтобы обновление было максимально быстрым.

Это, кажется, работает нормально, когда я включаю аппаратное ускорение в Honeycomb (т.е. android:hardwareAccelerated="true"в AndroidManifest.xml) частичная перерисовка не работает.

Это видно если я Log.d("FOO", canvas.getClipBounds()) в моем onDraw() Способ; выходные данные просто показывают, что весь элемент управления обновляется, тогда как при отключенном аппаратном ускорении я получаю правильную область вывода.

Есть ли способ заставить частичную аннулирование работать при использовании аппаратного ускорения?

Большое спасибо, Мэтт

2 ответа

Частичная перерисовка работает просто отлично, перерисовывается только указанная область экрана. Однако этого не произойдет, если вы измените границы клипа на холсте. Все операции рисования будут записаны, но только те, которые пересекаются с грязной областью, будут фактически выполнены.

Когда HA включен, конвейер рендеринга будет использовать DisplayList сохранить команды рисования. Даже если вы укажете грязный регион в View.invalidate, весь список отображения будет перестроен (просто подумайте, как мы можем обновить только небольшой набор DisplayList, это невозможно, верно?). В конце концов, как говорит @Romain, будет перерисована только самая грязная область.

Другие вопросы по тегам