Почему частичная недействительность распространяется на все представление?

Я пытаюсь частично аннулировать Android View. Я использую View.invalidate( l, t, b, r ), и он, кажется, правильно аннулирует вертикальные (верхние и нижние) значения, однако, независимо от того, какие левые и правые значения я использую, он аннулирует все представление.

Например, мой взгляд серый. Я хочу аннулировать зеленую область, однако это аннулирует зеленую и красную области. Он всегда охватывает все горизонтальное направление полностью по всему представлению. Я попытался указать небольшие значения, такие как View.invalidate( 0, 0, 50, 50 ), и это все равно вызывает такое поведение.

Ссылка на изображение (недостаточно повторений для публикации изображений)

Почему это происходит?


person Anthony Massie    schedule 18.07.2015    source источник
comment
работает ли он одинаково независимо от типа слоя, который вы используете (View#setLayerType)?   -  person pskink    schedule 18.07.2015
comment
Установка его на аппаратное обеспечение работает, но программное обеспечение и ни один из них не работают.   -  person Anthony Massie    schedule 18.07.2015


Ответы (1)


Поведение изменилось с аппаратным ускорением, по умолчанию после Honeycomb. Теперь, когда вы invalidate() представляете вид, предоставляющий грязную область, граница клипа не устанавливается (canvas.getClipBounds()). Однако перерисовываться будут только объекты, пересекающие грязную область.

Для справки см. этот ответ Ромена Гая, автора конвейера рендеринга.

person Gil Vegliach    schedule 18.07.2015
comment
Спасибо за объяснение :) Я рвал на себе волосы, пытаясь понять, что именно происходит. - person Anthony Massie; 20.07.2015