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