Prólogo
No hace mucho, leí un artículo sobre la hoja inferior y , después de consultar con colegas, decidí implementar esto en nuestra aplicación. Después de pasar suficientes horas para enseñar a la hoja inferior cómo viajar en unos pocos pasos (como Google Maps), me di cuenta de su aburrimiento y limitaciones. Se encontraron dos soluciones: envolver todo en una secuencia que monitoreará el estado de la cortina alargada en tiempo real o reescribir algunos métodos de la clase BottomSheetBehavior (afortunadamente, la licencia Apache 2.0 lo permite). Elegí la segunda opción, porque me pareció más viable, y ahora, según mi experiencia, trataré de decirle qué surgió. Espero que esto sea útil para alguien. Bueno, empecemos.
Personalización
Me salteo los pasos de crear un proyecto, agregando la hoja inferior de Google, porque si lees esto, entonces ya has superado todo lo anterior. Tendremos que ir a la clase BottomSheetBehavior y copiar su contenido en la nueva clase CustomBottomSheetBehavior que creamos. Una vez copiado, no olvide cambiar el nombre de todo lo que está marcado en rojo. Además, en el archivo .xml de nuestra BottomSheet, deberíamos cambiar el nombre de esta línea, refiriéndonos a nuestra nueva clase, debería resultar algo como esto:
app:layout_behavior="com.my.custombottomsheetexample.CustomBottomSheetBehavior"
Y entonces, tenemos más de 700 líneas de código Java que da miedo, entonces, ¿qué haces con ellas?
Primero necesitas encontrar el método onViewReleased ():
public void onViewReleased(@NonNull View releasedChild, float xvel, float yvel) { ... }
Necesitamos cambiar solo un par de líneas. Encontramos el primer if {...} y reemplazamos su contenido con este código:
if (yvel < 0.0F) { currentTop = releasedChild.getTop(); if (currentTop > CustomBottomSheetBehavior.this.halfExpandedOffset) { top = CustomBottomSheetBehavior.this.halfExpandedOffset; targetState = 6; } else { top = 0; targetState = 3; } }
Ahora nuestra BottomSheet avanza en 2 etapas, deteniéndose en el medio:
(
)
Cambio de altura
Pero eso no es todo, puede ajustar la altura promedio. Para hacer esto, todos en la misma clase, busque la inicialización de la variable halfExpandedOffset:
this.halfExpandedOffset = this.parentHeight / 2;
Al mirar esta línea, queda claro que podemos ajustar la altura como lo deseamos, incluso en términos porcentuales. Personalmente, preferí cambiar así:
this.halfExpandedOffset = this.parentHeight * 60 / 100;
(
)
Mi BottomSheet extiende el 40% de la altura de la Vista principal. Eso es todo!