もう少し実験/研究の後で、私はこのポストから気づいた How to make custom CoordinatorLayout.Behavior with parallax scrolling effect for google MapView?私の問題の大きな部分は視差効果を理解していないということです。
public class CollapseBehavior<V extends ViewGroup> extends CoordinatorLayout.Behavior<V>{
public CollapseBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, V child, View dependency) {
if (isBottomSheet(dependency)) {
BottomSheetBehavior behavior = ((BottomSheetBehavior) ((CoordinatorLayout.LayoutParams) dependency.getLayoutParams()).getBehavior());
int peekHeight = behavior.getPeekHeight();
// The default peek height is -1, which
// gets resolved to a 16:9 ratio with the parent
final int actualPeek = peekHeight >= 0 ? peekHeight : (int) (((parent.getHeight() * 1.0)/(16.0)) * 9.0);
if (dependency.getTop() >= actualPeek) {
// Only perform translations when the
// view is between "hidden" and "collapsed" states
final int dy = dependency.getTop() - parent.getHeight();
ViewCompat.setTranslationY(child, dy/2);
return true;
}
}
return false;
}
private static boolean isBottomSheet(@NonNull View view) {
final ViewGroup.LayoutParams lp = view.getLayoutParams();
if (lp instanceof CoordinatorLayout.LayoutParams) {
return ((CoordinatorLayout.LayoutParams) lp)
.getBehavior() instanceof BottomSheetBehavior;
}
return false;
}
}
はその後、私のレイアウトXMLで、私は私のメインビューの
app:layout_behavior
を設定します。私は気づいたらボトムシートが拡大したときに、私のメインビューに視差を適用するカスタム動作を作成するのは簡単でした
com.mypackage.CollapseBehavior
と
app:layout_anchor
を私のボトムシートビューにすると、
onDependentViewChanged
コールバックが発生します。この効果は、ビューのサイズを変更しようとするよりもはるかに滑らかでした。私は
BottomSheetBehavior.BottomSheetCallback
を使用する私の最初の戦略に戻っても、このソリューションと同様に動作すると思われます。
編集:リクエストごとに、関連するXMLは以下のとおりです。実行時にMapFragment
を@+id/map_container
に追加しますが、これは静的イメージのようにそのコンテナにドロップするものでも機能します。 LocationListFragment
も同様に、それがまだBottomSheetBehavior
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fragment_coordinator">
<FrameLayout
android:id="@+id/map_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
app:layout_anchor="@+id/list_container"
app:layout_behavior="com.mypackage.behavior.CollapseBehavior"/>
<fragment
android:name="com.mypackage.fragment.LocationListFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/list_container"
app:layout_behavior="android.support.design.widget.BottomSheetBehavior"/>
</android.support.design.widget.CoordinatorLayout>
いくつかの[ライブラリ](https://github.com/wasabeef/awesome-android-ui)。 –