Correctly report the transparent region am: f8da30dc65

am: 94a2f7e6fd

Change-Id: Ice979b549a74f1e8e59210f2b7c7e5a6f141b9f6
This commit is contained in:
Teng-Hui Zhu
2016-08-23 15:15:06 +00:00
committed by android-build-merger
2 changed files with 27 additions and 9 deletions

View File

@@ -20280,8 +20280,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
// remove it from the transparent region. // remove it from the transparent region.
final int[] location = attachInfo.mTransparentLocation; final int[] location = attachInfo.mTransparentLocation;
getLocationInWindow(location); getLocationInWindow(location);
region.op(location[0], location[1], location[0] + mRight - mLeft, // When a view has Z value, then it will be better to leave some area below the view
location[1] + mBottom - mTop, Region.Op.DIFFERENCE); // for drawing shadow. The shadow outset is proportional to the Z value. Note that
// the bottom part needs more offset than the left, top and right parts due to the
// spot light effects.
int shadowOffset = getZ() > 0 ? (int) getZ() : 0;
region.op(location[0] - shadowOffset, location[1] - shadowOffset,
location[0] + mRight - mLeft + shadowOffset,
location[1] + mBottom - mTop + (shadowOffset * 3), Region.Op.DIFFERENCE);
} else { } else {
if (mBackground != null && mBackground.getOpacity() != PixelFormat.TRANSPARENT) { if (mBackground != null && mBackground.getOpacity() != PixelFormat.TRANSPARENT) {
// The SKIP_DRAW flag IS set and the background drawable exists, we remove // The SKIP_DRAW flag IS set and the background drawable exists, we remove

View File

@@ -6406,16 +6406,28 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
return true; return true;
} }
super.gatherTransparentRegion(region); super.gatherTransparentRegion(region);
final View[] children = mChildren; // Instead of naively traversing the view tree, we have to traverse according to the Z
final int count = mChildrenCount; // order here. We need to go with the same order as dispatchDraw().
// One example is that after surfaceView punch a hole, we will still allow other views drawn
// on top of that hole. In this case, those other views should be able to cut the
// transparent region into smaller area.
final int childrenCount = mChildrenCount;
boolean noneOfTheChildrenAreTransparent = true; boolean noneOfTheChildrenAreTransparent = true;
for (int i = 0; i < count; i++) { if (childrenCount > 0) {
final View child = children[i]; final ArrayList<View> preorderedList = buildOrderedChildList();
if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) { final boolean customOrder = preorderedList == null
if (!child.gatherTransparentRegion(region)) { && isChildrenDrawingOrderEnabled();
noneOfTheChildrenAreTransparent = false; final View[] children = mChildren;
for (int i = 0; i < childrenCount; i++) {
final int childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder);
final View child = getAndVerifyPreorderedView(preorderedList, children, childIndex);
if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) {
if (!child.gatherTransparentRegion(region)) {
noneOfTheChildrenAreTransparent = false;
}
} }
} }
if (preorderedList != null) preorderedList.clear();
} }
return meOpaque || noneOfTheChildrenAreTransparent; return meOpaque || noneOfTheChildrenAreTransparent;
} }