Android TV开发焦点移动源码分析

Android TV开发焦点移动源码分析,第1张

点可以理解为选中态,在Android TV上起很重要的作用。一个视图控件只有在获得焦点的状态下,才能响应按键的Click事件。

相对于手机上用手指点击屏幕产生的Click事件, 在TV中通过点击遥控器的方向键来控制焦点的移动。当焦点移动到目标控件上之后,按下遥控器的确定键,才会触发一个Click事件,进而去做下一步的处理

在处理焦点的时候,有一些基础的用法需要知道。

首先,一个控件isFocusable()需要为true才有资格可以获取到焦点。如果想要在触摸模式下获取焦点,需要通过setFocusableInTouchMode(boolean)来设置。也可以直接在xml布局文件中指定:

keyEvent 分发过程:

而当按下遥控器的按键时,会产生一个按键事件,就是KeyEvent,包含“上”,“下”,“左”,“右”,“返回”,“确定”等指令。焦点的处理就在KeyEvent的分发当中完成。

首先,KeyEvent会流转到ViewRootImpl中开始进行处理,具体方法是内部类 ViewPostImeInputStage 中的 processKeyEvent :

接下来先看一下KeyEvent在view框架中的分发:

这里也是可以做焦点控制,最好是在 eventgetAction() == KeyEventACTION_DOWN 进行

因为android 的 ViewRootlmpl 的 processKeyEvent 焦点搜索与请求的地方 进行了判断if (eventgetAction() == KeyEventACTION_DOWN)

• 首先ViewGroup会一层一层往上执行父类的dispatchKeyEvent方法,如果返回true那么父类的dispatchKeyEvent方法就会返回true,也就代表父类消费了该焦点事件,那么焦点事件自然就不会往下进行分发。

• 然后ViewGroup会判断mFocused这个view是否为空,如果为空就会return false,焦点继续往下传递;如果不为空,那就会return mFocused的dispatchKeyEvent方法返回的结果。这个mFocused其实是ViewGroup中当前获取焦点的子View

发现执行了onKeyListener中的onKey方法,如果onKey方法返回true,那么dispatchKeyEvent方法也会返回true

如果想要修改ViewGroup焦点事件的分发

• 重写view的dispatchKeyEvent方法

• 给某个子view设置onKeyListener监听

下面再来看一下如果一个页面第一次进入,系统是如何确定焦点是定位在哪个view上的

由于DecorView继承自FrameLayout,这里调用的是ViewGroup的requestFocus

descendantFocusability:

• FOCUS_AFTER_DESCENDANTS:先分发给Child View进行处理,如果所有的Child View都没有处理,则自己再处理

• FOCUS_BEFORE_DESCENDANTS:ViewGroup先对焦点进行处理,如果没有处理则分发给child View进行处理

• FOCUS_BLOCK_DESCENDANTS:ViewGroup本身进行处理,不管是否处理成功,都不会分发给ChildView进行处理

因为 PhoneWindow 给 DecoreView 初始化时设置 了 setDescendantFocusability(ViewGroupFOCUS_AFTER_DESCENDANTS),所以这里默认是FOCUS_AFTER_DESCENDANTS

到此第一次请求焦点的过程基本告一个段落

焦点移动的时候,默认的情况下,会按照一种算法去找在指定移动方向上最近的邻居。在一些情况下,焦点的移动可能跟开发者的意图不符,这时开发者可以在布局文件中使用下面这些XML属性来指定下一个焦点对象:

在KeyEvent分发中已经知道如果分发过程中event没有被消耗,就会根据方向搜索以及请求焦点View

流程一:查找用户指定的下一个焦点

流程二:获取搜索方向上所有可以获取焦点的view,使用算法查找下一个view

addFocusables() 获取搜索方向上可获得焦点的view

descendantFocusability属性决定了ViewGroup和其子view的聚焦优先级

• FOCUS_BLOCK_DESCENDANTS:viewgroup会覆盖子类控件而直接获得焦点

• FOCUS_BEFORE_DESCENDANTS:viewgroup会覆盖子类控件而直接获得焦点

• FOCUS_AFTER_DESCENDANTS:viewgroup只有当其子类控件不需要获取焦点时才获取焦点

addFocusables 的第一个参数views是由root决定的。在ViewGroup的focusSearch方法中传进来的root是DecorView,也可以主动调用FocusFinder的findNextFocus方法,在指定的ViewGroup中查找焦点。

FocusFinderfindNextFocus 查找焦点

自动对焦原理。简单来说,就是当物体在分别在远景和近景的时候,对应的成像位置是不同的,需要调整镜头和感光芯片的距离,使得感光芯片上始终可以获得清洗的成像效果。对于手机摄像头模组而言,镜头位置不动,主要是靠马达来带动镜头移动实现。马达的主要作用就是带动镜头移动。这里的马达是自动对焦做动器(Auto Focus Actuator)的通常说法。实际上AF的制动器有很多种,比如音圈马达(VCM),压电马达(Piezo)等。VCM又有d片式,滚珠式等差别。这里就以最常见的d片式VCM作为代表,其他种类就不一一说明。

这个就是在你拍照的时候,按下拍照键的时候看到屏幕上有模糊便清楚的动态变化过程的,都是有对焦功能的,而且一般有对焦功能的手机,在拍照的时候聚焦(对焦)过程中会伴随有滴滴的对焦声音,所以也比较好判断的,如果是想在网上看那款手机有没有,那只能查看手机参数介绍,里面一般也有……

以上就是关于Android TV开发焦点移动源码分析全部的内容,包括:Android TV开发焦点移动源码分析、手机摄像头对焦原理是怎样的、如何看出来手机有没有自动对焦呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10151247.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存