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 537f887305ee..7dd2668295fe 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -3586,6 +3586,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;
/**
@@ -16460,6 +16463,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);
@@ -16504,6 +16509,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
onDrawForeground(canvas);
// we're done...
+ mInDraw = false;
return;
}
@@ -16651,6 +16657,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
// Step 6, draw decorations (foreground, scrollbars)
onDrawForeground(canvas);
+
+ mInDraw = false;
}
/**
@@ -17095,7 +17103,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;