2010-04-06 4 views
7

Я новичок в разработке Android, просто прочитал документы и попробовал API . Я не понимаю, как ImageView удалось сделать только часть его содержимого после вызова invalidate (Rect).Как ImageView просто перерисовывает часть своего содержимого при вызове invalidate (Rect)?

Я проверил ImageView.java, не нашел другого способа рисования кроме OnDraw (Canvas), но OnDraw (Canvas) только вырезать Drawable только если это примеры запросов видимой границы представления. Я также прочитал реализацию View.invalidate (Rect), я думаю, что ключ этой функции вызывает mParent.invalidateChild (this, r); Тем не менее, я думаю, что родительский вид не знает, как нарисовать ребенка в данным Rect, он, наконец, должен вызвать некоторый метод его дочернего на краской.

Кто-нибудь исследовал эту часть кодов? Не могли бы вы дать мне какой-нибудь путеводитель?

ответ

1

Я предполагаю, что код находится в классе View.

Есть несколько интересных ответов Ромена Гая в группе google.

+0

-1 как обе ссылки теперь мертвы. В том числе некоторые из их содержания здесь были бы лучше. –

+1

+1 потому что ссылки не мертвы ... Я только что их протестировал. Тем не менее, я согласен с тем, что добавление контента - это хорошо, что нужно делать в подобных случаях. – Justin

0

Я думаю андроид нарисовать вид так же, как холст в j2me, весь код погон не рисуются непосредственно с оборудованием (экран), он просто рисовать в буфер или или что-то. Когда мы вызываем View.invalidate (Rect), система копирует изображение в прямоугольник буфера (или вытягивается) на аппаратное обеспечение (экран).

3

Насколько я могу собрать, есть две оптимизации, идущие одна. Например, если дочерняя группа является группой просмотра, только те дети этой группы перерисовываются, которые пересекают область, недействительную. Кроме того, холст обрезается до границ этого прямоугольника. Это означает, что меньше пикселей нужно перетасовывать через шину в фреймбуфер, и операции рисования, которые полностью обрезаны, могут быть пропущены.

Это полуобразованное предположение. Я просмотрел источник несколько месяцев назад и довольно уверен в работе ViewGroup. Второй может быть проверен путем переопределения обрезки в onDraw и проверки того, что он перерисовывает все.

+0

Я новичок в андроиде, и у меня есть вопрос здесь http://stackoverflow.com/questions/21027199/am-i-invalidating-the-entire-screen-on-every-call Просьба указать ответ, если возможно , – Kraken