medium - Android Bottom Sheet suave expansión, como Google Maps
bottomsheetdialogfragment example (1)
Puede lograr esto mediante la subclasificación de BottomSheetBehavior
y anulando onTouchEvent
para volver pronto en ACTION_UP
y ACTION_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);
}
}
Esto evita que la clase BottomSheetBehavior
maneje estos eventos y desencadene la llamada ''expandir'' o ''contraer''.
Para aplicar su CustomBottomSheetBehavior
en xml: app:layout_behavior="com.yourpackage.CustomBottomSheetBehavior"
Para restaurar la funcionalidad predeterminada a BottomSheetBehavior
cuando la hoja está totalmente expandida o contraída, puede agregar una marca que se establece cuando el desplazamiento de la diapositiva alcanza un cierto valor. En el siguiente ejemplo, los eventos ACTION_UP
y ACTION_CANCEL
hoja inferior solo se ignoran cuando el desplazamiento de la diapositiva está entre 0.1 y 0.9.
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);
}
}
Quiero recrear el comportamiento de la hoja inferior provisto en la aplicación Google Maps:
Enlace al comportamiento esperado.
He intentado usar BottomSheetBehavior y un par de otras BottomSheetBehavior de terceros como umano AndroidSlidingUpPanel, pero el problema que no pude evitar es que todos están colocando la Hoja de Fondo entre estados (colapsada y expandida).
Me gustaría tener una hoja inferior que se pueda expandir suavemente deslizando hacia arriba, sin que se ajuste al estado más cercano, sino que permanezca donde el usuario se detuvo con el deslizamiento.