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?

Author: digidigo, 2010-04-07

4 answers

Natknąłem się tutaj na fajne rozwiązanie:

Pager Poziomy

To jest wyczyszczona wersja kodu z Githuba znaleziona tutaj:

Real View Switcher

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.

 20
Author: aveyD,
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:

  1. Przechwyć Zdarzenie onTouch i Oblicz, czy strona powinna zmienić się na następną lub pozostać na bieżącej
  2. 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;
    }
 13
Author: Davide Vosti,
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.

Http://developer.android.com/sdk/compatibility-library.html

 13
Author: Patrick Boos,
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;
        }
 -1
Author: David Hernandez,
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