android - 多次调用 requestLayout 或 invalidate 是否会影响性能?

标签 android

为了移动 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/

相关文章:

Android 定期检查互联网连接

android - 使用 Espresso : Class ref in pre-verified class resolved to unexpected implementation 运行仪器测试

java - Android 中的 sharedUserId 是什么,它是如何使用的?

java - Volley : how can I parse data String with integer by HashMap

java - 由于新行开始而导致的字符串格式问题

java - 是否有适用于 android 的可配置预提交 Hook 解决方案?

java - MongoDB+Azure+Android : Error: com. mongodb.MongoException:不与master对话并且重试用完

安卓 : How to clear cache by program without affecting database?

android - ListView 最后一项之后的分隔符(分隔符)

android - 我想使用 MVP 设计模式为 android 构建手动 camera2 应用程序。如何?