54 lines
1.9 KiB
Java
54 lines
1.9 KiB
Java
package androidx.core.view;
|
|
|
|
import android.view.View;
|
|
import android.view.ViewTreeObserver;
|
|
import androidx.annotation.NonNull;
|
|
import java.util.Objects;
|
|
public final class OneShotPreDrawListener implements ViewTreeObserver.OnPreDrawListener, View.OnAttachStateChangeListener {
|
|
private final Runnable mRunnable;
|
|
private final View mView;
|
|
private ViewTreeObserver mViewTreeObserver;
|
|
|
|
private OneShotPreDrawListener(View view, Runnable runnable) {
|
|
this.mView = view;
|
|
this.mViewTreeObserver = view.getViewTreeObserver();
|
|
this.mRunnable = runnable;
|
|
}
|
|
|
|
@NonNull
|
|
public static OneShotPreDrawListener add(@NonNull View view, @NonNull Runnable runnable) {
|
|
Objects.requireNonNull(view, "view == null");
|
|
Objects.requireNonNull(runnable, "runnable == null");
|
|
OneShotPreDrawListener oneShotPreDrawListener = new OneShotPreDrawListener(view, runnable);
|
|
view.getViewTreeObserver().addOnPreDrawListener(oneShotPreDrawListener);
|
|
view.addOnAttachStateChangeListener(oneShotPreDrawListener);
|
|
return oneShotPreDrawListener;
|
|
}
|
|
|
|
@Override // android.view.ViewTreeObserver.OnPreDrawListener
|
|
public boolean onPreDraw() {
|
|
removeListener();
|
|
this.mRunnable.run();
|
|
return true;
|
|
}
|
|
|
|
@Override // android.view.View.OnAttachStateChangeListener
|
|
public void onViewAttachedToWindow(View view) {
|
|
this.mViewTreeObserver = view.getViewTreeObserver();
|
|
}
|
|
|
|
@Override // android.view.View.OnAttachStateChangeListener
|
|
public void onViewDetachedFromWindow(View view) {
|
|
removeListener();
|
|
}
|
|
|
|
public void removeListener() {
|
|
if (this.mViewTreeObserver.isAlive()) {
|
|
this.mViewTreeObserver.removeOnPreDrawListener(this);
|
|
} else {
|
|
this.mView.getViewTreeObserver().removeOnPreDrawListener(this);
|
|
}
|
|
this.mView.removeOnAttachStateChangeListener(this);
|
|
}
|
|
}
|