文档章节

Andriod TV开发之Leanback

冰雪情缘l
 冰雪情缘l
发布于 2018/05/18 00:13
字数 1247
阅读 8091
收藏 3

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

本人由于最近一段时间很忙,一直都没有更新 android tv的开源库了,因为技术的更新迭代,TV开发的库已经升级为Leanback + 移动边框等等东西,希望这篇文章能激发你对于 Android TV 更多的想法,水平有限,互相学习,谢谢.

Android tv 开源社区地址:https://gitee.com/kumei (欢迎加入)

Android tv 开源社区收集的库:https://gitee.com/kumei/Android_tv_libs

Leanback demo地址: https://github.com/googlesamples/leanback-showcase

入门文章: https://www.jianshu.com/p/d575e0c7bd59

 

Leanback

谷歌官方的 demo 中 是这样的,那样的... ...,都是围绕 Fragment展开的.

如果真不想用谷歌自带的Fragment,想单独使用,或者写自己的标题栏或者多级菜单,这么办?

先来一张图片,类似下图的布局确实很酷炫.

 

如何使用 Leanback 的库

  • 直接Adnroid studio 导入,版本有差异化,不懂的百度查,github看.

使用Leanback弄出下面的界面

demo: https://gitee.com/kumei/Launcher 代码有点乱,后续整理.

我感觉不用分析什么Leabnack,也不用讲解一大堆如何使用,我下面就直接贴代码,并注释吧.

先来分析下上图,标题栏 + ViewPager(包含多个Fragment)

如果标题栏使用 Recyclerview 或者横向的布局,你都要处理焦点记忆问题,

这里推荐使用 Leanback 的 HorizontalGridView 作为标题栏使用,已经帮你处理焦点记忆问题,并且很不错.

标题栏

xml 大概如下 布局如下

<!-- 影视标题栏 -->
<com.open.leanback.widget.HorizontalGridView
            android:id="@+id/****"
            android:layout_width="match_parent"
            android:layout_height="@dimen/title_h" />

 <!-- 影视内容 -->
<android.support.v4.view.ViewPager
            android:id="@+id/*****"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

HorizontalGridView 其实继承的 RecyclerView,使用方式是一样的.

        mTitlerAdapter = new TitlerAdapter();
        titleHgridview.setAdapter(mTitlerAdapter);
        // 进行强转,GridLayoutManager.
        ((GridLayoutManager)titleHgridview.getLayoutManager()).setOnChildSelectedListener(new OnChildSelectedListener() {
            @Override
            public void onChildSelected(ViewGroup parent, View view, int position, long id) {
               // 选中某个item的处理, 比如翻页等等操作
            }
        });

这里给大家介绍一个小技巧 android:duplicateParentState="" 的使用,再配合 selector,然后布局里面的 控件都可以获取到父布局的属性,爽歪歪.

ViewPager内容

  •  布局里面使用 VerticalGridView,这里就相当使用 GridView,类似下图.

        mMoviceAdapter = new MoviceAdapter();
        moviceVgridview.setAdapter(mMoviceAdapter);
        // 初始化影视垂直布局.
        moviceVgridview.setNumColumns(6);
         // 因为标题下面布局的焦点上不去标题栏,需要设置,具体原理参考源码.
        ((GridLayoutManager)moviceVgridview.getLayoutManager()).setFocusOutAllowed(true, true);
        ((GridLayoutManager)moviceVgridview.getLayoutManager()).setOnChildSelectedListener(new OnChildSelectedListener() {
            @Override
            public void onChildSelected(ViewGroup parent, View view, int position, long id) {
            }
        });


// FocusOutAllowed focusOutSidAl... 也可以再xml设置,设置的属性如下,具体参考谷歌demo
<declare-styleable name="lbBaseGridView"> 
    <attr name="focusOutFront" format="boolean"/>
    <attr name="focusOutEnd" format="boolean"/> 
    <attr name="focusOutSideStart" format="boolean"/> 
    <attr name="focusOutSideEnd" format="boolean"/> 
    <attr name="horizontalMargin" format="dimension"/> 
    <attr name="verticalMargin" format="dimension"/> 
    <attr name="android:gravity"/>
</declare-styleable>
  • 如果想实现复杂的带标题栏的布局,类似下面的,或者小米瀑布流的.

// 使用 Leanback下列的数据结构,设置的方式和 Recyclerview差不多,具体也可以参考 Leabanck 的谷歌demo.

ItemBridgeAdapter mItemBridgeAdapter;
mVerticalGridView.setAdapter(mItemBridgeAdapter);

// 测试数据,demo.

public ItemBridgeAdapter getMoviceItemDatas() {
        mItemBridgeAdapter = new ItemBridgeAdapter();
        CardPresenter cardPresenter = new CardPresenter();
        final NewPresenterSelector newPresenterSelector = new NewPresenterSelector();
        ArrayObjectAdapter mRowsAdapter = new ArrayObjectAdapter(newPresenterSelector); // 填入Presenter选择器.
        for (int i = 0; i < 100; i++) {
            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
            MoviceItemData moviceItemData = mMoviceItemData.get(i); // 包含标题+内容列表的数据
            String title = moviceItemData .getTitle();
            HeaderItem settingHeader = new HeaderItem(i, title); // 标题头(比如 xxx榜单)
            List<SettingItem> items = moviceItemData.getItems(); // 内容列表.(影视内容)
            // 小技巧: 比如需要像图片中的频道一样,这里服务端返回的数据很多,换行了,
            // 可以进数据分段,一行8个填入,最后一行的,设置 ListRow(null, listRowAdapter2),那么标题栏就没有了.
            //
            ArrayObjectAdapter listRowAdapter2 = new ArrayObjectAdapter(cardPresenter);
            listRowAdapter2.addAll(0, items);
            ListRow listRow2 = new ListRow(settingHeader, listRowAdapter2);
            mRowsAdapter.add(listRow2);
        }
        mItemBridgeAdapter.setAdapter(mRowsAdapter);
        return mItemBridgeAdapter;
}

