Android TV屏 开发、RecyclerView焦点处理等

这篇具有很好参考价值的文章主要介绍了Android TV屏 开发、RecyclerView焦点处理等。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android TV屏 开发、RecyclerView焦点处理等

 

TV屏使用遥控器控制,通过焦点操作界面,就跟电视投屏类似

一共两个核心,焦点的处理,按键的监听处理

按键原生提供了onKeyDown 来监听,通过不同的 keyCode 区分不同的按键

Android TV屏 开发、RecyclerView焦点处理等

一般如果没有遥控器,可以通过电脑键盘测试,使用投屏软件投屏后,对键盘按键效果跟遥控器类似

有时候没有实体按键(比如电脑没有返回键等),可以直接使用 adb 命令控制

adb shell input keyevent keyCode

至于长按事件,通过监听的 KeyEvent 参数中 repeatCount 判断,这里最好等于某个数字时触发,防止多次重复触发

Android TV屏 开发、RecyclerView焦点处理等

主动获取焦点使用方法 requestFocus(),但是可能会失败,所以需要注意等待UI刷新完后在调用

并且在需要获取焦点的view中设置属性,否则没法落焦

android:focusable="true"
android:focusableInTouchMode="true"

如果实在没法控制刷新后的时机,那就只能延迟(postDelayed)获取了,这个万能钥匙,但是尽量少用,影响效率,减低体验

对于焦点,上面的只是基本操作,实际开发中吭比较多,比较如果界面复杂,焦点是很不好控制的,加上列表各种刷新,跨界面恢复焦点等,懂得都懂

所以为了更好的定位问题,需要借助一些系统监听来获取焦点的状态,才能知道问题在哪

比如可以重写 requestChildFocus 方法,每次获取焦点时打印信息,看看是否被其它 view 抢占焦点

override fun requestChildFocus(child: View?, focused: View?) {
        child?.let {
            val position = getChildViewHolder(child).absoluteAdapterPosition
            Logger.d("requestChildFocus $position ")
        }
    }

或者使用全局监听 decorView.viewTreeObserver.addOnGlobalFocusChangeListener ,判断哪些 view 获取了焦点

针对获取焦点无效怎么处理?

估计很多时候会发现,调用了 requestFocus 方法没反应,这是因为没有对上个 view 的焦点进行 clear

你需要在监听中,把获取焦点的 view 赋值给你定义的变量 lastFocusView,然后每次调用 requestFocus 前先调用 lastFocusView.clearFocus()

tab 或者 列表 切换界面,这个时候操作遥控器子页面自动抢占了焦点,怎么处理?

可以通过对 onKeyDown 事件的拦截(return true),这样子页面是无法响应按键事件的,也就无法获取焦点

Android TV屏 开发、RecyclerView焦点处理等

针对一些个别 view 可以设置屏蔽焦点的属性

android:focusable="false"
android:focusableInTouchMode="false"

焦点边框样式统一处理

可以通过全局监听 addOnGlobalFocusChangeListener ,对 view 进行统一绘制边框,或者一些逻辑控制等

Android TV屏 开发、RecyclerView焦点处理等

window.decorView.viewTreeObserver
            .addOnGlobalFocusChangeListener { oldFocus, newFocus ->
                (newFocus ?: window.decorView.findFocus())?.let {
                    mainUpView.setFocusView(newFocus, oldFocus, 1.0f)
                }
            }

弹框无法获取焦点怎么处理?

一般 dialog 等只要设置了 focus 属性,然后在初始化调用 requestFocus,是没问题的,但是不排除一些个别情况

比如 PopupWindow,因为 window 弹出后,activity 的 onKeyDown 会无法响应,所以需要单独监听,前提是获取到焦点

如果碰到焦点不好处理,或者落焦后绘制边框等不方便,这里建议手动控制,因为落焦绘制是统一在全局监听里处理的,window 上需要额外监听,没有对这块逻辑封装好,就表示需要把整套逻辑搬到 window 上处理,这显然很冗余

所以何不直接监听 onKeyDown ,然后通过代码手动绘制边框焦点

contentView.apply {
            requestFocus()
            binding.flMove.setOnKeyListener { _, keyCode, _ ->
                Logger.d("setOnKeyListener keyCode $keyCode")
                when (keyCode) {
                    KeyCode.KEYCODE_DPAD_LEFT -> {
                        switchMenu(1)
                    }

                    KeyCode.KEYCODE_DPAD_RIGHT -> {
                        switchMenu(0)
                    }

                    KeyCode.KEYCODE_BACK -> {
                        dismiss()
                    }
                }
                false
            }
        }

Android TV屏 开发、RecyclerView焦点处理等

