Подтвердить что ты не робот

View.onDraw() --- когда он вызван?

Я поместил вызов Log.d() в onDraw() моего расширенного представления, чтобы я мог видеть, как часто и когда он получает вызов. Это вызвано созданием представления, что неудивительно. Но потом я замечаю, что он получает вызов по каждому касанию, который обрабатывается onTouchEvent(), хотя мой код не делает ничего удаленного с графикой. Однако в документации для представлений я не могу найти ничего о том, когда на самом деле вызывается onDraw(). Я не очень беспокоюсь о моем конкретном проекте здесь (это не вызывает проблемы для меня), я просто хотел бы знать, есть ли где-нибудь список или что-то, что показывает порядок операций для представления, в частности, какие причины onDraw() для вызова.

4b9b3361

Ответ 1

AFAIK, вид onDraw() вызывается, когда:

  • Представление изначально рисуется
  • Когда invalidate() вызывается в представлении

Invalidate может быть вызван вами или системой в случае необходимости. Например, многие представления изменяют, как они выглядят onTouch, например EditText, получая контур и курсор, или кнопку, находящуюся в нажатом состоянии. Из-за этого Views перерисовываются при касании.

Я согласен с тем, что было бы неплохо иметь документ, в котором подробно описывается работа "Представлений", и если кто-то существует, и кто-то знает, где его найти, сообщите нам об этом.

Ответ 2

onDraw() вызывается при вызове invalidate().

Но вы должны знать для ViewGroups: onDraw() не будет называться, как вы ожидаете. Скорее, onDispatchDraw().

Однако в ViewGroup вы можете вызвать setWillNotDraw(false) в конструкторе, чтобы сделать onDraw() для вызова на invalidate().

Посмотрите этот ответ

Ответ 3

  • Если вы устанавливаете фоновый рисунок для представления, то вид будет рисовать это для вас, прежде чем переходить к методу onDraw().

  • onAttachedToWindow() вызывается, когда представление прикреплено к окну. В этот момент у него есть Поверхность и начнется рисование. Обратите внимание, что это функция, как ожидается, будет вызвана до onDraw (android.graphics.Canvas), однако он может быть вызван в любое время перед первым onDraw - включая до или после onMeasure (int, целое).

  • invalidate() отметьте область, определенную грязной, как нужно рисовать. Если вид будет виден, onDraw (android.graphics.Canvas) будет вызываться в в будущем.

Ответ 4

Важно помнить, что старайтесь минимизировать вызов функции invalidate() без аргументов. Вместо этого попробуйте максимизировать функцию invalidate() с четырьмя аргументами. Поскольку весь вид цели очень дорог. Второй вариант обновляет только часть представления.

Ответ 5

Дополнительно к следующему: мягкая клавиатура вызывает последовательность View.invalidate() → View.onDraw() после изменения размера окна, чтобы разумно разместить "клавиатуру". Пользовательский View.onDraw() должен оставить себя в состоянии, которое предвосхищает эту возможность.
Такое явление объясняет, почему приложение, которое вы разработали и протестировали на планшете с клавиатурой Bluetooth, отправилось собакам, когда оно достигло реального мира (-: