RecyclerView 作为替代 ListView, GridView 的创世纪控件,确实已经非常优秀了,感觉和IOS的控件 UICollectionView 差不多,github上有一个控件对ReyclerView进行了扩充 SectionedRecyclerViewAdapter,MultiViewAdapter.
来看看小米的 PatchWall 拼图墙,现在电视开发的很多APP应用中,这种样式基本上很常见.
除了 要满足以上需求,可能还有设计,产品提的很多想杀人的需求,还好 谷歌很早就推出了 Leanback 这个框架,但是有一些需求也无法满足,需要改改代码.
其实我想对那些高层说的,你真的希望自己的设备的桌面,天天被人家运营?变来变去的?
可能用户真正需要的就是类似手机的launcher就好了,看电影,听音乐我打开APP就好了吧。
感觉是不是谷歌为了满足一行可以滚动的原因,分析 leanback 源码发现的是 RecyclerView 嵌套 RecyclerView,这样性能会损失一丢丢。
Leanback在中国这种行情需求下,还有大量市面上充斥的低端机器,多少会有一些卡顿,小卡顿主要是在 draw, measure, layout 上.
相对于 vlayout 来说,vlayout要轻很多,但是这个控件并没有过多去支持电视开发,需要修改,不过vlayout的思路确实不错,值得我们学习和借鉴.
上图是 结合 vlayout 与 SectionedRecyclerViewAdapter 的思考.
RecyclerView 源码分析阶段
先看看 LinearLayoutManager 是如何将一个个item展示出来的.
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
... ...
fill(recycler, mLayoutState, state, false);
... ...
}
void layoutChunk(RecyclerView.Recycler recycler, RecyclerView.State state,
LayoutState layoutState, LayoutChunkResult result) {
View view = layoutState.next(recycler);
... ...
measureChildWithMargins(view, 0, 0);
... ...
layoutDecorated(view, left + params.leftMargin, top + params.topMargin,
right - params.rightMargin, bottom - params.bottomMargin);
... ...
}
public void measureChildWithMargins(View child, int widthUsed, int heightUsed) {
... ...
// 对于 measure 不是很清楚的同学,建议百度,谷歌学习下或者看看进阶书籍,
child.measure(widthSpec, heightSpec);
}
public void layoutDecorated(View child, int left, int top, int right, int bottom) {
final Rect insets = ((LayoutParams) child.getLayoutParams()).mDecorInsets;
// 对于 layout 不是很清楚的同学,建议百度,谷歌学习下或者看看进阶书籍,
child.layout(left + insets.left, top + insets.top, right - insets.right,bottom - insets.bottom);
}
类似 GridLayoutManager 也是差不多的,就不一一阐述,自己看layoutChunk源码。
网上现在很多的自定义 RecyclerView(参考一,... ...),都是在改写 LayoutManager,因为ReyclerView 将展示出来这一块抽取出来了.(分析上面的代码,对于理解 vlayout 还是不错的)
OnePlusNLayoutHelperEx 分析
11
经过改造过后的 vlayout TV版本,更加轻量级,性能更好,等等。
放大效果被挡住了,进行 getChildDrawingOrder 的重写,具体可以参考leanback的那段代码。
焦点丢失
加载更多
中间滚动
RecyclerView 遥控器按键移动支持(应用场景为文件夹等等).
解决思路:https://gitee.com/kumei/Android-tv-dev-wiki