У меня есть большой пользовательский вид (карта) и меньший вид (высотомер), нарисованный сверху.Могу ли я перерисовать вид, не заставляя перерисовывать основной вид?
Есть ли способ обновить вид сверху без принуждения полных перерисовок вида снизу?
У меня есть большой пользовательский вид (карта) и меньший вид (высотомер), нарисованный сверху.Могу ли я перерисовать вид, не заставляя перерисовывать основной вид?
Есть ли способ обновить вид сверху без принуждения полных перерисовок вида снизу?
Нет, это невозможно (в обычном смысле). Когда у вас несколько видов друг на друга, вызов invalidate()
на одном представлении будет перерисовывать все эти виды. Когда вызывается invalidate()
, он перерисовывает все, что находится в dirty region
. Это берется по методу dispathDraw()
в ViewGroup
. dispatchDraw()
inturn вызывает drawChild()
, и поэтому, когда мы вызываем invalidate()
на один вид, другие виды также рисуются.
Это, как говорится, вы можете переопределить метод dispatchDraw()
в своем собственном обычном ViewGroup
и обрабатывать то, как должны себя вести.
Также: я только что обнаружил, что если вы даете представление непрозрачного фона, его недействительность не приведет к аннулированию базового представления. Это не идеальное решение, но оно довольно хорошее.
Теперь мне нужно посмотреть, можно ли сделать вид с непрямоугольной формой.
Спасибо. Я экспериментирую с тем, чтобы сделать нижний вид подклассом RelativeLayout так, чтобы представления оверлей обрабатывались непосредственно им. Переопределение dispatchDraw() определенно делает. –
Вздох. Просто посмотрел исходный код на 'dispatchDraw()' - это намного сложнее, чем я готов переопределить. Хотелось бы просто сказать «недействительность этого взгляда, но нет других». –
Обновление: ** ** возможно, если вид имеет непрозрачный фон. Смотри ниже. –