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

     focus 是使用物理按键的情况描述,例如使用向下键选中一个view,这个view就是focused

* Button 获取焦点:
button.setFocusable(true);
button.setFocusableInTouchMode(true);
button.requestFocus();

二、 Android Focus 相关源码分析 
焦点改变最终都会调用View.requestFocus()以下是对其源码简单分析

1. 以下情况都不符合focus情况
focusable  - false
visibility - false
Touch      - false 
向上循环所有的ViewGroup  - 是否阻拦

2. 处理focus请求
2.1 在当前view下执行mParent下面方法
View    - mParent .requestChildFocus (this, this);
ViewGroup  -      mParent.requestChildFocus( viewGroup, currentView);
     向上一级级遍历,所有视图unFocus(清理上一个获取foucs的view执行unFocus)到mParent为空时结束
     unFocus() 中调用onFocusChanged

2.2 调用onFocusChanged回调方法

2.3 refreshDrawableState 进行绘制工作,以后再具体分析


     
三、焦点相关方法:
setFocusable(boolean)
     setFlags()
findFocus
forceLayout
focusSearch
     ViewParent.focusSearch
hasFocus
hasFocusable
addFocusables

//想设置ViewGroup里各View的焦点顺序特性,可用
//layout.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);根据参数有不同特性

ViewGroup.focusableViewAvailable

onFocusChanged()  判断状态
配置文件中:android:focusable="false"
setFocusableInTouchMode()
requestFocusFromTouch()



四、 疑问
1. View.mParent变量应该记录的是当前view的父节点? 什么时候,怎样初始化的?
2. hasAncestorThatBlocksDescendantFocus
     vgAncestor.getDescendantFocusability() == ViewGroup.FOCUS_BLOCK_DESCENDANTS
此方法中的这个开关,在什么地方设置的?
3. handleFocusGainInternal
          ( mPrivateFlags & FOCUSED ) == 0
判断的含义?
4. focus全局应该只有一个吧,清理一个不就行了,为什么还依次向上遍历?
5. view的fouces状态记录在什么地方,如何知道当前有哪一个是focus的???
6. ViewGroup即使设置focus监听也不会执行,除非调用requestFoucs,执行ViewGroup.requestFocus
7.  焦点切换



资料:

自己控制焦点的移动



通过配置文件,自己控制前后左右下一个焦点view是哪个 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值