PresenterSelector 选择器,具体可以参考谷歌demo.

public class NewPresenterSelector extends PresenterSelector {
    private AListRowPresenter mNewListRowPresenter = new AListRowPresenter();
    private ARowPresenter mNewListRowPresenter2 = new AListRowPresenter();

    public NewPresenterSelector() {
    }

    @Override
    public Presenter getPresenter(Object item) {
        // 根据item判断,加载相应的 presenter,这里主要为了显示不同的东西.
    }

    @Override
    public Presenter[] getPresenters() {
        return new Presenter[]{
                *** ***
        };
    }
}

 

如何添加按键加载更多

由于TV上面属于遥控器操作,不像手机上面那样.

 @Override
    public void onScrollStateChanged(int state) {
        if (state == SCROLL_STATE_IDLE) {
           
            if (getLastVisiblePosition() >= getAdapter().getItemCount() - 1) {
                // 加载更多
            }
        }
        super.onScrollStateChanged(state);
}


public int getLastVisiblePosition() {
        final int childCount = getChildCount();
        if (childCount == 0)
            return 0;
        else
            return getChildAdapterPosition(getChildAt(childCount - 1));
}

// 也可以再这里进行处理,具体看需求了,还有个人喜好.
 @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        return super.dispatchKeyEvent(event);
    }

如何适配不同分辨率

我这里使用的是 AutoLayout,我以前也写过一篇文章 android tv如何适配不同平台,这里就不过多废话了.

 

放大效果

 

 

配合移动边框边框使用

 

多级菜单的编写

这里的菜单有2级,DEMO是一个直播的频道选择,显示预告信息的二级菜单.

 

键盘的编写

使用的 Leanback完成的 全键盘,T9键盘.

 

性能优化与安全等

 

有空后续整理到文章,笔记更新处:http://b53aa9d9.wiz03.com/share/s/2ReGDp2ND4ay2QH8h-1Hn0g13xil582J-Ahk2NIIwD0Z5Qt0

 

 

© 著作权归作者所有

冰雪情缘l

冰雪情缘l

粉丝 66
博文 37
码字总数 37558
作品 7
成都
程序员
私信 提问
酷莓开源组织/Android-TV-Frame

Android TV 开发框架 官方论坛:http://www.androidtvdev.com/ QQ群:522186932 () QQv2.0群: 468357191 () 一些Android tv开发总结:http://git.oschina.net/kumei/AndroidTVWidget/wikis/......

酷莓开源组织
2015/09/05
0
0
聊聊真实的 Android TV 开发技术栈

智能电视越来越普及了,华为说四月发布智能电视跳票了,一加也说今后要布局智能电视,在智能电视方向,小米已经算是先驱了。但是还有不少开发把智能电视简单的理解成手机屏幕的放大,其实这两...

承香墨影
04/28
0
0
Flutter TV应用的开发尝试

版权声明:本文为博主原创文章,转载需注明出处。 https://blog.csdn.net/jay100500/article/details/88597780 Flutter TV应用的开发尝试 Flutter主要是进行移动应用开发外,最近尝试了下Flu...

范特西_jay
03/16
0
0
AppCompat 22.1,Google暴走,MD全面兼容低版本

武侠相关的文学作品中常用“四十岁后不滞于物,草木竹石均可为剑。自此精进,渐入无剑胜有剑之境。”形容一个人的武功技艺高超,已臻化境。而我们IT工程师自身的技艺水平到达一定程度后,也会...

eclipse_xu
2015/04/24
0
0
国产开源项目又被抄袭?主角还是 00 后创业者

前两天,一位号称“中国首位 00 后 CEO”的 17 岁创业者李昕泽在互联网走红了。“可能一些三四十岁的老一辈企业家,他们就没法了解互联网,因为已经老了”,这些出自这位 00 后 CEO 的语录被...

局长
2017/09/05
13.6K
123

没有更多内容

加载失败,请刷新页面

加载更多

机器学习算法(一)——KNN算法

一、算法简介 k邻近算法( k-nearest neighbors ),即 KNN 算法。 KNN是一种基于实例学习( instance-based learning ),或者所是将所有计算推迟到分类之后的惰性学习( lazy learning )的一种算...

筠初
4分钟前
2
0
好程序员Java教程分享Java之包装类与常用类

好程序员Java教程分享Java之包装类与常用类,首先来讲一下包装类 基本数据类型(值类型):byte, short, int, long, float, double, char, boolean 包装类:将基本数据类型,用一个类进行了一...

好程序员官网
5分钟前
2
0
leetcode: 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)

如果不包含重复元素,则直接可以使用回溯 public List<List<Integer>> subSets(int[] nums) { List<List<Integer>> res = new ArrayList(); subSetsCore(res, nums, new Array......

蔚蓝_晴天
20分钟前
3
0
爱码仕 解读5G (六)健康管理和无线医疗

健康不是体检中心和医疗机构,享受高质量的健康状态是每个人都追求的目标。每个人无论老幼都应当有一健康管家和助手。5G、万物互联和数字专家让这一切成为现实。 (一)健康常识普及 曾经我们...

LitStone
22分钟前
3
0
寻找链表中点:快慢指针法

寻找链表中点 在多数场景中,举一个例子:一个数组,如果知道长度了,很容易计算出中点。但如果不知道长度的情况下,又该如何处理呢?很多人可能会求出该数组长度,然后除以2,得中点是n/2。...

HelloRookie
30分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部