2015-10-25 2 views

ответ

1

Нет, это невозможно (в обычном смысле). Когда у вас несколько видов друг на друга, вызов invalidate() на одном представлении будет перерисовывать все эти виды. Когда вызывается invalidate(), он перерисовывает все, что находится в dirty region. Это берется по методу dispathDraw() в ViewGroup. dispatchDraw() inturn вызывает drawChild(), и поэтому, когда мы вызываем invalidate() на один вид, другие виды также рисуются.

Это, как говорится, вы можете переопределить метод dispatchDraw() в своем собственном обычном ViewGroup и обрабатывать то, как должны себя вести.

+0

Спасибо. Я экспериментирую с тем, чтобы сделать нижний вид подклассом RelativeLayout так, чтобы представления оверлей обрабатывались непосредственно им. Переопределение dispatchDraw() определенно делает. –

+0

Вздох. Просто посмотрел исходный код на 'dispatchDraw()' - это намного сложнее, чем я готов переопределить. Хотелось бы просто сказать «недействительность этого взгляда, но нет других». –

+0

Обновление: ** ** возможно, если вид имеет непрозрачный фон. Смотри ниже. –

0

Также: я только что обнаружил, что если вы даете представление непрозрачного фона, его недействительность не приведет к аннулированию базового представления. Это не идеальное решение, но оно довольно хорошее.

Теперь мне нужно посмотреть, можно ли сделать вид с непрямоугольной формой.

Смежные вопросы