文档章节

android电视开发-RecyclerView分析1

冰雪情缘l
 冰雪情缘l
发布于 2017/11/18 03:20
字数 698
阅读 227
收藏 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
博文 34
码字总数 27399
作品 6
成都
程序员
私信 提问
2017 我用 5 个月分享了 98 篇优秀博文

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

code小生
10/30
0
0
认识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翻译应用、地图轨迹、视频广告、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 mediaplayer VideoPlayerManager 加载视频闪屏问题排查解决

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

ljianbing
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

0008-如何卸载CDH(附一键卸载github源码)

1.前置条件 本文档将介绍Cloudera Manager与CDH的卸载,并基于CDH使用parcels安装且未配置安全(AD/LDAP, Kerberos, Data Encryption)的集群,以下是本次测试环境,但不是本操作手册的硬限制...

Hadoop实操
22分钟前
1
0
MySQL 安装配置 Windows下免安装配置

1 安装MySQL软件 1.1 下载MySQL 依据ipems_dvp产品选型需求,选择mysql-5.7.17-winx64。可自行从网上下载,也可从公司拷贝,以下为下载目录和公司归档目录。 下载地址:https://downloads.m...

PeakFang-BOK
30分钟前
2
0
遍历java项目后台线程

遍历java项目后台线程,加深对项目后台运行线程理解 直接贴代码 import org.springframework.stereotype.Service;import java.lang.management.ManagementFactory;import java.lang.man...

王俊博客
44分钟前
2
0
iOS切面编程

aop编程(面向切面编程),其原理也就是在不更改正常的业务处理流程的前提下,通过生成一个动态代理类,从而实现对目标对象嵌入附加的操作。在iOS中,要想实现相似的效果也很简单,利用OC的动态性,...

RainOrz
51分钟前
2
0
PAT(Basic Level) 乙级练习题 ------ 1047 编程团体赛 java

1047.编程团体赛 题目: 编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。 现给定所有队员的比赛成绩,请你编写程序找...

Carol998
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部