From 849d0a37cf2ca6c6a6c2d4d4456495e32e363120 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Tue, 1 Feb 2011 17:20:48 -0800 Subject: New API to let apps draw without layers. Bug #3413433 Launcher now enables layers all the time, but in some cases (for instance, when the workspace is not scrolling,) it is more efficient to draw without the layer. Change-Id: I625fb5b48506acda9ae75356fdbbe812c85f2aab --- core/java/android/view/View.java | 2 +- core/java/android/view/ViewGroup.java | 37 +++++-- tests/HwAccelerationTest/AndroidManifest.xml | 9 ++ .../res/layout/view_layers_5.xml | 48 ++++++++ .../com/android/test/hwui/ViewLayersActivity5.java | 121 +++++++++++++++++++++ 5 files changed, 204 insertions(+), 13 deletions(-) create mode 100644 tests/HwAccelerationTest/res/layout/view_layers_5.xml create mode 100644 tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity5.java diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 6c5bdb69dff4..d3913dcb29cb 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -6910,7 +6910,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 f0aaf3fb36cc..edfef7694a12 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(); @@ -2147,7 +2151,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 && @@ -2203,7 +2207,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } - invalidate(); + invalidate(true); } /** @@ -2262,7 +2266,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 || @@ -2539,10 +2543,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); } } @@ -2551,6 +2555,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. @@ -2583,7 +2598,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); } } @@ -2596,7 +2610,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); } } @@ -2789,7 +2802,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); } @@ -3071,7 +3084,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager public void removeView(View view) { removeViewInternal(view); requestLayout(); - invalidate(); + invalidate(true); } /** @@ -3103,7 +3116,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager public void removeViewAt(int index) { removeViewInternal(index, getChildAt(index)); requestLayout(); - invalidate(); + invalidate(true); } /** @@ -3115,7 +3128,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) { @@ -3240,7 +3253,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 2db44175a018..fc50334da73b 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 000000000000..653f3a8b2789 --- /dev/null +++ b/tests/HwAccelerationTest/res/layout/view_layers_5.xml @@ -0,0 +1,48 @@ + + + + + + + +