android面试题目之touch事件传递

相信稍微有点准备,都会知道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事件是怎么传递的,

你可能感兴趣的:(android,面试,职场和发展)