diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 1208b237efa19..258a19c3237a7 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -6953,7 +6953,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * well. This is usually true for a full invalidate, but may be set to false if the * View's contents or dimensions have not changed. */ - private void invalidate(boolean invalidateCache) { + void invalidate(boolean invalidateCache) { if (ViewDebug.TRACE_HIERARCHY) { ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE); } diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 5508bbddaaaa0..9ac955b958e8f 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -347,6 +347,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager // views during a transition when they otherwise would have become gone/invisible private ArrayList mVisibilityChangingChildren; + // Indicates whether this container will use its children layers to draw + @ViewDebug.ExportedProperty(category = "drawing") + private boolean mDrawLayers = true; + public ViewGroup(Context context) { super(context); initViewGroup(); @@ -2160,7 +2164,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager flags = mGroupFlags; if ((flags & FLAG_INVALIDATE_REQUIRED) == FLAG_INVALIDATE_REQUIRED) { - invalidate(); + invalidate(true); } if ((flags & FLAG_ANIMATION_DONE) == 0 && (flags & FLAG_NOTIFY_ANIMATION_LISTENER) == 0 && @@ -2216,7 +2220,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } - invalidate(); + invalidate(true); } /** @@ -2275,7 +2279,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager boolean scalingRequired = false; boolean caching; - int layerType = child.getLayerType(); + int layerType = mDrawLayers ? child.getLayerType() : LAYER_TYPE_NONE; final boolean hardwareAccelerated = canvas.isHardwareAccelerated(); if ((flags & FLAG_CHILDREN_DRAWN_WITH_CACHE) == FLAG_CHILDREN_DRAWN_WITH_CACHE || @@ -2552,10 +2556,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager // 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 - invalidate(); + invalidate(true); if (a instanceof AlphaAnimation) { // alpha animations should cause the child to recreate its display list - child.invalidate(); + child.invalidate(true); } } @@ -2564,6 +2568,17 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return more; } + /** + * + * @param enabled True if children should be drawn with layers, false otherwise. + * + * @hide + */ + public void setChildrenLayersEnabled(boolean enabled) { + mDrawLayers = enabled; + invalidate(true); + } + /** * By default, children are clipped to their bounds before drawing. This * allows view groups to override this behavior for animations, etc. @@ -2596,7 +2611,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager final View[] children = mChildren; final int count = mChildrenCount; for (int i = 0; i < count; i++) { - children[i].setSelected(selected); } } @@ -2609,7 +2623,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager final View[] children = mChildren; final int count = mChildrenCount; for (int i = 0; i < count; i++) { - children[i].setActivated(activated); } } @@ -2802,7 +2815,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager // therefore, we call requestLayout() on ourselves before, so that the child's request // will be blocked at our level requestLayout(); - invalidate(); + invalidate(true); addViewInner(child, index, params, false); } @@ -3084,7 +3097,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager public void removeView(View view) { removeViewInternal(view); requestLayout(); - invalidate(); + invalidate(true); } /** @@ -3116,7 +3129,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager public void removeViewAt(int index) { removeViewInternal(index, getChildAt(index)); requestLayout(); - invalidate(); + invalidate(true); } /** @@ -3128,7 +3141,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager public void removeViews(int start, int count) { removeViewsInternal(start, count); requestLayout(); - invalidate(); + invalidate(true); } private void removeViewInternal(View view) { @@ -3253,7 +3266,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager public void removeAllViews() { removeAllViewsInLayout(); requestLayout(); - invalidate(); + invalidate(true); } /** diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml index 2db44175a0181..fc50334da73b6 100644 --- a/tests/HwAccelerationTest/AndroidManifest.xml +++ b/tests/HwAccelerationTest/AndroidManifest.xml @@ -88,6 +88,15 @@ + + + + + + + diff --git a/tests/HwAccelerationTest/res/layout/view_layers_5.xml b/tests/HwAccelerationTest/res/layout/view_layers_5.xml new file mode 100644 index 0000000000000..653f3a8b27897 --- /dev/null +++ b/tests/HwAccelerationTest/res/layout/view_layers_5.xml @@ -0,0 +1,48 @@ + + + + + + + +