TV端开发之support-v17库

Android TV端开发从0到1的一点经验

Posted by lx8421bcd on December 16, 2018

前言

android-support-v17-leanback库是Google专门针对TV端开发提供的支持库,这个库包含了Google基于Material Design实现的一整套TV端的UI交互方案实现,以及其配套的控件。

这个是Google提供的实现样例:leanback showcase

如果我们要开发TV端,一般是没有办法直接引用leanback库的,之前我们说过,Android TV还有大量低版本的系统,目前设定minSdkVersion=14是比较保险的做法,也许再过2年我们可以毫无顾忌的将最低支持版本设定到17+。
另一方面,如果浏览过v17库的代码,可以看出它写的很死,如果你不按照Google定义的那几个布局来写界面,那么这个库里面有大量的东西你完全用不到,哪怕是基础控件,能复用的也没几个。

虽然不方便直接引用,但v17库对于TV端开发来说有非常大的参考价值。v17库中Google花了大力气去处理焦点问题,有些时候自定义控件或者界面上的焦点跳转出现异常时可以在这里找寻Google怎么做,有些比较通用的控件也可以直接从库中拿出来源码集成。

v17.leanback.app

app包下提供了大量按Material Design实现的界面,以Fragment形式引入,全部继承自.app.BaseFragment类,一般来说我们不会直接使用这里的Fragment,毕竟自定义过于麻烦,不过,当你的应用以Fragment作为主要界面承载时,可以参考这个库里的实现,配合showcase里面的使用来完成。

因为不是重头,这里对这个包的内容就不再过多叙述了。

v17.leanback.widget

widget包内提供的自定义控件对于我们来说非常有价值,尽管很多控件仍然是针对Google的TV端设计写死的,但当我们要研究Google怎么处理TV端的焦点问题时,首先就得找这里。
这里我推荐几个值得一读和通用性较强的控件

BrowseFrameLayout

一个能够拦截并指定焦点派发的Framelayout,我在开发TV端时大量使用了此控件,看看这个控件的源码,其实只是在focusSearch方法上做了点文章而已。根据其实现原理,我们也可以很轻易的写出各种“BrowseXXXLayout”。

// 核心方法,定义了两个Listener,写好get/set,在这两个函数中回调
@Override
protected boolean onRequestFocusInDescendants(int direction,
        Rect previouslyFocusedRect) {
    if (mOnChildFocusListener != null) {
        return mOnChildFocusListener.onRequestFocusInDescendants(direction,
                previouslyFocusedRect);
    }
    return super.onRequestFocusInDescendants(direction, previouslyFocusedRect);
}
@Override
public View focusSearch(View focused, int direction) {
    if (mListener != null) {
        View view = mListener.onFocusSearch(focused, direction);
        if (view != null) {
            return view;
        }
    }
    return super.focusSearch(focused, direction);
}

BrowseFrameLayout 源码

VerticalGridView/HorizontalGridView

这两个控件是Google对RecyclerView的封装,它两均继承自BaseGridView,BaseGridView继承自RecyclerView。
这两个控件也是针对MD设计做了一定封装,源码看起来有点绕。VerticalGridView和HorizontalGridView里的内容主要是针对布局方向做了点特殊处理。
VerticalGridView 源码
HorizontalGridView 源码
BaseGridView里面的主要内容是资源初始化和方法定义。
BaseGridView 源码
逻辑的大头在LayoutManager里面。
GridLayoutManager 源码

其他

相比如上面两个包的内容而言,其他几个包的参考价值并不是很高,基本上是为app包中的定制UI服务,完整源码可以参考googlesource上的内容

android-support-v17-leanback 源码地址