summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/View.java11
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;