如果不太喜欢这个方案,还有另外一个方案

可以在xml中添加布局,去仿造弹框,这样焦点就可以统一处理,不过需要对这个布局进行一些显示隐藏的操作文章来源地址https://www.toymoban.com/news/detail-687417.html

到了这里,关于Android TV屏 开发、RecyclerView焦点处理等的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TV屏应用列表可编辑焦点方案

      tv屏中,最难处理的就是焦点问题,而复杂的焦点处理要属应用列表模块了 根据展示的列表,可以翻页,默认焦点处于左上角第一个,此时通过遥控器上下左右可以控制焦点移动位置 焦点所在应用需要有个黄色边框标识,往右移动到边界,自动到下一行,继续往右移动到边

    2024年02月08日
    浏览(26)
  • Android TV UI开发常用知识

    Google官方为Android TV的UI开发提供了一系列的规范组件,在leanback的依赖库中,这里介绍一些常用的组件,使用前需要导入leanback库。 这些Fragment有设计好的样式,只需要根据场景选择对应的Fragment,并往里面填充内容即可。 可以理解为一个水平的tab页面。左边是tab,右边是ta

    2024年02月07日
    浏览(31)
  • 使用树莓派打造Android TV盒子

    树莓派是一款功能强大且灵活的单板计算机,它可以用于各种创意项目。在本文中,我们将介绍如何使用树莓派搭建一个Android TV盒子,使你可以在电视上享受Android系统的各种应用和功能。 步骤1:准备所需材料 要开始构建你的Android TV盒子,你需要准备以下材料: 树莓派:建

    2024年02月04日
    浏览(40)
  • Android的UI开发——RecyclerView

    RecyclerView提供了三种布局管理器即: LinearLayoutManager 线性布局管理器 StaggeredGridLayoutManager 瀑布流布局管理器 GridLayoutManager 网格布局管理器 这三种布局管理器都是通过 setLayoutManager 方法来设置 1.LinearLayoutManager 线性布局管理器 效果如图:         1).新建一个类存放信息。

    2024年02月03日
    浏览(38)
  • Android 11 系统开发增加低电量弹窗提示 手机 平板 车载 TV 投影 通用

    SystemUIService 中启动PowerUI 主要修改 5、在symbols 文件中添加对应java-symbol方便Framework代码引用code

    2024年03月15日
    浏览(31)
  • 【Android -- UI 开发】RecyclerView 侧滑菜单(侧滑删除) 开源库

    不断学习,做更好的自己 !💪 侧滑菜单确实是一个比较常见的功能,其中场景较多的就是侧滑删除,它是iOS列表删除通用交互方式,比如微信、QQ、苹果自带的短信、通讯录列表等,都有侧滑删除功能。由于国内Android、iOS通常都是一套设计,因次,Android端怎么能少得了这个

    2023年04月21日
    浏览(32)
  • Android开发:RecyclerView获取item位置的几种方法比较

            当使用 RecyclerView 来展示列表数据时,获取 item 的位置是一个常见的需求。RecyclerView 提供了多种获取 item 位置的方法,包括 getAdapterPosition() 、 getBindingAdapterPosition() 、 getAbsoluteAdapterPosition() 等等。这些方法的实现原理和返回值有所不同,因此在实际使用时需要根据

    2023年04月20日
    浏览(55)
  • 大疆开发板A型基于HAL库使用RoboMaster 遥控器(DT7&DR16)及Debug在线调试

    资料官网: RoboMaster 机甲大师赛 1)新建new project,选择开发板A型芯片型号  2)打开外部高速时钟 下面是我的时钟树配置  3) 配置USART1通信接口  选择Asynchronous(异步通信)方式,并检查对应IO口是否与原理图对应 根据DBUS参数,配置参数设置 配置DMA (直接存储器访问)

    2024年02月07日
    浏览(30)
  • Android RecyclerView使用简述

      RecyclerView是Android中非常受欢迎的控件,RecyclerView是官方在Android5.0之后新添加的控件,推出用来替代传统的ListView和GridView列表控件,所以如果你还在使用ListView的话可以替换为RecyclerView了。 文章的功能可以先运行看看效果,APK下载   对于RecyclerView的使用根据实际项目进

    2023年04月08日
    浏览(79)
  • Android 使用 RecyclerView 创建动态列表

    记录一下学习过程,RecyclerView 创建动态列表效果如下: Recyclerview 认识 Recyclerview 库: Recyclerview 指南: RecyclerView 可以显示大型数据集,通过回收有限数量的视图可以有效地滚动这些数据集,同时最大限度减少内存用量。 在实例化 ViewHolder 视图时可以定义单击侦听器。 Recy

    2023年04月27日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包