Android comportam scrollview horizontal como iPhone ( paginação )

? Davide Vosti @ | Original: StackOverFlow

Eu tenho um LinearLayout dentro de um HorizontalScrollView . O conteúdo é apenas uma imagem . Durante a rolagem, eu preciso para conseguir o mesmo comportamento que você obtém quando definir a opção de paginação em um iPhone equivalente do HSW (rolagem da lista deve parar em todas as páginas na lista, não continuar em movimento) .

Como isso é feito no Android? Devo implementar esta caracteriza por mim ou não é uma propriedade particular, para definir ou uma subclasse de HSV de implementar?

Top 5 Responder

1Davide Vosti @

Portanto, a minha solução é:

Intercept the onTouch event and calculate whether the page should change to the next or keep on the current Inherit from HorizontalScrollView and override the method computeScroll

O método computeScroll o chamado para mover a lista . Por padrão Suponho que seja implementada a desacelerar com uma certa razão ... Desde que eu não quero que esse movimento, eu apenas substituí-lo sem specifing um corpo.

O código para o manipulador de eventos é:

_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;
        }
    });

E na minha HorizontalScrollView herdada

@Override
    public void  computeScroll  (){
        return;
    }
2aveyD @

Me deparei com uma solução agradável aqui:

[ Pager Horizontal ] [1]

esta é uma versão GitHub do código encontrado aqui limpos :

[Real View Switcher ] [2]

Pode parecer um exagero para apenas usá-lo em imagens, mas esta solução permite uma infinita paginação com o uso de um pequeno truque (ou seja : quando na primeira página você pode rolar voltar à página anterior e quando na última página você pode rolar para a frente a primeira página ) . Ele também permite que você tenha um número desconhecido de páginas e dinamicamente gerar conteúdo usando outro pequeno truque . Por favor, veja o meu comentário no segundo link http://marcreichelt.blogspot.com/2010/09/android-use-realviewswitcher-to-switch.html?showComment=1300309034192#c6685928714729240104

para obter detalhes sobre como eu conseguido isso .

Espero que isto ajude.

[ 1 ] : https://github.com/ysamlan/horizontalpager

[ 2 ] : http://marcreichelt.blogspot.com/2010/09/android-use-realviewswitcher-to-switch.html

3Patrick Boos @

O novo pacote de compatibilidade (revisão 3) no Android adicionou um ViewPager que faz isso.

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

4David Hernandez @

eu encontrei outra maneira de obter o mesmo efeito e eu acho que é mais legível. Aqui é o caminho:

@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;
        }