为了移动 View ,我调用了 setX、setY 和其他一些设置宽度和高度的函数,并在每个函数的末尾调用 invalidate 或 requestLayout。因此,每个用户事件都会多次调用 invalidate 和 requestLayout。这会触发每个用户事件的多个布局/绘制吗?
最佳答案
当然不是,我们可以在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 在doTraversal 中为false,所以该方法将直接返回。 所以不是每个无效事件都称为 performTravel,不是每个无效事件都称为重绘
关于android - 多次调用 requestLayout 或 invalidate 是否会影响性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7868005/