android 布局文件中 view 焦点获取浅析

Android焦点事件分发与传递机制 Android 焦点事件分发与传递机制 阅读详情

      参与开发一个视频播放器的时候,发现对布局中的焦点的控制不会。。有的能下来有的不能下来,有的下来之后又上不去了,究竟是什么原因呢。

看了这篇文章,顿时解惑不少。

关键词在于:边界,Activity对整体焦点的控制,dispatchKeyEvent ;

就是利用dispatchKeyEvent  重新获取按键消息,从而在全局上使得布局中 你想要获取焦点的元素获取焦点。而在焦点中的元素是干不了不属于自己

范围内的事情。


原文:单击打开原文 

前不久遇到一个问题,在一个布局文件中上下移动焦点,这个布局文件的大体结构如下:

 

            <RelativeLayout >

                    <LinearLayout ></LinearLayout>

                    <HorizontalScrollView >

                               <LinearLayout ></LinearLayout>

                     </HorizontalScrollView>

            </RelativeLayout>

 

        现在遇到的问题是:我们要在 HorizontalScrollView 布局中左右移动焦点,在 下面的 LinearLayout 中有很多水

 

平放置的AppWidget,当焦点移动到某个AppWidget时将这个AppWidget的Layout布局放到上面

 

的 LinearLayout 中,我们需要实现的效果是:可以将焦点在上下两个 LinearLayout 之间移动。

 

          在最初的设计中,我们是将 KeyEvent 事件交给 HorizontalScrollView 来处理,处理方法是在: 

 

HorizontalScrollView 上加了 OnKeyListener。结果是:我们只能在下面的 LinearLayout 中左右移动焦点,不能

 

将焦点移动到上面的 LinearLayout 上,或者移动上去后就移不下来了。

 

           下面谈谈我的解决过程:

 

         (1)首先在 android SDK 文档中对 HorizontalScrollView 的定义是: Layout container for a view

 

hierarchy,并且 HorizontalScrollView only supports horizontal scrolling.  所以,在 HorizontalScrollView 只

 

能添加 KeyEvent.KEYCODE_DPAD_RIGHT 和 KeyEvent.KEYCODE_DPAD_LEFT 的 KeyEvent 事件,而 

 

KeyEvent.KEYCODE_DPAD_DOWN 和 KeyEvent.KEYCODE_DPAD_UP 事件是得不到正确处理的。

 

原因有两点:(1)HorizontalScrollView 本身只能在水平方向移动。(2)OnKeyListener 事件是加

 

在 HorizontalScrollView 上的,如果你想向上移动到上面的 LinearLayout 上,其实已经越界了,不是这

 

个 OnKeyListener 能处理的了。

 

           (2)在 android 中当一个按键按下时的处理过程是: 

 

             首先触发该 Activity 的 dispatchKeyEvent 方法

 

             然后触发 onUserInteraction 方法

 

             再然后触发 onKeyDown 方法

 

           (3)android 对 dispatchKeyEvent 方法的定义是: Called to process key events. You can override

 

this to intercept all key events before they are dispatched to the window. 所以,要想在整个 Layout 中移

 

动焦点,应该重写 dispatchKeyEvent 方法,将 KeyEvent 事件首先交给 dispatchKeyEvent 方法来处理,才能在这

 

个 Activity 的整个 Layout 中自由的移动焦点。

Android中View和ViewGroup介绍 图1 窗口系统的客户端DecorView实际上是一个ViewGroup。在依存关系上来讲,对单个主窗口来讲,DecorView是Top-Level View。View并不是关注的重点,重要的是我们需要知道消息分发路径是建立在什么关系上的。View的成员变量mParent用来管理View上级关系的。而ViewGroup顾名思义就是一组View的管理,于是在ViewGroup构建了焦点管理和子View节点数组。 阅读详情

相关推荐

Reeds-Shepp曲线公式推导及代码实现-第二部分(共三部分)

