Android如何处理子视图中触摸点的转换?

4
当子视图被旋转时,Android如何处理从父视图到子视图的触摸点映射?
是否在某个时刻对触摸点进行了变换?如果是,那么在哪里进行了变换?
我知道ViewGroup有像dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent()等方法。
其中一个负责将父视图中的触摸点转换为子视图的本地坐标空间吗?
我尝试查看源代码,但无法理解所有的交互。
1个回答

7

所有这些操作均在dispatchTouchEvent方法中执行。

  1. ViewGroup 遍历其子元素。
  2. 为每个子元素创建传递给dispatchTouchEvent方法的MotionEvent的新副本(更精确地说,是从池中获取)。请参见MotionEvent.obtain(MotionEvent)
  3. 使用子元素的顶部和左侧位置(请参见getTopgetLeft方法),对新创建的MotionEvent的位置进行偏移。
  4. 使用MotionEvent#transform方法应用变换(通过从子元素中获取反转换矩阵)。
  5. 最后,将MotionEvent分发给子元素(如果该子元素也是ViewGroup,则参见第1点)。
  6. 将先前获取的MotionEvent回收(请参见MotionEvent#recycle)。

是的,正如Delyan所提到的那样- 变换仅适用于Android Honeycomb及更高版本。在旧版本上只执行偏移。


1
需要注意的是,这只会在Honeycomb及以上版本中发生,因为它需要每个视图的转换。 - Delyan
看起来NineOldAndroids增加了旋转支持 - 有什么想法吗?似乎ViewGroup类必须真正被替换才行。 - Studio4Development

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接