文档章节

android电视开发-RecyclerView分析1

冰雪情缘l
 冰雪情缘l
发布于 2017/11/18 03:20
字数 698
阅读 271
收藏 0

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

    来看看小米的 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

 

 

© 著作权归作者所有

共有 人打赏支持
冰雪情缘l

冰雪情缘l

粉丝 55
博文 35
码字总数 27424
作品 6
成都
程序员
私信 提问
2017 我用 5 个月分享了 98 篇优秀博文

对上半年所分享的文章进行一个整理,很多读者当时忘记了收藏,以致于查找一篇历史文章很费劲,因此在这里顺便做下记录。目前就分下下面几个大类,没有更多细分,已基本可以查找了。 如果觉得...

code小生
2018/10/30
0
0
认识Android Support Library

本文目的:认识Android Support Library 本文转载于官网 Android 支持库提供了诸多未内置于框架的功能。这些库提供向后兼容版本的新功能、框架中未包含的实用 UI 元素,以及应用可以利用的一...

lichuangnk
2018/07/10
0
0
android适配全机型悬浮框、视频APP项目、手势操作、Kotlin妹子App、相机图片处理等源码

Android精选源码 图片滤镜处理,相机滤镜实时处理,相机拍照录制(http://www.apkbus.com/thread-602255-1-1.html) android仿爱壁纸App更换壁纸效果源码(http://www.apkbus.com/thread-60227...

逆鳞龙
2018/08/14
0
0
Android开发过程中的坑及解决方法收录

  1.某个控件要放在Linearlayout布局的底部(底部导航条)      <LinearLayout      android:layoutwidth="matchparent"      android:orientation="vertical"      andro......

SEOwhywhy
2018/12/08
0
0
如何在Android Studio中添加RecyclerView-v7支持包

一直知道RecyclerView可以代替ListView、GridView使用,听说功能很强大,但还没有去学习过。今天想学习,没想到还没开始便撞墙了。输入Recycler,只有这两个东西,没有提示RecyclerView,说明...

a10615
2016/04/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

HTTP 304状态码

客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified ...

Jack088
16分钟前
2
0
MyBatis学习笔记(二)

mybatis执行过程架构图 1、mybatis配置 SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。 mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql...

梦想_与_现实
21分钟前
0
0
分布式锁简单入门以及三种实现方式介绍

分布式锁简单入门以及三种实现方式介绍

zbbmaster
31分钟前
2
0
PHP接收前端传值各种情况整理

PHP接收前端传值各种情况整理 服务端代码: header('Access-Control-Allow-Origin:*');var_dump($_POST);exit; 情况 1) 传null $.post('http://xxxxx.xx/index.php', { "test": null}......

SSSWIIILLL
54分钟前
3
0
利用神器BTrace 追踪线上 Spring Boot应用运行时信息

概述 生产环境中的服务可能会出现各种问题,但总不能让服务下线来专门排查错误,这时候最好有一些手段来获取程序运行时信息,比如 接口方法参数/返回值、外部调用情况 以及 函数执行时间等信...

CodeSheep
今天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部