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

标签 android animation android-recyclerview android-coordinatorlayout android-appbarlayout

这件事让我抓狂。

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

这是我快速向下滚动时的行为:http://i.imgur.com/kk7icAc.gifhttp://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的内容是一个动态内容的RecyclerViewRecyclerView 中的所有内容都是从数据库加载的,图像是在运行时加载的。

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

提前致谢...

编辑 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/

相关文章:

android - RecyclerView 不应该有太多的项目?

用于 ORMLite 配置生成的 Android Studio 运行配置

android - 无法解析com.github.navasmdc:MaterialDesign:1.5

java - 同时显示两个 fragment

java - 动画期间屏幕闪烁白色

objective-c - 以编程方式显示 UIView

java - 如何从 tmdb json feed 加载电影图像

android 闹钟管理器在几个小时后停止

javascript - 页面加载动画方法

android - layoutmanager.FindFirstCompletelyVisibleItemPosition 总是返回 -1