diff options
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/view/ViewAncestor.java | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/core/java/android/view/ViewAncestor.java b/core/java/android/view/ViewAncestor.java index 40e99a1788c2..ad660c1e209d 100644 --- a/core/java/android/view/ViewAncestor.java +++ b/core/java/android/view/ViewAncestor.java @@ -288,6 +288,10 @@ public final class ViewAncestor extends Handler implements ViewParent, private final int mDensity; + // This flag tracks when the mIgnoreDirtyState flag is set during draw(), to avoid + // clearing that flag prematurely + private boolean mSetIgnoreDirtyState = false; + /** * Consistency verifier for debugging purposes. */ @@ -672,6 +676,7 @@ public final class ViewAncestor extends Handler implements ViewParent, } } if (!mDirty.isEmpty() && !mDirty.contains(dirty)) { + mSetIgnoreDirtyState = true; mAttachInfo.mIgnoreDirtyState = true; } mDirty.union(dirty); @@ -1747,7 +1752,7 @@ public final class ViewAncestor extends Handler implements ViewParent, mAttachInfo.mIgnoreDirtyState = true; dirty.union(0, 0, (int) (mWidth * appScale + 0.5f), (int) (mHeight * appScale + 0.5f)); } - + if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) { if (!dirty.isEmpty() || mIsAnimating) { mIsAnimating = false; @@ -1877,9 +1882,13 @@ public final class ViewAncestor extends Handler implements ViewParent, } canvas.setScreenDensity(scalingRequired ? DisplayMetrics.DENSITY_DEVICE : 0); + mSetIgnoreDirtyState = false; mView.draw(canvas); } finally { - mAttachInfo.mIgnoreDirtyState = false; + if (!mSetIgnoreDirtyState) { + // Only clear the flag if it was not set during the mView.draw() call + mAttachInfo.mIgnoreDirtyState = false; + } } if (false && ViewDebug.consistencyCheckEnabled) { |
