diff options
| author | 2011-01-27 01:10:35 -0800 | |
|---|---|---|
| committer | 2011-01-27 01:25:18 -0800 | |
| commit | e38ba4acbe6f1536997ffb98d662fc3eff07add8 (patch) | |
| tree | e39d3317dcf1cdceb6ba9fee54fd952d1c3b32ce | |
| parent | da910fd5ea024f214f806d880d86d77bf94497b5 (diff) | |
Fix gmail crossfade artifacts.
Display lists could not handle custom views that did their
own draw dispatching, as is the case with gmail. This fix makes that
possible and display lists handle this case robustly. Now the
crossfade works because the display lists contain the right content.
Change-Id: Iea7d6e99239b24f833701d546fe083aa00e2b31b
| -rw-r--r-- | core/java/android/view/ViewGroup.java | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index d4efdb6eaa3c..1313b7815095 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -2263,13 +2263,14 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager boolean scalingRequired = false; boolean caching; int layerType = child.getLayerType(); - + + final boolean hardwareAccelerated = canvas.isHardwareAccelerated(); if ((flags & FLAG_CHILDREN_DRAWN_WITH_CACHE) == FLAG_CHILDREN_DRAWN_WITH_CACHE || (flags & FLAG_ALWAYS_DRAWN_WITH_CACHE) == FLAG_ALWAYS_DRAWN_WITH_CACHE) { caching = true; if (mAttachInfo != null) scalingRequired = mAttachInfo.mScalingRequired; } else { - caching = (layerType != LAYER_TYPE_NONE) || canvas.isHardwareAccelerated(); + caching = (layerType != LAYER_TYPE_NONE) || hardwareAccelerated; } if (a != null) { @@ -2351,7 +2352,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return more; } - if (canvas.isHardwareAccelerated()) { + if (hardwareAccelerated) { // Clear INVALIDATED flag to allow invalidation to occur during rendering, but // retain the flag's value temporarily in the mRecreateDisplayList flag child.mRecreateDisplayList = (child.mPrivateFlags & INVALIDATED) == INVALIDATED; @@ -2367,7 +2368,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager Bitmap cache = null; boolean hasDisplayList = false; if (caching) { - if (!canvas.isHardwareAccelerated()) { + if (!hardwareAccelerated) { if (layerType != LAYER_TYPE_NONE) { layerType = LAYER_TYPE_SOFTWARE; child.buildDrawingCache(true); @@ -2506,11 +2507,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } else { child.mPrivateFlags &= ~DIRTY_MASK; - // Skip drawing the display list into ours if we were just refreshing - // it's content; we already have a reference to it in our display list - if (mRecreateDisplayList || mLayerType != LAYER_TYPE_NONE) { - ((HardwareCanvas) canvas).drawDisplayList(displayList); - } + ((HardwareCanvas) canvas).drawDisplayList(displayList); } } } else if (cache != null) { @@ -2536,13 +2533,13 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager canvas.restoreToCount(restoreTo); if (a != null && !more) { - if (!canvas.isHardwareAccelerated() && !a.getFillAfter()) { + if (!hardwareAccelerated && !a.getFillAfter()) { child.onSetAlpha(255); } finishAnimatingView(child, a); } - if (more && canvas.isHardwareAccelerated()) { + if (more && hardwareAccelerated) { // invalidation is the trigger to recreate display lists, so if we're using // display lists to render, force an invalidate to allow the animation to // continue drawing another frame |