文章目录2. Reeds-Shepp求解2.1 L+S+L+L^+S^+L^+L+S+L+2.2 L+S+R+L^+S^+R^+L+S+R+2.3 L+R−L+L^+R^-L^+L+R−L+2.4 L+R−L−L^+R^-L^-L+R−L−2.5 L+R+L−L^+R^+L^-L+R+L−2.6 L+Rβ+Lβ−R−L^+R_{\beta}^+L_{\beta}^-R^-L+Rβ+​Lβ−​R−2.7 L+Rβ−Lβ−R+L^+R_{\beta}^-L_{\beta}^-R^+L+Rβ−​Lβ−​R+2.8

jianmo的博客 1213

Android View 获取焦点

Android View 获取焦点 有时我们需要某些View获取焦点,比如EditText获取焦点弹出键盘,我们有以下几种方式可以做到 1.在页面初始化的时候调用view.requestFocus() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ...

依生依世 3488

深入解析CRC-16校验算法及其Verilog硬件实现

本文深入解析了CRC-16校验算法的原理及其在Verilog中的硬件实现方法。从基础的模2除法到串行和并行实现方案,详细介绍了LFSR结构、状态转移分析以及工业应用中的优化技巧。通过实际案例和性能对比,帮助开发者理解如何选择适合的CRC实现方案,确保数据传输的可靠性。

yolo5detector的博客 322

Android焦点处理流程

1.连接WindowManager和DecorView的纽带2.完成view的measure,layout,draw3.向DecorView分发按键、触摸事件等。关于按键事件和焦点寻找:先判断是否有按键事件处理1.若返回true,则打断该方向上的焦点寻找。2.若返回fasle,则根据指定的方向寻找最近且可获取焦点的view2.1判断view的类型,是否为ViewGroup。

m0_64365896的博客 2307

优刻得首个「国产千卡智算集群」落地,支持智源千亿大模型训练

在人工智能引领的时代浪潮中,算力已成为技术进步与创新的核心驱动力。面对当下AI算力需求的飙升、高端AI芯片供应受限的挑战,加之OpenAI带来的技术封锁,唯有坚定不移的发展自主可控的国产技术方案,持续壮大国产智算集群规模,才能一路突破围追堵截,进一步促进国产大模型产业生态繁荣。集群还提供了完善高效的软件栈工具,集成多种主流的深度学习编程框架,通过测试验证,确保了对行业领先人工智能模型的高效支持,做到开箱即用,用户可快速投入模型的开发和部署,加速了其在人工智能领域的布局和发展。方面取得了显著成效。

Ucloud_TShare的博客 1473

基于mediapipe的动作捕捉和unity的人物模型驱动

用到的人体关键点检测的算法是Google开发的基于深度学习的实时多媒体套件,汇集了人体、手部、人脸关键点追踪、物体检测、物体识别等多个流行的视觉任务的成果。整套 Mediapipe正如其名字,专门为便携设备上的多媒体应用设计,模型非常小,在笔记本手机上也能实时跑,跨平台、跨语言。mediapipe实时性是没什么问题。但是是以牺牲了质量为代价的,这种关键点检测一般是用来做动作识别,类似于运动app跳绳计数、判定瑜伽动作标不标准这种。用单目视觉来做人物模型的驱动,总差点意思。

qq_58484580的博客 5727

Android 打开H5页面,H5页面获取到焦点时,页面顶部被拉出一片空白

刚打开页面是这样子: 获取到焦点弹出软键盘后变成了这样子: 退出软键盘后,页面又变回正常了: 解决办法:在获得焦点弹出软键盘时,顶部不能拉出一片空白。 在父级GroupView加上android:fitsSystemWindows="true", <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/andro...

Hly的博客 679

部署与可视化系统:移动端落地保姆级教程:YOLOv8 转换为 NCNN 并封装进 Android App 调用摄像头实时检测

