如何为谷歌 MapView 制作具有视差滚动效果的自定义 CoordinatorLayout.Behavior?

Lun*_*lpo 6 android google-maps-android-api-2 android-design-library androiddesignsupport android-coordinatorlayout

我尝试为 google 制作视差滚动效果MapViewRecycleView使用CoordinatorLayour.

所以基于在网上找到的一些教程,我做了下面的代码。

布局:

<?xml version="1.0" encoding="utf-8"?>
<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:context=".MainActivity">


    <com.google.android.gms.maps.MapView android:id="@+id/map_view"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        app:layout_behavior="net.lunavulpo.coordinatorlayouttest.MapViewBehavior"
        />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_recycler_view"
        android:layout_width="match_parent"
        android:layout_marginTop="200dp"
        android:layout_height="match_parent"/>

</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

我实现了CoordinatorLayout.Behavior

    public class MapViewBehavior extends CoordinatorLayout.Behavior<MapView> {

        public MapViewBehavior(Context context, AttributeSet attrs) {
        }

        @Override
        public boolean layoutDependsOn(CoordinatorLayout parent, MapView child, View dependency) {
            return true;
        }

        @Override
        public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, MapView child, View directTargetChild, View target, int nestedScrollAxes) {
            return true;
        }

        @Override
        public void onNestedScroll(CoordinatorLayout coordinatorLayout, MapView child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {

            //child.setTranslationY(child.getTranslationY() - dyConsumed);
            child.setBottom(child.getBottom() - dyConsumed);
//what should I make here?

        }


    @Override
    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, MapView child, View target, float velocityX, float velocityY, boolean consumed) {
//what should be here?
        return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
    }

    @Override
    public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, MapView child, View target, float velocityX, float velocityY) {

//what should be here?
return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY);
    }
    }
Run Code Online (Sandbox Code Playgroud)

如何正确实现视差滚动效果?也许有一个可以使用行为的库?或者我错过了一些东西并且有一个最简单的方法?

我根本不想为此使用工具栏。

Mig*_*ieC 0

更新:

我将向您概述如何做到这一点(我无法发布所有答案,因为我将其发布在另一个问题中,其要求比问题更多,并且我的旧答案被标记为重复......)无论如何这就是你的做法:

对于自定义 CoordinatorLayout
因为您无法扩展 BottomSheetBehavior,所以您有 2 个选择:尝试执行自己的 Behavior 或像我一样,只需复制粘贴原始 BottomSheetBehavior 中的代码并修改它以获得另一个状态(当谷歌地图打开底部表时停在屏幕中间,这就是我所说的状态)。
这是具有我上面所说的行为的 CustomBottomSheet

现在对于图像视差效果
我尝试了 XML 中的所有默认视差效果,避免了自定义行为,但最终我结束了做一个,这并不难,您需要重写 2 个方法,如下所示:

public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
    return dependency instanceof NestedScrollView;
}

public boolean onDependentViewChanged(CoordinatorLayout parent, View child,
                                      View dependency) {

    if (mYmultiplier == 0) {
        initValues(child, dependency);
        return true;
    }

    float dVerticalScroll = dependency.getY() - mPreviousY;
    mPreviousY = dependency.getY();

    //going up
    if (dVerticalScroll <= 0 && child.getY() <= 0) {
        child.setY(0);
        return true;
    }

    //going down
    if (dVerticalScroll >= 0 && dependency.getY() <= mImageHeight)
        return false;

    child.setY( (int)(child.getY() + (dVerticalScroll * mYmultiplier) ) );

    return true;
}
Run Code Online (Sandbox Code Playgroud)


这里是图像视差行为的链接

这是它的样子:
[自定义BottomSheet行为]

项目的链接 我必须澄清,上一个链接有 FAB 和工具栏动画,但如果您只想要底部和图像行为,只需忽略其他 java 文件(澄清是因为我必须“调整到问题”)