Android tv开发px,【Android】TV端项目开发挖坑总结
最近完成了一个TV端的项目,大致包括影视、直播观看,手机投屏操控,内容分类推荐等功能,解决了一些坑,但同时也挖了好多(逃(●'◡'●),在此简单记录一下
1.foucus焦点问题:
简单基础的view通过android:focusable="true"、android:nextFocusLeft=""、设置selector背景等属性就可以搞定,但如果你要实现复杂布局(或者嵌套布局)的recyclerview或者listview,那就需要自己重写事件处理了。当然你和我一样懒得话,可以使用google的leanback库,不过这样可客制化的空间就变小了,个人也不是很推荐使用吧,有利有弊,具体怎样使用下面解释。
2.播放器IjkPlayer问题
主要就是so库蛋疼的编译问题。。。如果你是windows电脑的话基本可以不用自己编译了,可以在这做一回伸手党拿到so库,接下来就是自己把IjkPlayer封装成一个自定义的framelayout,根据需求处理其各种回调(缓冲、暂停、启动、重播、后台、出错、完成等等),开心的是TV端只要做一些最简单的播放操作就可以了,至于弹幕、旋转、音量、亮度等完全不需要考虑。
播放结束后记得relase播放器即可。
3.手机投屏、操控问题解决
采用了NSDManager+AsyncHttpServer开源库的方式起长连接完成。简单解释下就是:
---------------------Server(TV端)--------------------------------------------
1.后台service起一个AsyncHttpServer
2.配置NsdServiceInfo的端口号、协议类型、协议名等信息,并注册NSDManager Service (等待client 来扫描连接)
---------------------Client(手机端)---------------------------------------
3.注册NsdManager.DiscoveryListener(扫描),及NsdManager.ResolveListener(扫描条件满足后的连接listener)
4.连接socket
5.发送交互信息
连接完之后,我们就能自定义上层信息协议了(通过setStringCallback,解析不同string完成不同操作)。比如说用户token传递、投屏影片url传递,完全只需要加密过后以string的方式传递过来,server解析后跳转对应界面就行了。至于远程遥控功能,目前我是使用Instrumentation来发送虚拟按键,从而完成手机遥控。
4.界面展示与网络请求数据
由于TV端一般都是采用tab标签+fragment的形式,而且数据一般不会短时间内变化,所以最好不要频繁刷新数据与view,请求一次后如果没有触发刷新事件,你就可以一直用这次的response,fragment也只需要hide即可。
5.leanback相关使用问题
主要是针对VerticalGridFragment的定制,实现这样一个界面,并可以将focus移动到上方tab的位置。
我的收藏.png
官方demo也比较清楚,要实现这样一个效果,只需要照着它的模板去实现一个PresenterSelector(如果只有一种viewtype,直接提供一个Presenter即可)和ArrayObjectAdapter即可,将网络请求的数据add进adapter就会自动去notify,主要是一些UI细节方面需要我们去改变。
加载数据前后loading界面:
getProgressBarManager().show();
getProgressBarManager().hide();
设置列数,行间距:
/**
* Created by lucky on 2017/7/17.
*/
public class CustomVerticalGridPresenter extends VerticalGridPresenter {
private VerticalGridView gridView;
public CustomVerticalGridPresenter(int focusZoomFactor) {
super(focusZoomFactor);
}
@Override
protected void initializeGridViewHolder(ViewHolder vh) {
super.initializeGridViewHolder(vh);
gridView= vh.getGridView();
int top= DensityUtil.dip2px(vh.getGridView().getContext(),25);//this is the new value for top padding
int bottom= gridView.getPaddingBottom();
int right= gridView.getPaddingRight();
int left= gridView.getPaddingLeft();
gridView.setPadding(left+top,top,right+top,bottom+top);
gridView.setHorizontalSpacing(top);
gridView.setVerticalSpacing(top);
}
}
接着在VerticalGridFragment中:
CustomVerticalGridPresenter gridPresenter = new
CustomVerticalGridPresenter(ZOOM_FACTOR);
gridPresenter.setNumberOfColumns(COLUMNS);
setGridPresenter(gridPresenter);
VerticalGridFragment顶层控件不能向上导航focus,如上图中焦点无法移动到我的收藏那一行item:
可以重写一个一模一样的lb_vertical_grid_fragment,自己写的布局会覆盖掉系统的布局,再将BrowseFrameLayout重写成我们自己的BrowseFrameLayout。
主要是因为VerticalGridFragment中的父布局拦截了事件,详细原因可以看这
Android tv开发px,【Android】TV端项目开发挖坑总结相关推荐
- java项目_好程序员Java分享从入门到服务端项目开发的过程
好程序员Java分享从入门到服务端项目开发的过程,对于打算入门或者刚刚入门学习Java的人来说,刚开始接触这门学科,往往会觉得不知所措,也会觉得很迷茫.结合前人经验,就从入门到进阶对于Java的学习而 ...
- 从Unix开源开发学习应对大型复杂项目开发
封装与抽象 在 Unix.Linux 系统中,有一句经典的话,"Everything is a file",翻译成中文就是"一切皆文件".这句话的意思就是,在 ...
- java项目开发实战入门电子书,java项目开发实战入门全彩版
<JaWeb项目开发实战入门>以企业门户网.51商城.BBS--程序源论坛.YouKnow问卷.OA办公自动化系统.铭成在线考试系统.K12(中小学)综合测评系统和Show--企业个性化展 ...
- 浅谈软件开发工具CASE在软件项目开发中发挥的作用认识
浅谈软件开发工具CASE在软件项目开发中发挥的作用认识 内容摘要:阐述了CASE工具作为 一种开发环境在软件项目开发中所起到的开发及管理作用.CASE工具实际上是把原先由手工完成的开发过程转变为以自动 ...
- 魔方APP项目-01-移动端开发相关概念、移动端自适配、元信息(meta)、开发准备、移动端项目搭建(模拟器调试)、APICloud(APICloud 前端框架,获取服务端API接口)
一.移动端开发相关概念 1.APP类型 ①.Native APP Native APP又称原生APP,就是我们平时说的手机应用软件. 原生APP 是针对IOS.Android.Windows等不同的手 ...
- React Native Expo开发的OW移动端项目
iOS演示 开源地址 GitHub Gitee 项目地址 Andorid 版 Android Expo 版(需 Expo 移动端(Android/iOS)) Expo 简介 项目基于Expo的 Rea ...
- Vue 移动端项目开发流程
目录 移动端电影项目 1.项目效果 2.开发项目流程 3.开发环境 4.初始化项目 5.vant 移动端组件库 介绍 5.5.1.安装 5.5.2.自动按需引入组件 (推荐) 5.5.3.移动端样式设 ...
- python移动端web开发代码_移动web前端开发,前端开发工作总结,移动端页面开发-我主页-一个前端程序猿的博客...
热门推荐 html/css 一.escape和它们不是同一类简单来说,escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读.编码之后的... 标签: 0 ...
- python项目开发实战网盘-python项目开发实战 第2版
python项目开发实战 第2版是一本Python项目开发流程实战手册,由日本BePROUD股份有限公司编著.本书的内容全部基于python开发事实,全部都是BeProud员工实际尝试.实践过的,可以 ...
最新文章
- 微信开发之自动回复图文消息
- 打印机更换感光鼓单元k_SOHO打印机基础培训(成像原理)
- mysql架设_服务器架设MySQL开发规范与使用技巧
- 线上服务CPU100%问题快速定位实战(转载公众号:架构师之路)
- 【NOIP模拟题】“与”(位运算)
- 3d数学基础图形与游戏开发 英文版_1850款文字标题字幕条,AE图形预设包,logo生成神器...
- python使用的一些小事儿
- Python_软件安装
- hping3安装及使用
- 2022.08.09-docker容器网络配置-左冕
- 软考:McCabe环路复杂度计算方法
- web绿色服务器单文件,Web个人临时共享服务器
- 【EXCEL】表格中固定行列 冻结窗口怎么是灰色的
- WordPress的.htaccess优化技巧是什么
- 2012第33周国内Android应用下载动态
- HHUOJ 1389 出栈合法性
- Windows 10 无法设置代理
- 大数据如何改变我们的国庆假期?
- 数据分析Excel必备技能:数据透视表使用教程
- STM8驱动0.96寸OLED(12864液晶屏)
热门文章
- PHP中等良好优秀,成绩优秀,中等,良好怎么分的啊?分为哪几个?
- ps2019布尔运算快捷键_超实用:换个角度教你快速理解PS CS6布尔运算
- Leetcode每日一题:141.linked-list-cycle(环形链表)
- 541页《利用Python进行数据分析》分享(附源码下载)
- 西瓜书+实战+吴恩达机器学习(二三)EM算法和变分推断
- 吴恩达机器学习(十五)大规模机器学习(Batch、Stochastic、Mini-batch gradient descent、MapReduce)
- LeetCode 545. Boundary of Binary Tree 二叉树边界
- 单击选定单元格后输入新内容_2015年计算机一级msoffice考前简答题练习
- MyBatis入门到精通——Mybatis入门篇
- Spring Boot + Activiti 在浏览器显示工作流图