Improve export to bitmap layers for HierarchyViewer.
- Do not show layers with an invisible parent
- Correctly draw extras from dispatchDraw() (ListView's dividers for instance)
Change-Id: Id2e24ae9d52879290dffbf1cc446c5eda9522fbb
diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java
index 2b5489c..d2563a8 100644
--- a/core/java/android/view/ViewDebug.java
+++ b/core/java/android/view/ViewDebug.java
@@ -1040,7 +1040,7 @@
clientStream.writeInt(outRect.width());
clientStream.writeInt(outRect.height());
- captureViewLayer(root, clientStream);
+ captureViewLayer(root, clientStream, true);
clientStream.write(2);
} finally {
@@ -1048,9 +1048,11 @@
}
}
- private static void captureViewLayer(View view, DataOutputStream clientStream)
+ private static void captureViewLayer(View view, DataOutputStream clientStream, boolean visible)
throws IOException {
+ final boolean localVisible = view.getVisibility() == View.VISIBLE && visible;
+
if ((view.mPrivateFlags & View.SKIP_DRAW) != View.SKIP_DRAW) {
final int id = view.getId();
String name = view.getClass().getSimpleName();
@@ -1060,7 +1062,7 @@
clientStream.write(1);
clientStream.writeUTF(name);
- clientStream.writeByte(view.getVisibility() == View.VISIBLE ? 1 : 0);
+ clientStream.writeByte(localVisible ? 1 : 0);
int[] position = new int[2];
// XXX: Should happen on the UI thread
@@ -1086,7 +1088,7 @@
int count = group.getChildCount();
for (int i = 0; i < count; i++) {
- captureViewLayer(group.getChildAt(i), clientStream);
+ captureViewLayer(group.getChildAt(i), clientStream, localVisible);
}
}
}
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 597d583..006aff8 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -1274,13 +1274,27 @@
@Override
Bitmap createSnapshot(Bitmap.Config quality, int backgroundColor, boolean skipChildren) {
- int oldCount = mChildrenCount;
+ int count = mChildrenCount;
+ int[] visibilities = null;
+
if (skipChildren) {
- mChildrenCount = 0;
+ visibilities = new int[count];
+ for (int i = 0; i < count; i++) {
+ View child = getChildAt(i);
+ visibilities[i] = child.getVisibility();
+ if (visibilities[i] == View.VISIBLE) {
+ child.setVisibility(INVISIBLE);
+ }
+ }
}
Bitmap b = super.createSnapshot(quality, backgroundColor, skipChildren);
- mChildrenCount = oldCount;
+
+ if (skipChildren) {
+ for (int i = 0; i < count; i++) {
+ getChildAt(i).setVisibility(visibilities[i]);
+ }
+ }
return b;
}