使用 CoordinatorLayout 和 AppBarLayout 查看动画变得疯狂(有时)

View animated using CoordinatorLayout and AppBarLayout getting crazy (sometimes)

这件事让我抓狂。

我已经能够得到这种行为(正是我想要的):http://i.imgur.com/PGhL22k.gif

这是我快速向下滚动时的行为:http://i.imgur.com/kk7icAc.gif and 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>

而滚动行为如下:

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的内容是一个动态内容的RecyclerViewRecyclerView 中的所有内容都是从数据库加载的,图像是在运行时加载的。

有人可以告诉我为什么会发生这种奇怪的行为吗?我该如何解决?

提前谢谢你...

编辑 1:

我刚刚发现了奇怪行为的原因! ViewPager 加载当前页面和相邻页面。 RecyclerView 的内容从 Internet 加载,一旦加载,它就会进入 RecyclerView。 ViewPager 首先加载当前页面,然后加载相邻页面。如果我在第二个 RecyclerView 刚刚加载并显示内容时向下滚动当前页面 RecyclerView(工具栏被隐藏),它会重置当前页面 AppBarLayout 行为,因此它会重置我的自定义视图行为......我该如何解决?我想避免不加载相邻的视图..

编辑 2:

好的,当加载 ViewPager 的相邻页面时也会发生 当从 RecyclerView 中的 Internet 图片加载时...这太疯狂了.

所以终于解决了您的问题 - 让您的自定义行为扩展 CoordinatorLayout.Behavior 而不是 ScrollingViewBehavior 并且它将按预期工作。只需将值设置为视图的 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;
    }
}