Android 折叠工具栏布局是否可以定义何时折叠?
我有一个正在工作的折叠工具栏布局。我看到的唯一问题是,当向下滚动时,展开时显示的内容消失得太快,我想知道是否有可能定义内容消失和应用程序栏出现的位置。似乎在折叠了约25%后,它已经隐藏了内容,并且只显示appbar的颜色。在Google Play应用程序中,你可以看到这种情况发生得非常晚,几乎完全崩溃。创建一个类,实现AppBarLayout.OnOffsetChangedListener并覆盖onOffsetChanged方法Android 折叠工具栏布局是否可以定义何时折叠?,android,android-collapsingtoolbarlayout,Android,Android Collapsingtoolbarlayout,我有一个正在工作的折叠工具栏布局。我看到的唯一问题是,当向下滚动时,展开时显示的内容消失得太快,我想知道是否有可能定义内容消失和应用程序栏出现的位置。似乎在折叠了约25%后,它已经隐藏了内容,并且只显示appbar的颜色。在Google Play应用程序中,你可以看到这种情况发生得非常晚,几乎完全崩溃。创建一个类,实现AppBarLayout.OnOffsetChangedListener并覆盖onOffsetChanged方法 <android.support.design.widget
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="RtlHardcoded"
>
<android.support.design.widget.AppBarLayout
android:id="@+id/main.appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
>
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/main.collapsing"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
>
<ImageView
android:id="@+id/main.imageview.placeholder"
android:layout_width="match_parent"
android:layout_height="300dp"
android:scaleType="centerCrop"
android:src="@drawable/quila2"
android:tint="#11000000"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.9"
/>
<FrameLayout
android:id="@+id/main.framelayout.title"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="bottom|center_horizontal"
android:background="@color/primary"
android:orientation="vertical"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.3"
>
<LinearLayout
android:id="@+id/main.linearlayout.title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="bottom|center"
android:text="@string/quila_name"
android:textColor="@android:color/white"
android:textSize="30sp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="4dp"
android:text="@string/quila_tagline"
android:textColor="@android:color/white"
/>
</LinearLayout>
</FrameLayout>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.Toolbar
android:id="@+id/main.toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/primary"
app:layout_anchor="@id/main.framelayout.title"
app:theme="@style/ThemeOverlay.AppCompat.Dark"
app:title=""
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal"
>
<Space
android:layout_width="@dimen/image_final_width"
android:layout_height="@dimen/image_final_width"
/>
<TextView
android:id="@+id/main.textview.title"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="8dp"
android:gravity="center_vertical"
android:text="@string/quila_name2"
android:textColor="@android:color/white"
android:textSize="20sp"
/>
</LinearLayout>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.CoordinatorLayout>
我会给你们举一个例子,说明我是如何达到你们所需要的 因为您希望内容在60%之后开始去共享,所以首先声明一个如下的变量
private static final int PERCENTAGE_TO_SHOW_ELEMENT = 60;
然后,您必须声明一个变量来知道您的元素是否已经隐藏,并声明一个变量来跟踪滚动百分比
private int mMaxScrollSize;
private boolean mIsElementHidden;
之后,您必须向appBarLayout添加名为addOnOffsetChangedListener的侦听器,如下所示,并重写onOffsetChanged方法:
yourAppBar.addOnOffsetChangedListener(this);
在onOffsetChanged方法中,使用以下代码:
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
if (mMaxScrollSize == 0)
mMaxScrollSize = appBarLayout.getTotalScrollRange();
int currentScrollPercentage = (Math.abs(verticalOffset)) * 100
/ mMaxScrollSize;
if (currentScrollPercentage >= PERCENTAGE_TO_SHOW_ELEMENT) {
if (!mIsElementHidden) {
mIsElementHidden= true;
ViewCompat.animate(yourView).scaleY(0).scaleX(0).start();
ViewCompat.animate(anotherView).scaleY(0).scaleX(0).start();
}
}
if (currentScrollPercentage < PERCENTAGE_TO_SHOW_ELEMENT) {
if (mIsElementHidden) {
mIsElementHidden= false;
ViewCompat.animate(yourView).scaleY(1).scaleX(1).start();
ViewCompat.animate(anotherView).scaleY(1).scaleX(1).start();
}
}
} else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
//You can change something if your layout is different in LANDSCAPE
}
}
@覆盖
公共无效onOffsetChanged(AppBarLayout AppBarLayout,int verticalOffset){
if(getResources().getConfiguration().orientation==Configuration.orientation\u纵向){
如果(mMaxScrollSize==0)
mMaxScrollSize=appBarLayout.getTotalScrollRange();
int currentScrollPercentage=(Math.abs(垂直偏移))*100
/MMAXcrollSize;
如果(currentScrollPercentage>=百分比到显示元素){
如果(!mIsElementHidden){
mIsElementHidden=true;
ViewCompat.animate(yourView.scaleY(0.scaleX(0.start));
ViewCompat.animate(另一个视图).scaleY(0.scaleX(0.start));
}
}
if(当前滚动百分比<百分比到显示元素){
如果(mIsElementHidden){
mIsElementHidden=false;
animate(yourView.scaleY(1.scaleX(1.start));
动画(另一个视图).scaleY(1.scaleX(1.start();
}
}
}else if(getResources().getConfiguration().orientation==Configuration.orientation\u横向){
//如果您的布局在景观中不同,您可以更改某些内容
}
}
您可以使用变量PERCENTAGE TO SHOW元素来决定何时显示或取消视图。我找到了解决方案。您不必强制使用java代码,您可以使用style属性scrimVisibleHeightTrigger来定义它,但请记住,使用的值应该大于actionbar的大小,遗憾的是使用?acionBarSize不起作用,因此您必须考虑appbar的高度,并向其添加一些DPs
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
style="@style/Widget.MyCustomWidget.CollapsingHeader"
<style name="Widget.MyCustomWidget.CollapsingHeader" parent="@style/Widget.Design.CollapsingToolbar">
<item name="scrimAnimationDuration">200</item>
<item name="scrimVisibleHeightTrigger">1dp</item>
</style>
谢谢,我已经在用这个监听器设置标题了。什么是yourView和anotherView?此解决方案不会覆盖我正在显示的图像的隐藏,这是如何工作的?yourView和anotherView是在滚动发生时要隐藏或显示的视图,并与所需的%匹配。我使用此代码隐藏和显示图像,正在运行,并在已发布的应用程序中进行了测试。谢谢,但很抱歉,此解决方案似乎不起作用。此外,布局没有与代码结合,它缺少一些东西。是的,我没有在你去之前发送完整布局,附加完整布局,试试这个
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
style="@style/Widget.MyCustomWidget.CollapsingHeader"
<style name="Widget.MyCustomWidget.CollapsingHeader" parent="@style/Widget.Design.CollapsingToolbar">
<item name="scrimAnimationDuration">200</item>
<item name="scrimVisibleHeightTrigger">1dp</item>
</style>