Android TV开发 TCL电视开发实战 ui适配和焦点控制 Recyclerview自定义
1.常用的adb命令
2.ui适配方案
3.Leanback库简介
4.焦点处理
5.Listview GridView和recycler和自定义Recycler view动态添加view
6.按键失灵的解决办法,按键事件如何分发?
7.播放视频的功能
8.剧集控件绘制
9.Metro
10.和手机app开发的区别
1.调试盒子。
盒子的ip地址与电脑的ip地址保持一致
adb connect ip地址
adb uninstall 包名
2.焦点控制需要的一些方法。
requestFocus() //获得焦点
setNextFocusXXX//就是让下一个按上下左右键聚焦的view
可想而知,手机端我们直接通过点击\长按某个区域处理响应事件处,但是TV端只能通过遥控器的上下左右来操控焦点,从而选中特定的区域处理相应事件。
在TV开发中没有以前我手机端的dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent 事件来分发,而需要使用dispatchKeyEvent、onKeyDown、onKeyLisenter 等事件来分发处理焦点事件传递。
然而TV端焦点没有什么好办法可以全局控制焦点,需要我们自己来想办法规定焦点走向,一旦焦点没有处理好就会造成焦点丢失。
android提供了一些焦点相关的属性,在现有的框架层下通过设置View的属性来获得焦点:
android:focusable:设置一个控件能否获得焦点
android:nextFocusDown:(当按下键时)下一个获得焦点的控件
android:nextFocusDown:(当按下键时)下一个获得焦点的控件
android:nextFocusLeft:(当按下键时)下一个获得焦点的控件
android:nextFocusRight:(当按下键时)下一个获得焦点的控
**注意:**如果按下某个方向键时,想让焦点停留在自身,可以使用android:nextFocusRight:"@null"或者android:nextFocusRight:"@id/自身id"
3.Recyclerview的用法
TV布局:1.如果是简单的页面(死界面),建议直接就用textview直接布局,焦点逻辑用setNextFocusXXX就可以了。像这种:
动态界面:较复杂的那种,就需要自定义recyclerview,像:
主要是一个recyclerview来布局这个页面,用到recyclerview的分类,gridlayout的“合并单元格”的知识点。这个已经总结过了。下面开始总结我开发中问道的头疼的问题。
.滑动焦点错乱了
.当页面遥控器控制不了滑动了怎么办
.如何判定分页以及分页加载刷新后焦点逻辑
.删除后我的焦点该如何控制
.导航栏下来如何保存导航的状态以及第一个聚焦的始终是第一个item。
滑动焦点错乱了
.当遥控一直按住的时候,突然不知道焦点飞哪去了。
1.看看position是否在乱跳,我的主要是position乱跳导致焦点乱跳,然后我把布局都用LinearLayout限定宽高解决的
2.当遥控器按到底部的时候,如果底部还有数据但并没有显示在屏幕上,可能也会导致焦点乱跳。所以尽量让底部的界面露出来一些像上图一样。当然也可代码判断当焦点失去的时候,让页面先滑上来一些
3.什么去除recyclerview的动画以及写找不到焦点的处理方法
private void initView() {
setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
setHasFixedSize(true);
setWillNotDraw(true);
setOverScrollMode(View.OVER_SCROLL_NEVER);
setChildrenDrawingOrderEnabled(true);
setClipChildren(false);
setClipToPadding(false);
setClickable(false);
setFocusable(true);
setFocusableInTouchMode(true);
/**
防止RecyclerView刷新时焦点不错乱bug的步骤如下:
(1)adapter执行setHasStableIds(true)方法
(2)重写getItemId()方法,让每个view都有各自的id
(3)RecyclerView的动画必须去掉
*/
setItemAnimator(null);
}
onSearchFocusfailed方法百度很多,我没用到过
当页面遥控器控制不了滑动了怎么办
当遥控器向下按时没问题的,但向上按的时候滑不上去了比如下图:
此时屏幕上部应该还有数据,但并不显示在屏幕上,此时如果焦点在第一个item上,遥控器向上按就没反应,超出屏幕的部分应该是获取不到焦点的。
1)processKeyEvent方法的具体实现
private int processKeyEvent(QueuedInputEvent q) {
final KeyEvent event = (KeyEvent)q.mEvent;
//由dispatchKeyEvent进行焦点的分发,如果dispatchKeyEvent方法返回true,那么下面的焦点查找步骤就不会继续了。
//这里mView是Activity的顶层容器DecorView,是一FrameLayout。
//所以这里的dispatchKeyEvent方法执行的是ViewGroup的dispatchKeyEvent()方法
if (mView.dispatchKeyEvent(event)) {
return FINISH_HANDLED;
}
// 是否终止事件
// 当根视图不存在就会停止下面的步骤
// 属于保护措施
if (shouldDropInputEvent(q)) {
return FINISH_NOT_HANDLED;
}
int groupNavigationDirection = 0;
//对TAB键做特殊处理
//判断仅按下TAB还是TAB和其他键的组合
//metaStateHasModifiers()方法根据指定的META状态按下指定的按键键,则返回true.如果按下不同的修改键组合,则返回false.
//通过下面的方法判断groupNavigationDirection的方向
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getKeyCode() == KeyEvent.KEYCODE_TAB) {
if (KeyEvent.metaStateHasModifiers(event.getMetaState(), KeyEvent.META_META_ON)) {
groupNavigationDirection = View.FOCUS_FORWARD;
} else if (KeyEvent.metaStateHasModifiers(event.getMetaState(),
KeyEvent.META_META_ON | KeyEvent.META_SHIFT_ON)) {
groupNavigationDirection = View.FOCUS_BACKWARD;
}
}
... ... ...
// 应用 fallback 策略
// 具体实现见PhoneFallbackEventHandler中dispatchKeyEvent()方法
// 主要是对媒体键,音量键,通话键等做处理,如果是这些按键则会停止下面的步骤
if (mFallbackEventHandler.dispatchKeyEvent(event)) {
return FINISH_HANDLED;
}
// 自动追踪焦点
// 该部分是重点
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (groupNavigationDirection != 0) {
//如果是TAB键则groupNavigationDirection不为0,进行如下操作(这里不做重点解析)
if (performKeyboardGroupNavigation(groupNavigationDirection)) {
return FINISH_HANDLED;
}
} else {
//此处是对我们按键焦点处理的重点
//下面我们进入该方法详细去看一下,详见(2)
if (performFocusNavigation(event)) {
return FINISH_HANDLED;
}
}
}
return FORWARD;
}
参考博客:音视频大神《何俊林》
https://blog.csdn.net/hejjunlin/article/list/5?
https://blog.csdn.net/Coder_Hcy/article/details/80321939
Android TV开发 TCL电视开发实战 ui适配和焦点控制 Recyclerview自定义相关推荐
- android 仿今日头条_Android今日头条UI适配完善版
作者:xcheng_ 链接:https://www.jianshu.com/p/41930fde7aac 前言 众所周知 android的碎片化一直困扰着开发者,我们要花很多的时间去做UI适配的工作. ...
- Android 目前最稳定和高效的UI适配方案
Android系统发布十多年以来,关于Android的UI的适配一直是开发环节中最重要的问题,但是我看到还是有很多小伙伴对Android适配方案不了解.刚好,近期准备对糗事百科Android客户端设计 ...
- android如何获取电视的存储空间,Android TV (二)(处理电视硬件)
电视硬件基本上不同于其他Android设备.电视不包含一些硬件特性相比于其他电视设备,例如触屏.相机.GPS.电视也完全依赖于二次硬件设备.为了使用户和应用之间能够交互,必须使用远程遥或者游戏手柄.当 ...
- android tv keep,Keep电视版
Keep电视版帮你通过电视端和手机端结合来为你定制优秀的健身计划,软件融合了跑步.骑行.健身等多项功能帮助用户塑造完美身材,软件内也会对你每日所做的训练进行数据记录来做整体的统筹,适合喜欢运动却又没时 ...
- android 仿 tv 菜单,Android TV 开发之仿泰捷视频最新 TV 版 Metro UI 效果
Some Android TV related Sample 更多TV相关,欢迎关注公众号: Android TV开发交流群:135622564 1.Imitation of tai jie late ...
- android tv intel x86,Android TV x86 发布:吃灰老电脑秒变高清盒子
新酷产品第一时间免费试玩,还有众多优质达人分享独到生活经验,快来新浪众测,体验各领域最前沿.最有趣.最好玩的产品吧~!下载客户端还能获得专享福利哦! 原标题:Android TV x86 发布:吃灰老 ...
- android盒子安装windows,Android TV x86发布:吃灰老电脑秒变高清盒子
新酷产品第一时间免费试玩,还有众多优质达人分享独到生活经验,快来新浪众测,体验各领域最前沿.最有趣.最好玩的产品吧~!下载客户端还能获得专享福利哦! 安卓是一个非常灵活的平台,可以用在各种各样的设备上 ...
- Android TV Demo 工程,其中包含 TV 常用的自定义控件,飞框效果实现,外边框效果实现,UI 控件焦点自动处理,使 TV 开发更简单,更高效。
TVLibraryDemo 项目地址:zhangtiansheng/TVLibraryDemo 简介:Android TV Demo 工程,其中包含 TV 常用的自定义控件,飞框效果实现,外边框效果 ...
- Android TV UI开发常用知识
导入依赖 Google官方为Android TV的UI开发提供了一系列的规范组件,在leanback的依赖库中,这里介绍一些常用的组件,使用前需要导入leanback库. implementation ...
最新文章
- java 方法里面定义接口_java – 当接口A在其方法签名中定义接口B时
- 给GridView删除列添加删除提示
- C++静态库与动态库(简介)
- 看看这些被同事喷的 JS 代码风格你写过多少
- C#LeetCode刷题之#860-柠檬水找零(Lemonade Change)
- My97DatePicker 组件使用方法---My97DatePicker
- 责任链模式(Chain of Responsibility Pattern)
- linux模板机配置文件,制作Centos 7.4操作系统模板机
- CF 964C Alternating Sum
- pyspark用法2
- SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
- jQuery源码下载和编译
- 自动化测试常见问题总结
- 苏宁“北京攻略”:老阵地,新战场 | 一点财经
- AutoIt3常见问题解答
- 书籍推荐:国内第一本ASP.NET 3.5 MVC技术专著
- 利用redis生成订单号
- Mac 活动监视器 闪退 打不开
- FFmpeg流拼接滤镜concat原理与使用注意事项
- 解决CSS IOS字体自动调整放大了