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

时间:2013-07-28 20:22:33

标签: android android-layout android-custom-view touch-event

当旋转子视图时,Android如何处理从父视图到子视图的触摸点?

接触点是否在某个时刻进行了转换?如果是这样,在哪里?

我知道ViewGroups有以下方法: dispatchTouchEvent() onInterceptTouchEvent() onTouchEvent()

其中一个负责在父视图中获取触摸点并将其转换为子视图的本地坐标空间吗?

我尝试查看源代码,但无法真正了解所有交互。

1 个答案:

答案 0 :(得分:7)

所有这些都是用dispatchTouchEvent方法执行的。

  1. ViewGroup通过它迭代孩子们
  2. 为每个孩子创建传递给dispatchTouchEvent MotionEvent的新副本(从池中获取更准确)。请参阅MotionEvent.obtain(MotionEvent)
  3. 使用儿童的左上角和左上角偏移新创建的MotionEvent的位置(请参阅getTopgetLeft方法)。
  4. 使用MotionEvent#transform方法应用转换(通过从子级获取逆转换矩阵)
  5. 最后,它将MotionEvent发送给孩子(如果这个孩子也是ViewGroup,请参阅pt.1)
  6. 它回收以前获得的MotionEvent(请参阅MotionEvent#recycle
  7. 是的,正如 Delyan 所提到的 - 转换仅适用于Honeycomb和更新版本的Android。在旧版本中,只执行偏移。