Reputation: 599
at least it is doing what I want it to do (centering my view at runtime) but why is it doing it over and over? my understanding is that it should be called when the view tree has something to draw, which should not be multiple times every second. here I am logging its calls
why does OnPreDraw() keeps getting called over and over even when nothing is happening on screen? is that terrible for performance? I only want it to be called when there is actually something to be drawn.
the view location_manager is part of the action bar, if it matters.
Upvotes: 3
Views: 5923
Reputation: 325
I found something interesting: OneShotPreDrawListener
.
https://developer.android.com/reference/androidx/core/view/OneShotPreDrawListener
change this:
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
}
Upvotes: 4
Reputation: 83303
You need to remove the OnPreDrawListener
in the first line of your onPreDraw()
method if you only want it to get called once:
myView.getViewTreeObserver().removeOnPreDrawListener(this);
Upvotes: 4