下面列出了android.view.ViewTreeObserver#OnDrawListener ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public static void initializeDrawListener(View view) {
if (sGlobalDrawListener != null) {
view.getViewTreeObserver().removeOnDrawListener(sGlobalDrawListener);
}
sGlobalDrawListener = new ViewTreeObserver.OnDrawListener() {
private long mTime = System.currentTimeMillis();
public void onDraw() {
sGlobalFrameCounter++;
if (DEBUG) {
long newTime = System.currentTimeMillis();
Log.d("FirstFrameAnimatorHelper", "TICK " + (newTime - mTime));
mTime = newTime;
}
}
};
view.getViewTreeObserver().addOnDrawListener(sGlobalDrawListener);
sVisible = true;
}
public static void initializeDrawListener(View view) {
if (sGlobalDrawListener != null) {
view.getViewTreeObserver().removeOnDrawListener(sGlobalDrawListener);
}
sGlobalDrawListener = new ViewTreeObserver.OnDrawListener() {
private long mTime = System.currentTimeMillis();
public void onDraw() {
sGlobalFrameCounter++;
if (DEBUG) {
long newTime = System.currentTimeMillis();
Log.d("FirstFrameAnimatorHelper", "TICK " + (newTime - mTime));
mTime = newTime;
}
}
};
view.getViewTreeObserver().addOnDrawListener(sGlobalDrawListener);
sVisible = true;
}
public static void initializeDrawListener(View view) {
if (sGlobalDrawListener != null) {
view.getViewTreeObserver().removeOnDrawListener(sGlobalDrawListener);
}
sGlobalDrawListener = new ViewTreeObserver.OnDrawListener() {
private long mTime = System.currentTimeMillis();
public void onDraw() {
sGlobalFrameCounter++;
if (DEBUG) {
long newTime = System.currentTimeMillis();
Log.d("FirstFrameAnimatorHelper", "TICK " + (newTime - mTime));
mTime = newTime;
}
}
};
view.getViewTreeObserver().addOnDrawListener(sGlobalDrawListener);
sVisible = true;
}
static void initializeDrawListener(View view) {
if (sGlobalDrawListener != null) {
view.getViewTreeObserver().removeOnDrawListener(sGlobalDrawListener);
}
sGlobalDrawListener = new ViewTreeObserver.OnDrawListener() {
private long mTime = System.currentTimeMillis();
public void onDraw() {
sGlobalFrameCounter++;
}
};
view.getViewTreeObserver().addOnDrawListener(sGlobalDrawListener);
sVisible = true;
}
private void runOnDrawEnd(View view, ViewTreeObserver.OnDrawListener onDrawListener, int maxPostTimes, @NonNull ViewUtil.OnDrawCallback onDrawCallback) {
if (view == null || onDrawListener == null) {
return;
}
maxPostTimes --;
int finalMaxPostTimes = maxPostTimes;
postTraversalFinishCallBack(() -> {
if (!isDraw && finalMaxPostTimes > 0) {
runOnDrawEnd(view, onDrawListener, finalMaxPostTimes, onDrawCallback);
} else {
view.getViewTreeObserver().removeOnDrawListener(onDrawListener);
onDrawCallback.didDraw();
}
});
}
void start(Application application, ImageCanary imageCanaryEngine) {
Handler handler = ThreadUtil.createIfNotExistHandler(IMAGE_CANARY_HANDLER);
callbacks = new SimpleActivityLifecycleCallbacks() {
private Map<Activity, ViewTreeObserver.OnDrawListener> mOnDrawListenerMap = new HashMap<>();
private Set<ImageIssue> mImageIssues = new HashSet<>();
@Override
public void onActivityResumed(Activity activity) {
super.onActivityResumed(activity);
ViewGroup parent = (ViewGroup) activity.getWindow().getDecorView();
Runnable callback = inspectInner(new WeakReference<>(activity), imageCanaryEngine, mImageIssues);
ViewTreeObserver.OnDrawListener onDrawListener = () -> {
if (handler != null) {
handler.removeCallbacks(callback);
handler.postDelayed(callback, 300);
}
};
mOnDrawListenerMap.put(activity, onDrawListener);
parent.getViewTreeObserver().addOnDrawListener(onDrawListener);
}
@Override
public void onActivityPaused(Activity activity) {
super.onActivityPaused(activity);
ViewTreeObserver.OnDrawListener onDrawListener = mOnDrawListenerMap.remove(activity);
ViewGroup parent = (ViewGroup) activity.getWindow().getDecorView();
if (onDrawListener != null) {
parent.getViewTreeObserver().removeOnDrawListener(onDrawListener);
}
}
};
application.registerActivityLifecycleCallbacks(callbacks);
}
public void refreshAfterChartLoad(final boolean backUpdateProgressBar, final int numAttempts) {
if (!chartController.hasDrawnChart()) {
// Refresh the Run Review Overlay after the line graph presenter's chart
// has finished drawing itself.
final ViewTreeObserver observer = chartController.getChartViewTreeObserver();
if (observer == null) {
return;
}
observer.removeOnDrawListener(onDrawListener);
onDrawListener =
new ViewTreeObserver.OnDrawListener() {
@Override
public void onDraw() {
RunReviewOverlay.this.post(
new Runnable() {
@Override
public void run() {
if (!observer.isAlive()) {
if (numAttempts < MAX_REFRESH_ATTEMPTS) {
// Just try again, maybe it will come alive.
refreshAfterChartLoad(backUpdateProgressBar, numAttempts + 1);
}
return;
}
// The ViewTreeObserver calls its listeners without an iterator,
// so we need to remove the listener outside the flow or we risk
// an index-out-of-bounds crash in the case of multiple listeners.
observer.removeOnDrawListener(onDrawListener);
onDrawListener = null;
refresh(backUpdateProgressBar);
}
});
}
};
observer.addOnDrawListener(onDrawListener);
} else {
refresh(backUpdateProgressBar);
}
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mOnScrollChangedListener = new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
applyParallax();
}
};
mOnGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
heightView = (float) getHeight();
widthView = (float) getWidth();
applyParallax();
}
};
ViewTreeObserver viewTreeObserver = getViewTreeObserver();
viewTreeObserver.addOnScrollChangedListener(mOnScrollChangedListener);
viewTreeObserver.addOnGlobalLayoutListener(mOnGlobalLayoutListener);
if (updateOnDraw
&& android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
onDrawListener = new ViewTreeObserver.OnDrawListener() {
@Override
public void onDraw() {
applyParallax();
}
};
viewTreeObserver.addOnDrawListener(onDrawListener);
}
parallaxAnimation();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mOnScrollChangedListener = new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
applyParallax();
}
};
mOnGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
heightImageView = (float) getHeight();
widthImageView = (float) getWidth();
applyParallax();
}
};
ViewTreeObserver viewTreeObserver = getViewTreeObserver();
viewTreeObserver.addOnScrollChangedListener(mOnScrollChangedListener);
viewTreeObserver.addOnGlobalLayoutListener(mOnGlobalLayoutListener);
if (updateOnDraw
&& android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
onDrawListener = new ViewTreeObserver.OnDrawListener() {
@Override
public void onDraw() {
applyParallax();
}
};
viewTreeObserver.addOnDrawListener(onDrawListener);
}
parallaxAnimation();
}
public void listen() {
ViewTreeObserver.OnDrawListener onDrawListener = () -> isDraw = true;
view.getViewTreeObserver().addOnDrawListener(onDrawListener);
runOnDrawEnd(view, onDrawListener, 3, onDrawCallback);
}