大更新
避免重复代码我提供了完整答案的链接,您可以在其中找到有关如何获得 Google 地图等完整行为的所有解释。
我想调整它的最大展开高度。我怎样才能做到这一点?
两者都BottomSheet
使用BottomSheetDialogFragment
您可以在 Support Library 23.x 中找到的 BottomSheetBehavior
该 Java 类有 2 种不同的用途mMinOffset
,其中之一用于定义将用于绘制其内容的父级区域(可能是 a NestedScrollView
)。另一个用途是定义扩展的锚点,我的意思是,如果您向上滑动它以形成STATE_COLLAPSED
动画,它将为您设置动画BottomSheet
,直到他到达该锚点但如果您仍然可以继续向上滑动以覆盖所有父高度(CoordiantorLayout 高度)。
如果你看一下,BottomSheetDialog
你会看到这个方法:
private View wrapInBottomSheet(int layoutResId, View view, ViewGroup.LayoutParams params) {
final CoordinatorLayout coordinator = (CoordinatorLayout) View.inflate(getContext(),
android.support.design.R.layout.design_bottom_sheet_dialog, null);
if (layoutResId != 0 && view == null) {
view = getLayoutInflater().inflate(layoutResId, coordinator, false);
}
FrameLayout bottomSheet = (FrameLayout) coordinator.findViewById(android.support.design.R.id.design_bottom_sheet);
BottomSheetBehavior.from(bottomSheet).setBottomSheetCallback(mBottomSheetCallback);
if (params == null) {
bottomSheet.addView(view);
} else {
bottomSheet.addView(view, params);
}
// We treat the CoordinatorLayout as outside the dialog though it is technically inside
if (shouldWindowCloseOnTouchOutside()) {
final View finalView = view;
coordinator.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (isShowing() &&
MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_UP &&
!coordinator.isPointInChildBounds(finalView,
(int) event.getX(), (int) event.getY())) {
cancel();
return true;
}
return false;
}
});
}
return coordinator;
}
不知道您想要这两种行为中的哪一种,但如果您需要第二种行为,请按照以下步骤操作:
创建一个 Java 类并从CoordinatorLayout.Behavior<V>
将粘贴代码从默认BottomSheetBehavior
文件复制到新文件。
clampViewPositionVertical
使用以下代码修改方法:
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
return constrain(top, mMinOffset, mHideable ? mParentHeight : mMaxOffset);
}
int constrain(int amount, int low, int high) {
return amount < low ? low : (amount > high ? high : amount);
}
添加新状态
public static final int STATE_ANCHOR_POINT = X;
修改下一个方法:onLayoutChild
、、onStopNestedScroll
和BottomSheetBehavior<V> from(V view)
(setState
可选)
这是它的样子
[ ]