没有 onTouch 的 CollapsingToolbarLayout?
CollapsingToolbarLayout without onTouch?
我正在尝试了解某些视图的工作原理。我开始阅读 CollapsingToolbarLayout 的源代码。但我很困惑,里面没有 onTouch 功能,而我们需要触摸屏幕才能 expand/collapse 视图。
那么 CollapsingToolbarLayout 如何可以用我们的手指 collapsed/expanded 但没有覆盖 onTouch 方法?
谁能给我解释一下?
他们使用 OnOffsetChangedListener,这是一个接口定义,用于在 AppBarLayout 的垂直偏移量发生变化时调用回调。
onOffsetChanged 当 AppBarLayout 的布局偏移量改变时调用。这允许子视图基于偏移量实现自定义行为(例如将视图固定在某个 y 值)。
这是因为 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 背景、固定标题等。所以,基本上它响应 AppBarLayout
的 OffsetChange 侦听器 收到回调时。
查看 official reference 了解更多详情。
我正在尝试了解某些视图的工作原理。我开始阅读 CollapsingToolbarLayout 的源代码。但我很困惑,里面没有 onTouch 功能,而我们需要触摸屏幕才能 expand/collapse 视图。
那么 CollapsingToolbarLayout 如何可以用我们的手指 collapsed/expanded 但没有覆盖 onTouch 方法?
谁能给我解释一下?
他们使用 OnOffsetChangedListener,这是一个接口定义,用于在 AppBarLayout 的垂直偏移量发生变化时调用回调。
onOffsetChanged 当 AppBarLayout 的布局偏移量改变时调用。这允许子视图基于偏移量实现自定义行为(例如将视图固定在某个 y 值)。
这是因为 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
.
现在回答您的问题:
"那么 CollapsingToolbarLayout
如何可以用我们的手指 collapsed/expanded 但没有 onTouch
方法被覆盖?"
答案很简单,事实并非如此。 AppBarLayout
本身拦截基于 OffsetChange 侦听器 的触摸事件,并将回调传递给它的后代。 CollapsingToolbarLayout
能够为工具栏标题 (collapse/expand) 和其他一些东西设置动画,例如 scriming 背景、固定标题等。所以,基本上它响应 AppBarLayout
的 OffsetChange 侦听器 收到回调时。
查看 official reference 了解更多详情。