没有 onTouch 的 CollapsingToolbarLayout?

CollapsingToolbarLayout without onTouch?

我正在尝试了解某些​​视图的工作原理。我开始阅读 CollapsingToolbarLayout 的源代码。但我很困惑,里面没有 onTouch 功能,而我们需要触摸屏幕才能 expand/collapse 视图。

那么 CollapsingToolbarLayout 如何可以用我们的手指 collapsed/expanded 但没有覆盖 onTouch 方法?

谁能给我解释一下?

他们使用 OnOffsetChangedListener,这是一个接口定义,用于在 AppBarLayout 的垂直偏移量发生变化时调用回调。

onOffsetChanged 当 AppBarLayout 的布局偏移量改变时调用。这允许子视图基于偏移量实现自定义行为(例如将视图固定在某个 y 值)。

这里是参考OnOffsetChangedListener

这是因为 onTouch 不是与视图交互的唯一方式。

对于CollapsingToolbarLayout,您首先需要了解它被设计为用作AppBarLayout的子级。

AppBarLayout 几乎是一个垂直 LinearLayout,用于实现许多属于 Material 设计的功能,包括滚动功能。换句话说,这个布局就是处理子视图的滚动。

CollapsingToolbarLayout的源码中,查看onAttachedToWindow()方法。在此方法中,您会看到如果此工具栏的父项是 AppBarLayout,那么它会将自定义的 OffsetUpdateListener 设置到其父项的 addOnOffsetChangedListener() 方法中。进一步查看源代码以查看其 OffsetUpdateListener.

的定义

它所做的是 CollapsingToolbarLayout 告诉它的父级 (AppBarLayout) 告诉它自己是否对滚动的 'offset' 有任何更改。

因此 CollapsingToolbarLayout 不需要 'OnTouch' 覆盖,因为它不处理触摸或滚动。它只是允许它的父级处理滚动,而它只是告诉父级让它知道什么时候应该做出反应,换句话说......什么时候应该折叠或展开。

基本上,CollapsingToolbarLayout 不是 View,而是 ViewGroup。它继承自 FrameLayout 并作为 AppBarLayout 的容器,当某些视图需要 collapsed/expanded 基于 应用栏的滚动时行为.

因此,它是 Toolbar 的包装器,可实现折叠应用栏。它旨在用作 AppBarLayout.

的直接 child

现在回答您的问题:

"那么 CollapsingToolbarLayout 如何可以用我们的手指 collapsed/expanded 但没有 onTouch 方法被覆盖?"

答案很简单,事实并非如此。 AppBarLayout 本身拦截基于 OffsetChange 侦听器 的触摸事件,并将回调传递给它的后代。 CollapsingToolbarLayout 能够为工具栏标题 (collapse/expand) 和其他一些东西设置动画,例如 scriming 背景、固定标题等。所以,基本上它响应 AppBarLayoutOffsetChange 侦听器 收到回调时。

查看 official reference 了解更多详情。