android面试题目之touch事件传递

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

相信稍微有点准备都会知道touch事件是分层逐渐传递的

activity --> ViewGroup --> View

更详细一点的可以看如下文章
https://blog.csdn.net/weixin_42695485/article/details/109523757

面试多了很多人都会有准备所以我一般会问如下几个问题:

  1. ViewGroup怎么拦截子View的事件子View的事件如果不希望父ViewGroup拦截怎么做
  2. View里面的onTouch/onTouchEvent/onClick的响应顺序
  3. 有了解过全局的按键事件是怎么响应的像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
标签: android