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
Odpowiedz
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);
}
}
Witam, dziękuję za odpowiedź. Niestety nie mogę przewinąć listy, którą podciągam. –
@SteffenVangsgaard zobacz zaktualizowaną odpowiedź. –
Czy znalazłeś rozwiązanie problemu? Jestem także zainteresowany. Dziękujemy – dor506
@ dor506 nope: | zagra trochę więcej, gdy znajdę trochę wolnego czasu: D – superhrvoje
Czy znalazłeś rozwiązanie? –