2015-07-18 9 views
1

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

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

Image Link (not enough rep to post images)

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

+0

Работает ли это независимо от типа слоя, который вы используете (View # setLayerType)? – pskink

+0

Настройка на аппаратное обеспечение работает, но «программное обеспечение» и «нет» не работают. –

ответ

1

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

См. Ссылку this Ответ Ромен Гай, автора конвейера рендеринга.

+0

Спасибо за объяснение :) Я вытягивал свои волосы, пытаясь точно изучить, что происходит –