Je veux recréer le comportement de feuille de fond fournie dans l'application Google Maps:
Link to expected behavior.
J'ai essayé d'utiliser BottomSheetBehavior et deux autres libs 3ème partie comme umano AndroidSlidingUpPanel mais le problème que j'ai été incapable d'éviter est qu'ils sont tous en train d'aligner la feuille de fond entre les états (effondré et étendu). Je voudrais avoir une feuille de fond qui peut être étendue sans à-coup en glissant vers le haut, sans qu'elle s'accroche à l'état le plus proche mais reste là où l'utilisateur s'est arrêté avec le glissement.feuille de fond Android expansion lisse, comme Google Maps
Répondre
Vous pouvez y parvenir en sous-classement BottomSheetBehavior
, et dominante onTouchEvent
revenir tôt ACTION_UP
et 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);
}
}
Cela empêche la classe BottomSheetBehavior
de la manipulation de ces événements et de déclencher l'appel « développer » ou « effondrement ».
Pour appliquer votre CustomBottomSheetBehavior
en xml: app:layout_behavior="com.yourpackage.CustomBottomSheetBehavior"
Pour restaurer la fonctionnalité par défaut au BottomSheetBehavior
lorsque la feuille est entièrement développé ou réduit, vous pouvez ajouter un drapeau qui est fixé lorsque le curseur de décalage atteint un certaine valeur. Dans l'exemple suivant, les événements de feuille inférieure ACTION_UP
et ACTION_CANCEL
ne sont ignorés que lorsque le décalage de la diapositive est compris entre 0,1 et 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);
}
}
Bonjour, merci pour votre réponse. Malheureusement, je ne peux pas faire défiler la liste que je tire. –
@SteffenVangsgaard s'il vous plaît voir la mise à jour de la réponse. –
Avez-vous trouvé une solution pour cela? Je suis également intéressé. Merci – dor506
@ dor506 nope: | J'y jouerai un peu plus quand je trouverai du temps libre: D – superhrvoje
Avez-vous trouvé une solution? –