Java Android复杂折叠工具栏转换

Java Android复杂折叠工具栏转换,java,android,android-layout,Java,Android,Android Layout,我有一个自定义应用程序栏视图和一个滚动视图(左侧布局),我希望自定义应用程序栏视图折叠到右侧的布局 如您所见,图像的大小应该改变,左侧和底部的填充改变,文本变小,按钮右侧的填充更少 如何使用折叠工具栏实现平滑过渡?一种解决方案是使用MotionLayout并对其进行自定义,使其具有折叠工具栏布局行为。这样的过渡非常顺利。我记得在Google i/O中,他们展示了MotionLayout,其中一个展示柜将其用作折叠工具栏布局 另一种解决方案是检测折叠工具栏布局的折叠和展开状态,并将视图的布局参数

我有一个自定义应用程序栏视图和一个滚动视图(左侧布局),我希望自定义应用程序栏视图折叠到右侧的布局

如您所见,图像的大小应该改变,左侧和底部的填充改变,文本变小,按钮右侧的填充更少


如何使用折叠工具栏实现平滑过渡?

一种解决方案是使用
MotionLayout
并对其进行自定义,使其具有折叠工具栏布局行为。这样的过渡非常顺利。我记得在Google i/O中,他们展示了
MotionLayout
,其中一个展示柜将其用作折叠工具栏布局

另一种解决方案是检测折叠工具栏布局的折叠和展开状态,并将视图的布局参数更改为必要的要求

类似这样的东西(这段代码在kotlin中,你会明白的)

然后在onOffsetChangedListener中更改视图的布局参数

    override fun onOffsetChanged(appBarLayout: AppBarLayout, offset: Int) {

    when (appBarLayout.totalScrollRange) {
        abs(offset) -> {

            // Collapsed



                val params =
                    (binding.titleTextView.layoutParams as ConstraintLayout.LayoutParams)
               // cast to the correct parent layout params, in my case it was ConstraintLayout

                //customize the layout params
               params.height= 100 // its in pixel , you can easily convert dp to pixel



                    binding.titleTextView.layoutParams = params

                    binding.titleTextView.requestLayout()



        }
        else -> {
            // Not Collapsed

          val params =
                    (binding.titleTextView.layoutParams as ConstraintLayout.LayoutParams)
               // cast to the correct parent layout params, in my case it was ConstraitLayout

                //customize the layout params
               params.height= 200 // its in pixel



                    binding.titleTextView.layoutParams = params

                    binding.titleTextView.requestLayout()


            }

    }

}
请注意,在使用折叠工具栏布局时,滚动标志非常重要,可以更改折叠工具栏的行为。这说明了标志是如何工作的。 我是这样说的:

            <com.google.android.material.appbar.CollapsingToolbarLayout
                   ...
                    app:layout_scrollFlags="scroll|exitUntilCollapsed"

                    >

一种解决方案是使用
MotionLayout
并对其进行自定义,使其具有折叠工具栏布局行为。这样的过渡非常顺利。我记得在Google i/O中,他们展示了
MotionLayout
,其中一个展示柜将其用作折叠工具栏布局

另一种解决方案是检测折叠工具栏布局的折叠和展开状态,并将视图的布局参数更改为必要的要求

类似这样的东西(这段代码在kotlin中,你会明白的)

然后在onOffsetChangedListener中更改视图的布局参数

    override fun onOffsetChanged(appBarLayout: AppBarLayout, offset: Int) {

    when (appBarLayout.totalScrollRange) {
        abs(offset) -> {

            // Collapsed



                val params =
                    (binding.titleTextView.layoutParams as ConstraintLayout.LayoutParams)
               // cast to the correct parent layout params, in my case it was ConstraintLayout

                //customize the layout params
               params.height= 100 // its in pixel , you can easily convert dp to pixel



                    binding.titleTextView.layoutParams = params

                    binding.titleTextView.requestLayout()



        }
        else -> {
            // Not Collapsed

          val params =
                    (binding.titleTextView.layoutParams as ConstraintLayout.LayoutParams)
               // cast to the correct parent layout params, in my case it was ConstraitLayout

                //customize the layout params
               params.height= 200 // its in pixel



                    binding.titleTextView.layoutParams = params

                    binding.titleTextView.requestLayout()


            }

    }

}
请注意,在使用折叠工具栏布局时,滚动标志非常重要,可以更改折叠工具栏的行为。这说明了标志是如何工作的。 我是这样说的:

            <com.google.android.material.appbar.CollapsingToolbarLayout
                   ...
                    app:layout_scrollFlags="scroll|exitUntilCollapsed"

                    >

您只需将
MotionLayout
嵌套滚动视图一起使用即可。
然后,您需要在
res/xml
文件夹中创建一个
MotionScene
。 您可以在其中设置转换开始、结束约束集以及触发器类型(onSwipe)


这是一个很好的教程,解释了使用一个
TextView

可以将
MotionLayout
嵌套滚动视图一起使用。
然后,您需要在
res/xml
文件夹中创建一个
MotionScene
。 您可以在其中设置转换开始、结束约束集以及触发器类型(onSwipe)


这是一个很好的教程,解释了使用一个
TextView

时,该解决方案不使用
折叠工具栏布局
?该解决方案不使用
折叠工具栏布局