【问题标题】:OnPreDraw() is getting called over and over. what could explain it?OnPreDraw() 被一遍又一遍地调用。有什么可以解释的?
【发布时间】:2021-12-09 14:15:42
【问题描述】:

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

为什么即使屏幕上什么都没有发生,OnPreDraw() 也会不断被调用?这对性能来说很糟糕吗?我只希望在实际需要绘制某些东西时调用它。

如果重要的话,视图 location_manager 是操作栏的一部分。

【问题讨论】:

标签: java android android-layout


【解决方案1】:

如果您只想调用一次,则需要删除 onPreDraw() 方法第一行中的 OnPreDrawListener

myView.getViewTreeObserver().removeOnPreDrawListener(this);

【讨论】:

  • vto 必须声明为 final
  • 这会立即使我的应用程序崩溃。你的意思是 myView.getViewTreeObserver().removeOnPreDrawListener(this); ?
  • @user3453281 是的,这可能更好,因为旧的视图树观察器可能不再存在。
【解决方案2】:

我发现了一些有趣的东西:OneShotPreDrawListener

https://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)

到:

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

【讨论】:

    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2016-12-20
    • 2017-08-24
    • 2019-09-21
    相关资源
    最近更新 更多