diff options
| -rw-r--r-- | core/java/android/view/View.java | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 3a1e9ab2cac3..68f1ac3c1108 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -3592,6 +3592,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; /** @@ -16470,6 +16473,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); @@ -16514,6 +16519,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, onDrawForeground(canvas); // we're done... + mInDraw = false; return; } @@ -16661,6 +16667,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // Step 6, draw decorations (foreground, scrollbars) onDrawForeground(canvas); + + mInDraw = false; } /** @@ -17105,7 +17113,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; |