diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index dea004e3ee349..5f8d49d91e3ca 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -3481,6 +3481,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private int[] mDrawableState = null; + /** Whether draw() is currently being called. */ + private boolean mInDraw = false; + ViewOutlineProvider mOutlineProvider = ViewOutlineProvider.BACKGROUND; /** @@ -16151,6 +16154,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ @CallSuper public void draw(Canvas canvas) { + mInDraw = true; + final int privateFlags = mPrivateFlags; final boolean dirtyOpaque = (privateFlags & PFLAG_DIRTY_MASK) == PFLAG_DIRTY_OPAQUE && (mAttachInfo == null || !mAttachInfo.mIgnoreDirtyState); @@ -16195,6 +16200,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, onDrawForeground(canvas); // we're done... + mInDraw = false; return; } @@ -16342,6 +16348,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // Step 6, draw decorations (foreground, scrollbars) onDrawForeground(canvas); + + mInDraw = false; } /** @@ -16786,7 +16794,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ @Override public void invalidateDrawable(@NonNull Drawable drawable) { - if (verifyDrawable(drawable)) { + // Don't invalidate if a drawable changes during drawing. + if (verifyDrawable(drawable) && !mInDraw) { final Rect dirty = drawable.getDirtyBounds(); final int scrollX = mScrollX; final int scrollY = mScrollY;