文档章节

android电视开发-RecyclerView分析1

冰雪情缘l
 冰雪情缘l
发布于 2017/11/18 03:20
字数 698
阅读 187
收藏 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

粉丝 54
博文 34
码字总数 26309
作品 6
成都
程序员
认识Android Support Library

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

lichuangnk
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...

逆鳞龙
08/14
0
0
android mediaplayer VideoPlayerManager 加载视频闪屏问题排查解决

Android VideoPlayer 在滚动列表实现item视频播放(ListView控件和RecyclerView),在列表滚动时点击屏幕列表暂停,在item视频播放区域,视频播放时会出现闪屏问题。 排查解决,VideoPlayer...

ljianbing
06/26
0
0
android翻译应用、地图轨迹、视频广告、React Native知乎日报、网络请求框架等源码

Android精选源码 android实现高德地图轨迹效果源码(http://www.apkbus.com/thread-601383-1-1.html) 使用React Native(Android和iOS)实现的 知乎日报效果源码(http://www.apkbus.com/thre...

逆鳞龙
07/03
0
0
Android分页加载刷新AsyncListUtil中DataCallback的refreshData()

Android分页加载刷新AsyncListUtil中DataCallback的refreshData() Android分页加载刷新AsyncListUtil中DataCallback的refreshData()函数,返回值控制分页总数据量。如果返回一个既定的整型数...

zhangphil
05/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

arts-week10

Algorithm 905. Sort Array By Parity - LeetCode Review Who’s Afraid of the Big Bad Preloader? 一文读懂前端缓存 一个网络请求3个步骤:请求,处理,响应,而前端缓存主要在请求处响应这两步...

yysue
今天
0
0
00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
5
0
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
136
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部