3

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

OnPreDraw() 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.

user3453281
  • 559
  • 5
  • 12

2 Answers2

4

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);
Alex Lockwood
  • 83,063
  • 39
  • 206
  • 250
3

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
}
Krahmal
  • 195
  • 13