2017-07-21 1 views
18

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

+0

Avez-vous trouvé une solution pour cela? Je suis également intéressé. Merci – dor506

+0

@ dor506 nope: | J'y jouerai un peu plus quand je trouverai du temps libre: D – superhrvoje

+0

Avez-vous trouvé une solution? –

Répondre

2

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); 
    } 
} 
+0

Bonjour, merci pour votre réponse. Malheureusement, je ne peux pas faire défiler la liste que je tire. –

+0

@SteffenVangsgaard s'il vous plaît voir la mise à jour de la réponse. –