android电视开发-RecyclerView分析1

本文探讨了RecyclerView及其在Leanback框架中的应用,对比分析了小米PatchWall拼图墙等案例,并深入研究了LayoutManager的定制化实现。同时,文章还讨论了vlayoutTV版本的改进之处。

    RecyclerView 作为替代 ListView, GridView 的创世纪控件,确实已经非常优秀了,感觉和IOS的控件 UICollectionView 差不多,github上有一个控件对ReyclerView进行了扩充 SectionedRecyclerViewAdapterMultiViewAdapter.

    来看看小米的 PatchWall 拼图墙,现在电视开发的很多APP应用中,这种样式基本上很常见.

031927_Dskl_269399.png

031943_IvIe_269399.png

    除了 要满足以上需求,可能还有设计,产品提的很多想杀人的需求,还好 谷歌很早就推出了 Leanback 这个框架,但是有一些需求也无法满足,需要改改代码.

其实我想对那些高层说的,你真的希望自己的设备的桌面,天天被人家运营?变来变去的?

可能用户真正需要的就是类似手机的launcher就好了,看电影,听音乐我打开APP就好了吧。

    感觉是不是谷歌为了满足一行可以滚动的原因,分析 leanback 源码发现的是 RecyclerView 嵌套 RecyclerView,这样性能会损失一丢丢。

034816_r28p_269399.png

    Leanback在中国这种行情需求下,还有大量市面上充斥的低端机器,多少会有一些卡顿,小卡顿主要是在 draw, measure, layout 上.

    相对于 vlayout 来说,vlayout要轻很多,但是这个控件并没有过多去支持电视开发,需要修改,不过vlayout的思路确实不错,值得我们学习和借鉴.

032717_dcyh_269399.png

上图是 结合 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的那段代码。

003739_TCkw_269399.png

焦点丢失

加载更多

中间滚动

RecyclerView 遥控器按键移动支持(应用场景为文件夹等等).

解决思路:https://gitee.com/kumei/Android-tv-dev-wiki

 

 

转载于:https://my.oschina.net/hailongqiu/blog/1575382

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值