Juu*_*ude 5 android android-layout android-recyclerview
我想制作一个动画,RecyclerView
其中要求孩子拥有比另一个孩子更大的z指数.但是,当我使用它的bringToFront
方法时,ViewGroup
它不起作用.
有没有办法把孩子带到前面RecyclerView
?
的确,bringToFront()
没有帮助; 它只是更改其父级子数组中子项的顺序,但它不会更改子项的呈现顺序.
如果您使用的是API-21或更高版本,则只需更改Z
view(view.setZ(..)
)的值即可将其置于最前面.
在API-21下面有一个你可以使用的回调:RecyclerView.ChildDrawingOrderCallback
.有了它,您可以定义子项应该呈现的顺序.(如果您不喜欢通过更改Z
值获得的额外阴影,也可以使用API-21 + .)
例:
final int indexOfFrontChild = rv.indexOfChild(desiredFrontView);
rv.setChildDrawingOrderCallback(new RecyclerView.ChildDrawingOrderCallback() {
private int nextChildIndexToRender;
@Override
public int onGetChildDrawingOrder(int childCount, int iteration) {
if (iteration == childCount - 1) {
// in the last iteration return the index of the child
// we want to bring to front (and reset nextChildIndexToRender)
nextChildIndexToRender = 0;
return indexOfFrontChild;
} else {
if (nextChildIndexToRender == indexOfFrontChild) {
// skip this index; we will render it during last iteration
nextChildIndexToRender++;
}
return nextChildIndexToRender++;
}
}
});
rv.invalidate();
Run Code Online (Sandbox Code Playgroud)
基本上,onGetChildDrawingOrder(...)
将被调用childCount
次数,并且在每个中iteration
我们可以指定要渲染的子项(通过返回其索引).
子项的顺序由LayoutManager控制.由于性能原因,内置的LayoutManagers有自己严格的子命令.
当前实现的bringToFront只是将子项移动到子列表的末尾,这对现有的LayoutManagers不起作用.
如果您要定位Lollipop,则可以使用setElevation方法.要定位较旧的平台,您需要一个不依赖于子项顺序的自定义LayoutManager.