android focus查找 方向键如何查找focus

本文详细阐述了在Android界面中,按下方向键时焦点查找的机制。从ViewRoot的事件派发开始,通过遍历View和ViewGroup,结合focusFinder的工作流程,包括收集可聚焦视图、转换坐标系以及定位下一个焦点视图的过程。
摘要由CSDN通过智能技术生成

上一篇文章提到了,新起的activity中的某个view是如何获取焦点的。这篇介绍一下,当在一个界面,按下方向键,焦点是如何查找的。
即第一篇文章中跑出来的问题:2.上下按键,焦点如何查找的,它怎么知道下一个获取焦点的是谁?
先总的说一下原理:新起一个界面的时候,会找到一个获取焦点的view(这个view可能是group或者最小的view),当按下方向键时,会进行遍历,根据方向,遍历这一方向布局中的view位置(所在位置是个矩形框),找到最合适的,然后把焦点设置上去。这里主要描述焦点查找,设置不再多说。

一、viewroot中的事件派发

需要input派发的知识,参考博文:
输入事件,在dispatch的时候,输入法不处理,则要拍发给具体的view了,这个过程在viewroot中。

        private int processKeyEvent(QueuedInputEvent q) {
            final KeyEvent event = (KeyEvent)q.mEvent;

            // Deliver the key to the view hierarchy.
            if (mView.dispatchKeyEvent(event)) {
                return FINISH_HANDLED;//输入法处理了,则直接返回,否则继续
            }
//...
              // Handle automatic focus changes.
            if (event.getAction() == KeyEvent.ACTION_DOWN) {//将键盘事件转换一下,上下左右专程对应的FOCUS_LEFT...
                int direction = 0;
                switch (event.getKeyCode()) {
                    case KeyEvent.KEYCODE_DPAD_LEFT:
                        if (event.hasNoModifiers()) {
                            direction = View.FOCUS_LEFT;
                        }
                        break;
                    case KeyEvent.KEYCODE_DPAD_RIGHT:
                        if (event.hasNoModifiers()) {
                            direction = View.FOCUS_RIGHT;
                        }
                        break;
                    case KeyEvent.KEYCODE_DPAD_UP:
                        if (event.hasNoModifiers()) {
                            direction = View.FOCUS_UP;
                        }
                        break;
                    case KeyEvent.KEYCODE_DPAD_DOWN:
                        if (event.hasNoModifiers()) {
                       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值