安卓底表平滑展开,像谷歌地图一样



我想重新创建谷歌地图应用中提供的底表行为:

链接到预期行为。

我尝试使用BottomSheetBehavior和其他几个第三方库,如umano AndroidSlidingUpPanel,但我无法避免的问题是它们都在状态之间捕捉底部表(折叠和展开(。

我想要一个可以通过向上滑动平滑扩展的底板,而不是捕捉到最接近的状态,而是保留在用户停止滑动的位置。

您可以通过子类化BottomSheetBehavior来实现此目的,并覆盖onTouchEvent以尽早返回ACTION_UPACTION_CANCEL

public class CustomBottomSheetBehavior<V extends View> extends BottomSheetBehavior<V> {
public CustomBottomSheetBehavior() {
super();
}
public CustomBottomSheetBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
return true;
}
return super.onTouchEvent(parent, child, event);
}
}

这可以防止BottomSheetBehavior类处理这些事件并触发"展开"或"折叠"调用。

要在 xml 中应用CustomBottomSheetBehavior,请执行以下操作:app:layout_behavior="com.yourpackage.CustomBottomSheetBehavior"


若要在工作表完全展开或折叠时将默认功能恢复为BottomSheetBehavior,可以添加一个在幻灯片偏移量达到特定值时设置的标志。在下面的示例中,仅当幻灯片偏移量介于 0.1 和 0.9 之间时,才会忽略底部工作表ACTION_UPACTION_CANCEL事件。

public class CustomBottomSheetBehavior<V extends View> extends BottomSheetBehavior<V> {
private boolean isExpandedOrCollapsed;
public CustomBottomSheetBehavior() {
super();
listenForSlideEvents();
}
public CustomBottomSheetBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
listenForSlideEvents();
}
void listenForSlideEvents() {
setBottomSheetCallback(new BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
isExpandedOrCollapsed = slideOffset < 0.1f || slideOffset > 0.9f;
}
});
}
@Override
public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
if (!isExpandedOrCollapsed) {
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
return true;
}
}
return super.onTouchEvent(parent, child, event);
}
}

最新更新