android面试题目之touch事件传递
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
相信稍微有点准备都会知道touch事件是分层逐渐传递的
activity --> ViewGroup --> View
更详细一点的可以看如下文章
https://blog.csdn.net/weixin_42695485/article/details/109523757
面试多了很多人都会有准备所以我一般会问如下几个问题:
- ViewGroup怎么拦截子View的事件子View的事件如果不希望父ViewGroup拦截怎么做
- View里面的onTouch/onTouchEvent/onClick的响应顺序
- 有了解过全局的按键事件是怎么响应的像home/back/power之类
1.ViewGroup和View事件拦截和不拦截
如果处理过事件冲突相关的问题一定会关注到这个点
对于问题1大部分人都能回答上来但是经常会遇到背题的答案像事件怎么一级一级分发的返回true表示消费了不再传递之类的都没有正面回答我的问题这个其实是一个总结思考的过程
问题1完了后会进行一些扩展性的如2和3考查有没有大概看下框架源代码之类的答案上面的文档都有
2.onTouch/onTouchEvent/onClick的响应顺序
针对问题2其实看下事件分发方法里面的源代码就很清晰了
在View的 dispatchTouchEvent方法里面写的很清楚先判断是否有onTouchListener没有的话再执行onTouchEvent
13418 if (onFilterTouchEventForSecurity(event)) {
13419 if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) {
13420 result = true;
13421 }
13422 //noinspection SimplifiableIfStatement
13423 ListenerInfo li = mListenerInfo;
13424 if (li != null && li.mOnTouchListener != null
13425 && (mViewFlags & ENABLED_MASK) == ENABLED
13426 && li.mOnTouchListener.onTouch(this, event)) {
13427 result = true;
13428 }
13429
13430 if (!result && onTouchEvent(event)) {
13431 result = true;
13432 }
13433 }
在onTouchEvent里面会调用mPerformClick来执行点击事件
14815 // Only perform take click actions if we were in the pressed state
14816 if (!focusTaken) {
14817 // Use a Runnable and post this rather than calling
14818 // performClick directly. This lets other visual state
14819 // of the view update before click actions start.
14820 if (mPerformClick == null) {
14821 mPerformClick = new PerformClick();
14822 }
14823 if (!post(mPerformClick)) {
14824 performClickInternal();
14825 }
14826 }
里面会判断是否有onClickListener
7138 if (li != null && li.mOnClickListener != null) {
7139 playSoundEffect(SoundEffectConstants.CLICK);
7140 li.mOnClickListener.onClick(this);
7141 result = true;
7142 } else {
7143 result = false;
7144 }
所以顺序就是确认了依次是
onTouch --> onTouchEvent --> onClick
http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/core/java/android/view/View.java#13395
如果答对了我一般会追问这个答案是怎么获得的这个其实是考查学习和动手能力从网上的博客可以找到答案随便问一下细节就能知道有没有到底有没有看过
3.home/back键的响应是在哪个地方
在interceptKeyBeforeQueueing方法里面
http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java#interceptKeyBeforeDispatchingInner
其实更进一步如果在大概了解可以更进一步问一下在框架层面touch事件是怎么传递的
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |