Android horizontal scrollview zachowuje się jak iPhone (stronicowanie)
Mam LinearLayout wewnątrz poziomego widoku. Treść jest tylko obrazem. Podczas przewijania muszę osiągnąć to samo zachowanie, co podczas ustawiania opcji stronicowania na iPhone ' owym odpowiedniku HSW(przewijanie listy powinno zatrzymać się na każdej stronie na liście, a nie kontynuować poruszanie się).
Jak to się robi w Androidzie? Czy powinienem zaimplementować te funkcje samodzielnie lub istnieje konkretna właściwość do Ustawienia lub podklasa HSV do zaimplementowania?
4 answers
Natknąłem się tutaj na fajne rozwiązanie:
To jest wyczyszczona wersja kodu z Githuba znaleziona tutaj:
To może wydawać się przesadą za używanie go na zdjęciach, Ale To rozwiązanie pozwala na nieskończone stronicowanie za pomocą małej sztuczki (np. kiedy na pierwszej stronie można przewijać wstecz do ostatniej strony, a kiedy na ostatniej stronie można przewijać do przodu do pierwszej strony). Pozwala również na posiadanie nieznanej liczby stron i dynamicznie generować zawartość za pomocą innej sztuczki. Proszę zobaczyć mój komentarz w drugim linku tutaj
O szczegóły jak to osiągnąłem.
Mam nadzieję, że to pomoże.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-18 20:06:31
Więc moje rozwiązanie to:
- Przechwyć Zdarzenie onTouch i Oblicz, czy strona powinna zmienić się na następną lub pozostać na bieżącej
- Dziedzicz z HorizontalScrollView i nadpisuj metodę computeScroll
Metoda computeScroll the called to move the list. Domyślnie jest to zaimplementowane w celu spowolnienia z pewnym współczynnikiem... Ponieważ nie chcę tego wniosku, obejdę go bez określenia ciała.
Kod dla obsługi zdarzenia jest:
_scrollView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP)
{
float currentPosition = _scrollView.getScrollX();
float pagesCount = _horizontalBar.getChildCount();
float pageLengthInPx = _horizontalBar.getMeasuredWidth()/pagesCount;
float currentPage = currentPosition/pageLengthInPx;
Boolean isBehindHalfScreen = currentPage-(int)currentPage > 0.5;
float edgePosition = 0;
if(isBehindHalfScreen)
{
edgePosition = (int)(currentPage+1)*pageLengthInPx;
}
else
{
edgePosition = (int)currentPage*pageLengthInPx;
}
_scrollView.scrollTo((int)edgePosition, 0);
}
return false;
}
});
I w moim dziedzicznym HorizontalScrollView
@Override
public void computeScroll (){
return;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-06 22:07:33
Nowy pakiet zgodności (wersja 3) w Androidzie dodał ViewPager, który to robi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 05:35:59
Znalazłem inny sposób na uzyskanie tego samego efektu i myślę, że jest bardziej czytelny. Oto sposób:
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP)
{
float currentPosition = hsv.getScrollX();
float pagesCount = hsv.getChildCount();
float pageLengthInPx = hsv.getMeasuredWidth()/pagesCount;
int page = (int) (Math.floor((currentPosition - pageLengthInPx / 2) / pageLengthInPx) + 1);
hsv.scrollTo((int) (page * pageLengthInPx), 0);
}
return false;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-14 21:21:22