本文介绍了在移动端部署YOLOv8模型的最佳实践。通过实测数据对比,采用NCNN框架在骁龙865设备上可实现35+FPS的实时推理性能。文章详细分析了NCNN相比TFLite、MNN等框架的优势,包括更高的ARM CPU性能、更优的Vulkan GPU加速和更小的模型体积。同时提供了从PyTorch模型到NCNN格式的完整转换流程,包括FP16优化和INT8量化方法,并重点解析了YOLOv8特有的输出格式处理要点。建议开发者先在Python环境验证NCNN推理流程,再部署到Android平台,以确保最佳性能

ZXSXJ的博客 209

Android 控件获取焦点

请求焦点   方法requestFocus()代码如下: public final boolean requestFocus() { return requestFocus(View.FOCUS_DOWN); } public final boolean requestFocus(int direction) { return requestFocus(direction, null); } public boolean reque

q1165328963的博客 9583

RK3568平台(camera篇) MPP编码

同芯片的差异,为使用者提供统一的视频媒体处理接口(Media Process Interface,缩写 MPI)。瑞芯微提供的媒体处理软件平台(Media Process Platform,简称 MPP)是适用于瑞芯微芯片系列的。mpi_enc_test 的命令参数中,图像宽度(w)图像高度(h),码流类型(t)为强制要求参数,其他参。视频拷贝,缩放,色彩空间转换,场视频解交织(Deinterlace)数如输入文件(i),输出文件(o),编码帧数(n)等为可选参数。设置一些MPP的模式。

weixin_49303682的博客 7379

图文详解秋叶ComfyUI整合包开启密码访问教程(附内网穿透实战经验) ComfyUI密码、ComfyUI-Login、ComfyUI内网穿透、秋叶整合包、ComfyUI安全防护

想远程访问 ComfyUI(跨设备或公网)不希望任何人随意使用或篡改服务需要给 ComfyUI 添加登录验证机制只要按照本文教程,安装插件,并设置好用户名密码,你就能把服务加上一道强力的门槛。📌配合ngrokfrp等内网穿透工具使用公网域名推荐启用 HTTPS(SSL证书可以用宝塔/ZeroSSL 申请)密码可以设置复杂一些,定期更换更安全📬如果你在配置过程中遇到问题,欢迎评论区留言交流,或者私信我,后续我也会更新更多 ComfyUI 插件教程、安全部署经验等内容。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2732

android 布局文件中 view 焦点获取浅析

              前不久遇到一个问题,在一个布局文件中上下移动焦点,这个布局文件的大体结构如下:               &lt;RelativeLayout &gt;                     &lt;LinearLayout &gt;&lt;/LinearLayout&gt;                     &lt;HorizontalScrol...

liuyun 507

CGAL 网格等高线计算

CGAL 网格等高线计算

dayuhaitang1的博客 452

Android View 的焦点控制基础

在这种复杂的 RecyclerView 嵌套场景中,要解决内层 item 的焦点获取问题,需要全面考虑多种因素,对焦点机制在遥控器和触摸操作下的行为有深入的理解,并仔细排查可能存在的问题。在 RecyclerView 嵌套 RecyclerView 且需同时支持遥控器和触摸操作的复杂情境中,获取内层 item 的焦点可能会遇到困难。当直接请求焦点无效时,我使用。在 Android 中,是有一套自己的焦点查找的算法,简单来说,就近原则,就是按方向就近查找下一个符合条件的 View。用户是否指定寻址规则。

嗯... 3199

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android View如何获取焦点 EditText焦点转移

当Android启动Activity,dialog或者其他窗体中中包含EditText,焦点默认会在EditText上,这是android系统会弹出软键盘,有的时候我们不需要界面启动时立刻弹出键盘。我们可以在启动界面时让焦点聚集到一个View上如下做法: 一、新的UI窗体创建的时候在onCreate()方法中将焦点放在另一个view上.   view.setFocusableI

qqwei321的专栏 1462

从源码出发浅析Android TV的焦点移动原理

本文禁止转载。之前我已经在微信公众号发过一次,有兴趣的可以看一下从源码出发浅析Android TV的焦点移动原理-上篇 和 从源码出发浅析Android TV的焦点移动原理-下篇焦点:焦点(Focus)可以理解为选中态,在Android TV上起很重要的作用。一个视图控件只有在获得焦点的状态下,才能响应按键的Click事件。 上图中,外面有一个绿色光圈的视图,就是当前有焦点的视图。相对于手

