#android
#Android
Вопрос:
Чтобы переместить представление, я вызываю setX , setY и некоторые другие функции, которые задают ширину и высоту, и вызываю либо invalidate, либо requestLayout в конце каждой из этих функций. В результате invalidate и requestLayout вызываются несколько раз для каждого пользовательского события. Вызывает ли это несколько компоновок / отрисовок для каждого пользовательского события?
Ответ №1:
Конечно, нет.Мы можем видеть код в ViewRootImpl
void invalidate() {
mDirty.set(0, 0, mWidth, mHeight);
if (!mWillDrawSoon) {
scheduleTraversals();
}
}
сделайте недействительной заданную грязную область и вызовите scheduleTraversals, он вызовет doTraversal.
void doTraversal() {
if (mTraversalScheduled) {
mTraversalScheduled = false;
mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);
if (mProfile) {
Debug.startMethodTracing("ViewAncestor");
}
performTraversals();
if (mProfile) {
Debug.stopMethodTracing();
mProfile = false;
}
}
}
мы можем видеть флаг mTraversalScheduled в коде, если мы планируем перемещение, триггер события invalidate ,mTraversalScheduled имеет значение false в doTraversal, поэтому метод вернется напрямую.
Таким образом, НЕ все события аннулирования, называемые performTravel, НЕ все события аннулирования, называемые redraw
Ответ №2:
Да, это так. Каждый раз, когда вы вызываете invalidate, само представление будет перерисовываться!
Ответ №3:
Каждый раз, когда вы вызываете invalidate, само представление будет перерисовываться!
Технически это неверно. invalidate
установит флаг для представления, который делает его пригодным для перерисовки.
Простым тестом было бы ввести оператор log onDraw
, а затем вызвать invalidate
цикл. Вы увидите, что для каждой итерации нет журнала.