user3453281
user3453281

Reputation: 599

OnPreDraw() is getting called over and over. what could explain it?

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.

Upvotes: 3

Views: 5923

Answers (2)

Krahmal
Krahmal

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

Alex Lockwood
Alex Lockwood

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

Related Questions