Improve hardware layers rendering speed when setting a View's alpha.
Change-Id: Ib1275677f531c60d9919978c5538c663fdb823b5
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index f05ef8c..53fc0c0 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -7905,7 +7905,16 @@
+ "LAYER_TYPE_SOFTWARE or LAYER_TYPE_HARDWARE");
}
- if (layerType == mLayerType) return;
+ if (layerType == mLayerType) {
+ if (layerType != LAYER_TYPE_NONE && paint != mLayerPaint) {
+ mLayerPaint = paint == null ? new Paint() : paint;
+ if (mParent instanceof ViewGroup) {
+ ((ViewGroup) mParent).invalidate();
+ }
+ invalidate();
+ }
+ return;
+ }
// Destroy any previous software drawing cache if needed
switch (mLayerType) {
@@ -7931,9 +7940,11 @@
}
mLayerType = layerType;
- mLayerPaint = mLayerType == LAYER_TYPE_NONE ? null : paint;
+ mLayerPaint = mLayerType == LAYER_TYPE_NONE ? null : (paint == null ? new Paint() : paint);
- // TODO: Make sure we invalidate the parent's display list
+ if (mParent instanceof ViewGroup) {
+ ((ViewGroup) mParent).invalidate();
+ }
invalidate();
}
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index f6b6778..d1781cc 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -2398,16 +2398,15 @@
layerType != LAYER_TYPE_NONE) {
layerFlags |= Canvas.CLIP_TO_LAYER_SAVE_FLAG;
}
- if (layerType != LAYER_TYPE_NONE && child.mLayerPaint != null) {
+ if (layerType != LAYER_TYPE_NONE) {
child.mLayerPaint.setAlpha(multipliedAlpha);
} else {
canvas.saveLayerAlpha(sx, sy, sx + cr - cl, sy + cb - ct,
multipliedAlpha, layerFlags);
- layerSaved = true;
}
} else {
// Alpha is handled by the child directly, clobber the layer's alpha
- if (layerType != LAYER_TYPE_NONE && child.mLayerPaint != null) {
+ if (layerType != LAYER_TYPE_NONE) {
child.mLayerPaint.setAlpha(255);
}
child.mPrivateFlags |= ALPHA_SET;
@@ -2433,7 +2432,7 @@
if (hasNoCache) {
boolean layerRendered = false;
- if (!layerSaved && layerType == LAYER_TYPE_HARDWARE) {
+ if (layerType == LAYER_TYPE_HARDWARE) {
final HardwareLayer layer = child.getHardwareLayer(canvas);
if (layer != null && layer.isValid()) {
((HardwareCanvas) canvas).drawHardwareLayer(layer, 0, 0, child.mLayerPaint);
@@ -2465,7 +2464,7 @@
child.mPrivateFlags &= ~DIRTY_MASK;
Paint cachePaint;
- if (layerType == LAYER_TYPE_NONE || child.mLayerPaint == null) {
+ if (layerType == LAYER_TYPE_NONE) {
cachePaint = mCachePaint;
if (alpha < 1.0f) {
cachePaint.setAlpha((int) (alpha * 255));
@@ -2476,9 +2475,7 @@
}
} else {
cachePaint = child.mLayerPaint;
- if (alpha < 1.0f) {
- cachePaint.setAlpha((int) (alpha * 255));
- }
+ cachePaint.setAlpha((int) (alpha * 255));
}
canvas.drawBitmap(cache, 0.0f, 0.0f, cachePaint);
}
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity2.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity2.java
index a0b1d78..e795f02 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity2.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayersActivity2.java
@@ -38,6 +38,8 @@
setupList(R.id.list1);
setupList(R.id.list2);
setupList(R.id.list3);
+
+ findViewById(R.id.list1).setAlpha(0.7f);
}
private void setupList(int listId) {