2017-07-21 13 views
18

Chcę odtworzyć dno Zachowanie arkusz dostarczany w aplikacji Google Maps:

Link to expected behavior.

Próbowałem, używając BottomSheetBehavior i kilka innych bibliotekami 3rd party jak umano AndroidSlidingUpPanel ale problemem, którego nie mogłem uniknąć jest to, że wszystkie przyciągają dolny arkusz pomiędzy stanami (zwinięte i rozwinięte).
Chciałbym mieć arkusz dolny, który można płynnie rozwinąć przesuwając go w górę, bez przyciągania do najbliższego stanu, ale zamiast tego pozostać tam, gdzie użytkownik zatrzymał się z przesuwaniem.Android prześcieradło gładka rozwija, jak Google Maps

+0

Czy znalazłeś rozwiązanie problemu? Jestem także zainteresowany. Dziękujemy – dor506

+0

@ dor506 nope: | zagra trochę więcej, gdy znajdę trochę wolnego czasu: D – superhrvoje

+0

Czy znalazłeś rozwiązanie? –

Odpowiedz

2

Można to osiągnąć przez instacji BottomSheetBehavior i nadrzędny onTouchEvent wrócić wcześnie ACTION_UP i 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); 
    } 
} 

Zapobiega klasę BottomSheetBehavior z obsługi tych zdarzeń i wyzwalania „rozszerzyć” lub „zapaść” połączenia.

Aby zastosować CustomBottomSheetBehavior w xml: app:layout_behavior="com.yourpackage.CustomBottomSheetBehavior"


Aby przywrócić domyślną funkcjonalność BottomSheetBehavior gdy arkusz jest w pełni rozwinięty lub zwinięty, można dodać flagę, która jest tworzona, gdy suwak korekcji osiąga pewna wartość. W poniższym przykładzie zdarzenia dolnego arkusza ACTION_UP i ACTION_CANCEL są ignorowane tylko wtedy, gdy przesunięcie slajdu wynosi od 0,1 do 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

Witam, dziękuję za odpowiedź. Niestety nie mogę przewinąć listy, którą podciągam. –

+0

@SteffenVangsgaard zobacz zaktualizowaną odpowiedź. –

Powiązane problemy