forked from facebook/react-native
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Improve z-index implementation on Android
Summary: Use `getChildDrawingOrder` instead of reordering views. The old implementation didn't work properly when `removeClippedSubviews` was enabled and this one should have better performance since we don't play with the view hierarchy at all. This fixes weird bugs with sticky headers in `SectionList` and allows removing the hack that disabled `removeClippedSubviews` when using sticky section headers. **Test plan** Tested using the SectionList and ListViewPaging examples that use sticky headers which uses z-index. Closes facebook#13105 Reviewed By: sahrens Differential Revision: D4765869 Pulled By: achen1 fbshipit-source-id: be3c824658a3ce965b6e7324ad95c77cbd8a86ae
- Loading branch information
1 parent
c3bb464
commit e006280
Showing
7 changed files
with
149 additions
and
53 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
103 changes: 103 additions & 0 deletions
103
ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewGroupDrawingOrderHelper.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
/** | ||
* Copyright (c) 2015-present, Facebook, Inc. | ||
* All rights reserved. | ||
* | ||
* This source code is licensed under the BSD-style license found in the | ||
* LICENSE file in the root directory of this source tree. An additional grant | ||
* of patent rights can be found in the PATENTS file in the same directory. | ||
*/ | ||
|
||
package com.facebook.react.uimanager; | ||
|
||
import android.view.View; | ||
import android.view.ViewGroup; | ||
|
||
import java.util.ArrayList; | ||
import java.util.Collections; | ||
import java.util.Comparator; | ||
|
||
import javax.annotation.Nullable; | ||
|
||
/** | ||
* Helper to handle implementing ViewGroups with custom drawing order based on z-index. | ||
*/ | ||
public class ViewGroupDrawingOrderHelper { | ||
private final ViewGroup mViewGroup; | ||
private int mNumberOfChildrenWithZIndex = 0; | ||
private @Nullable int[] mDrawingOrderIndices; | ||
|
||
public ViewGroupDrawingOrderHelper(ViewGroup viewGroup) { | ||
mViewGroup = viewGroup; | ||
} | ||
|
||
/** | ||
* This should be called every time a view is added to the ViewGroup in {@link ViewGroup#addView}. | ||
* @param view The view that is being added | ||
*/ | ||
public void handleAddView(View view) { | ||
if (ViewGroupManager.getViewZIndex(view) != null) { | ||
mNumberOfChildrenWithZIndex++; | ||
} | ||
|
||
mDrawingOrderIndices = null; | ||
} | ||
|
||
/** | ||
* This should be called every time a view is removed from the ViewGroup in {@link ViewGroup#removeView} | ||
* and {@link ViewGroup#removeViewAt}. | ||
* @param view The view that is being removed. | ||
*/ | ||
public void handleRemoveView(View view) { | ||
if (ViewGroupManager.getViewZIndex(view) != null) { | ||
mNumberOfChildrenWithZIndex--; | ||
} | ||
|
||
mDrawingOrderIndices = null; | ||
} | ||
|
||
/** | ||
* If the ViewGroup should enable drawing order. ViewGroups should call | ||
* {@link ViewGroup#setChildrenDrawingOrderEnabled} with the value returned from this method when | ||
* a view is added or removed. | ||
*/ | ||
public boolean shouldEnableCustomDrawingOrder() { | ||
return mNumberOfChildrenWithZIndex > 0; | ||
} | ||
|
||
/** | ||
* The index of the child view that should be drawn. This should be used in | ||
* {@link ViewGroup#getChildDrawingOrder}. | ||
*/ | ||
public int getChildDrawingOrder(int childCount, int index) { | ||
if (mDrawingOrderIndices == null) { | ||
ArrayList<View> viewsToSort = new ArrayList<>(); | ||
for (int i = 0; i < childCount; i++) { | ||
viewsToSort.add(mViewGroup.getChildAt(i)); | ||
} | ||
// Sort the views by zIndex | ||
Collections.sort(viewsToSort, new Comparator<View>() { | ||
@Override | ||
public int compare(View view1, View view2) { | ||
Integer view1ZIndex = ViewGroupManager.getViewZIndex(view1); | ||
if (view1ZIndex == null) { | ||
view1ZIndex = 0; | ||
} | ||
|
||
Integer view2ZIndex = ViewGroupManager.getViewZIndex(view2); | ||
if (view2ZIndex == null) { | ||
view2ZIndex = 0; | ||
} | ||
|
||
return view1ZIndex - view2ZIndex; | ||
} | ||
}); | ||
|
||
mDrawingOrderIndices = new int[childCount]; | ||
for (int i = 0; i < childCount; i++) { | ||
View child = viewsToSort.get(i); | ||
mDrawingOrderIndices[i] = mViewGroup.indexOfChild(child); | ||
} | ||
} | ||
return mDrawingOrderIndices[index]; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters