返回介绍

5. 总结

发布于 2024-12-23 21:38:51 字数 917 浏览 0 评论 0 收藏

一个 View(或其子 View) 一旦不消费某一个 MotionEvent 事件,该 View 便再也捕获不到这个后续的 MotionEvent 序列。这样就使得“视差”这类的交互逻辑无法实现。

试想,如果是我们自身去设计这个“视差”,以 AppbarLayout 的 Behavior 效果为例,常规思路应该是这样的:

  1. 当我们向上滑动视图的时候,MotionEvent 由 CoordinatorLayout 去消费,这个时候 NestedScrollView 内部并没有滑动,只是 CoordinatorLayout 实现了位移。
  2. 当 toolbar 悬停的时候,我们再继续向上拖拽,MotionEvent 由 NestedScrollView 去消费,CoordinatorLayout 不去拦截,视图的滑动是 NestedScrollView 内部的滑动。

这样的常规思路,对我们普通人来说,或许更容易理解。但是在安卓的 Touch 传递机制来看,这却是无解的。至于为何无解的原因,前面已经提及多次。Google 的工程师们在最初设计这一套 Touch 机制的时候,应该是没有问题的。只是随着时间不断往前推移,出现了视差这样更复杂的交互逻辑。

Behavior 的出现,并没有改变 Touch 自身的机制,它只是钻了之前 MotionEvent 的一个空子。通过调用 MotionEvent 的 offsetLocation 方法,巧妙地解决了视差问题。在 layout 文件可视化的那个 design 页签上面,CoordinatorLayout 的第二个子 View 是越过屏幕高度的。单从这个方面,我们也能猜测 AppbarLayout 的 Behavior 的工作机制了:MotionEvent 事件一直由 NestedScrollView 去消费,只是在消费的同时,也通过 Behavior 影响了 CoordinatorLayout 的上下位移量。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。