疯狂大剑豪的专栏 7936

android怎么设置view获取焦点

Android如何设置View获取焦点 在Android开发中,通过设置View获取焦点可以让用户在界面上进行交互操作。本文将介绍如何在Android应用中设置View获取焦点,并提供相关的代码示例和流程图以帮助读者更好地理解。 1. 设置View获取焦点的方法 在Android中,可以通过调用requestFocus()...

weixin_42165712的博客 502

android View类详解。

Android中的View类代表用户界面中基本的构建块。一个View在屏幕中占据一个矩形区域、并且负责绘制和事件处理。View是所有widgets的基础类,widgets是我们通常用于创建和用户交互的组件,比如按钮、文本输入框等等。子类ViewGroup是所有布局(layout)的基础类。layout是一个不看见的容器,里面堆放着其他的view或者ViewGroup,并且设置他们的布局属性。 所...

challenge51all的专栏 1万+

Android TV开发总结【焦点】

一、焦点获取 首先,TV端的开发和我们手机端开发最大的区别就在于TV端存在焦点的概念。 如下图: 可想而知,手机端我们直接通过点击\长按某个区域处理响应事件处,但是TV端只能通过遥控器的上下左右来操控焦点,从而选中特定的区域处理相应事件。 在TV开发中没有以前我手机端的dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent 事件来分发...

李彬博客专栏 1万+

安卓开发中EditText的焦点改变处理(获取焦点和失去焦点交互变化)

在安卓项目开发中,我们经常会遇到一些对EditText的处理问题,包括对EditText的焦点的改变,我们需要结合实际情况对其进行获得焦点,打开输入法和失去焦点,关闭输入法的交互操作。 我在这里介绍一种简单的处理方式,希望在看了我的博文之后对您的需求有所帮助。

小明的码路-博客 1万+

天天记录 - Android焦点相关知识学习

focus 是使用物理按键的情况描述,例如使用向下键选中一个view,这个view就是focused * Button 获取焦点: button.setFocusable(true); button.setFocusableInTouchMode(true); button.requestFocus(); 二、 Android Focus 相关源码分析  焦点改变最终都

Android 5907

Android设置edittext获取焦点

如何使Android中的EditText获取焦点 在Android开发中,EditText是用于用户输入的常用控件。如果你想让EditText在活动启动时自动获取焦点,那么这个过程会涉及到一些简单但重要的步骤。本篇文章将帮助你理解如何实现EditText获取焦点的全过程,包含详细的代码示例和注释。 流程概述 以下是实现Ed...

weixin_41260018的博客 1253

【Android TV 开发】焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设备上的兼容问题 | 触摸获取焦点 | 按键获取焦点 )

一、父容器与子组件焦点获取关系处理、 二、不同电视设备上的兼容问题、 三、按键获取焦点、 四、触摸获取焦点、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3874

详细了解android中view的focus焦点处理

一.         通过isFocusable()这个方法我们可以知道view是否具有接受焦点的资格,通过setFocusable().来设置view接受焦点的资格;          对应在触摸模式下,你可以调用isFocusableInTouchMode().来获知是否有焦点来响应点触,也可以通过setFocusableInTouchMode().来设置是否有焦点来响应点触的资格.

super_Mrtang的专栏 6145

View控件获得焦点,TextView获得焦点(focusable),自定义TextView使得其获得焦点,View的onFocusChange()

-- TextView的点击事件如何去除- https://yq.aliyun.com/wenzhang/show_17352 TextView.setEnabled(true); TextView.setEnabled(true); TextView.setClickable(true); TextView.setClickable(true); -- Android View获取焦点...

ShareUs的专栏 7550
上一篇: AN GridView 横向分页,适合TV等有按键需求的android系统
下一篇: widget维护
muximuxi525
博客等级 码龄15年 134粉丝 294原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值