我试图了解某些视图的工作原理。我开始阅读CollapsingToolbarLayout的源代码。但是我很困惑,其中没有onTouch功能,而我们需要触摸屏幕以扩展/折叠视图。
那么如何用手指折叠/扩展CollapsingToolbarLayout却没有覆盖onTouch方法?
有人可以向我解释吗?
答案 0 :(得分:1)
它们使用OnOffsetChangedListener,这是当AppBarLayout的垂直偏移更改时要调用的回调的接口定义。
onOffsetChanged在更改AppBarLayout的布局偏移量时调用。这样,子视图就可以基于偏移量实现自定义行为(例如,将视图固定在某个y值)。
这是参考文献OnOffsetChangedListener
答案 1 :(得分:1)
这是因为onTouch并不是与Views交互的唯一方法。
对于CollapsingToolbarLayout
,您首先需要了解它被设计为AppBarLayout
的子代。
AppBarLayout
几乎是一个垂直的LinearLayout
,用于实现许多属于Material Design的功能,包括滚动功能。换句话说,此布局是处理子视图的滚动的方式。
在CollapsingToolbarLayout
的源中,查看onAttachedToWindow()
方法。在此方法内部,您将看到,如果此工具栏的父级是AppBarLayout
,则它将在其父级的OffsetUpdateListener
方法中设置一个自定义的addOnOffsetChangedListener()
。向下查看源代码,以查看其OffsetUpdateListener
的定义。
这是CollapsingToolbarLayout
的意思,是告诉其父项(AppBarLayout)
告诉自己“滚动”的“偏移”是否有任何变化。
因此CollapsingToolbarLayout
不需要'OnTouch'替代,因为它不处理触摸或滚动。它只是允许它的父级处理滚动,而只是告诉父级何时应该做出反应,换句话说,是什么时候应该折叠或展开。
答案 2 :(得分:1)
基本上,CollapsingToolbarLayout
不是View
,而是ViewGroup
。它基于{strong>应用栏的滚动行为 ,从FrameLayout
继承并用作AppBarLayout
的容器,当某些视图需要折叠/展开时。< / p>
因此,它是Toolbar
的包装器,用于实现折叠的应用程序栏。它被设计用作AppBarLayout
的直接子代。
现在提出您的问题:
“ 那么如何CollapsingToolbarLayout
可以用手指折叠/展开,但是没有覆盖onTouch
的方法呢?”
答案很简单,事实并非如此。 AppBarLayout
本身会根据 OffsetChange侦听器拦截触摸事件,并将回调传递给它的后代。 CollapsingToolbarLayout
可以为工具栏标题(折叠/展开)和其他一些东西(例如,背景模糊,标题固定等)设置动画,因此,基本上,它可以响应AppBarLayout
的 OffsetChange侦听器收到回调时。
查看official reference了解更多详细信息。