这件事让我抓狂。
我已经能够得到这种行为(正是我想要的):http://i.imgur.com/PGhL22k.gif
这是我快速向下滚动时的行为:http://i.imgur.com/kk7icAc.gif和 http://i.imgur.com/YNPNiA6.gif
抱歉,GIF 大于 2Mb,我无法在此处上传...
我希望底部的分页栏隐藏与工具栏相同的数量。缓慢滚动时效果很好,但快速滚动时会出现非常奇怪的行为,您可以在上面提供的 GIF 中看到。
这是布局 XML:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:kiosk="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<include
layout="@layout/android_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
kiosk:layout_scrollFlags="scroll|enterAlways"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/vpPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
kiosk:layout_behavior="@string/appbar_scrolling_view_behavior"/>
<include
layout="@layout/paginator_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
kiosk:layout_behavior="carl.fri.fer.views.KioskPaginator.KioskPaginatorScrollBehaviour"/>
</android.support.design.widget.CoordinatorLayout>
“android_toolbar”包含如下:
<?xml version="1.0" encoding="utf-8"?>
<carl.fri.fer.views.KioskToolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/primaryColor"
android:minHeight="?attr/actionBarSize"/>
“paginator_layout”如下:
<?xml version="1.0" encoding="utf-8"?>
<carl.fri.fer.views.KioskPaginator.KioskPaginator
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/kpPaginator"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:animateLayoutChanges="true"
android:background="@color/primaryColor"
android:clickable="true"
android:orientation="horizontal">
<TextView
android:id="@+id/tvCurrentPage"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center"
android:padding="10dp"
android:textColor="@color/color_pure_black"
android:textSize="17sp"/>
<LinearLayout
android:id="@+id/llMoreOptions"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1"
android:background="@android:color/transparent"
android:gravity="center_vertical"
android:orientation="horizontal"/>
<TextView
android:id="@+id/tvTotalPages"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center"
android:padding="10dp"
android:textColor="@color/color_pure_black"
android:textSize="17sp"/>
</carl.fri.fer.views.KioskPaginator.KioskPaginator>
ScrollBehavior 如下:
public class KioskPaginatorScrollBehaviour extends AppBarLayout.ScrollingViewBehavior {
public KioskPaginatorScrollBehaviour(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
return dependency instanceof AppBarLayout;
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
float depY = - dependency.getHeight();
depY -= dependency.getY();
Utils.log("dependency", "" + depY);
child.setTranslationY(depY);
return true;
}
}
在 ViewPager 的每个页面中,都有一个 Fragment。而这个Fragment的内容是一个动态内容的RecyclerView。 RecyclerView 中的所有内容都是从数据库加载的,图像是在运行时加载的。
有人可以告诉我为什么会发生这种奇怪的行为吗?我该如何解决?
提前致谢...
编辑 1:
我刚刚发现了奇怪行为的原因! ViewPager 加载当前页面和相邻页面。 RecyclerView 的内容从 Internet 加载,一旦加载,它就会进入 RecyclerView。 ViewPager 首先加载当前页面,然后加载相邻页面。如果我在第二个 RecyclerView 刚刚加载并显示内容时向下滚动当前页面 RecyclerView(工具栏被隐藏),它会重置当前页面 AppBarLayout 行为,因此它会重置我的自定义 View 行为......我该如何解决?我想避免不加载相邻 View ..
编辑 2:
好的,当加载 ViewPager
的相邻页面时会发生这种情况,当从 RecyclerView
中的互联网图像加载时也会...这是疯了。
最佳答案
因此最终解决了您的问题 - 让您的自定义行为扩展 CoordinatorLayout.Behavior
而不是 ScrollingViewBehavior
并且它将按预期工作。只需将值设置为 View 的 translationY,与 AppBarLayout
的 Y 相对:
public class KioskPaginatorScrollBehaviour extends CoordinatorLayout.Behavior<View> {
public KioskPaginatorScrollBehaviour(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
return dependency instanceof AppBarLayout;
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
float depY = -dependency.getY();
child.setTranslationY(depY);
return true;
}
}
关于android - 使用 CoordinatorLayout 和 AppBarLayout 查看动画变得疯狂(有时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42426308/