OnPreDraw()被多次调用,可能的原因是什么?

3

至少它正在做我想要的事情(在运行时居中我的视图),但为什么它一遍又一遍地这样做?我的理解是,它应该在视图树有东西可绘制时被调用,这不应该是每秒多次。这里我记录了它的调用。

OnPreDraw() calls

即使屏幕上没有任何活动,为什么OnPreDraw()会一遍又一遍地被调用?这对性能有影响吗?我只希望在确实有东西需要绘制时才调用它。

如果有关系,view location_manager 是操作栏的一部分。


为什么 onPreDraw() 会被调用两次? - Teng-pao Yu
2个回答

4
我发现了一个有趣的东西:OneShotPreDrawListenerhttps://developer.android.com/reference/androidx/core/view/OneShotPreDrawListener 将这个改成:
val viewTreeObserver = view.viewTreeObserver
    val onPreDrawListener = object : ViewTreeObserver.OnPreDrawListener {
        override fun onPreDraw(): Boolean {
            view.viewTreeObserver.removeOnPreDrawListener(this)
            // do some thing
            return false
        }
    }
viewTreeObserver.addOnPreDrawListener(onPreDrawListener)

to:

OneShotPreDrawListener.add(view) {
    // do some thing
}

4

如果你只想让onPreDraw()方法被调用一次,那么你需要在第一行中删除OnPreDrawListener

myView.getViewTreeObserver().removeOnPreDrawListener(this);

vto 必须声明为 final - Blackbelt
这会立即导致我的应用程序崩溃。你是不是想说 myView.getViewTreeObserver().removeOnPreDrawListener(this);? - user3453281
@user3453281 是的,那可能更好,因为旧的视图树观察器可能已经不再存在了。 - Alex Lockwood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接