Lun*_*lpo 6 android google-maps-android-api-2 android-design-library androiddesignsupport android-coordinatorlayout
我尝试为 google 制作视差滚动效果MapView并RecycleView使用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)
如何正确实现视差滚动效果?也许有一个可以使用行为的库?或者我错过了一些东西并且有一个最简单的方法?
我根本不想为此使用工具栏。
更新:
我将向您概述如何做到这一点(我无法发布所有答案,因为我将其发布在另一个问题中,其要求比问题更多,并且我的旧答案被标记为重复......)无论如何这就是你的做法:
对于自定义 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)
这是它的样子:
[
]
项目的链接 我必须澄清,上一个链接有 FAB 和工具栏动画,但如果您只想要底部和图像行为,只需忽略其他 java 文件(澄清是因为我必须“调整到问题”)
| 归档时间: |
|
| 查看次数: |
4752 次 |
| 最近记录: |