2010-04-07 6 views
29

J'ai un LinearLayout à l'intérieur d'un HorizontalScrollView. Le contenu est juste une image. Pendant le défilement, je dois obtenir le même comportement que lors de la définition de l'option de pagination sur l'équivalent iPhone de HSW (faire défiler la liste devrait s'arrêter à chaque page de la liste, ne pas continuer à se déplacer).Android scrollview horizontal se comporte comme iPhone (pagination)

Comment cela se fait-il dans Android? Dois-je implémenter cette fonctionnalité par moi-même ou y a-t-il une propriété particulière à définir ou une sous-classe de HSV à implémenter?

+1

Vérifiez ce tutoriel, il fonctionne et est très simple pour un échange horizontal: [http://mobile.tutsplus.com/tutorials/android/android-user-interface-design- horizontal-view-paging /] (http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/) – pedrotorres

Répondre

13

Alors, ma solution est:

  1. Intercept l'événement OnTouch et calculer si la page doit passer à la suivante ou continuer à la
  2. actuelle
  3. Hériter de HorizontalScrollView et remplacer la méthode computeScroll

La méthode computeScroll l'appelé pour déplacer la liste. Par défaut je suppose qu'il est implémenté pour décélérer avec un certain ratio ... Puisque je ne veux pas ce mouvement, je l'écrase juste sans spécifier un corps.

Le code pour le gestionnaire d'événements est:

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

Et dans mon hérité HorizontalScrollView

@Override 
    public void computeScroll (){ 
     return; 
    } 
+1

Qu'est-ce que _horizontalBar dans ce code? – nirav

+0

Désolé mais je ne m'en souviens pas.C'est une vieille question désolé :( –

20

je suis tombé sur une belle solution ici:

Horizontal Pager

c'est une version GitHub nettoyée du code trouvé ici:

Real View Switcher

Il peut sembler exagéré pour juste l'utiliser sur les images, mais cette solution permet une pagination infinie avec l'aide d'un petit truc (ex: quand sur la première page, vous pouvez faire défiler à la dernière page et quand sur dernière page, vous pouvez faire défiler vers la première page). Cela vous permet également d'avoir un nombre de pages inconnu et de générer dynamiquement du contenu en utilisant une autre petite astuce. S'il vous plaît voir mon commentaire dans le deuxième lien here

pour les détails sur comment j'ai accompli cela.

Espérons que cela aide.

+0

le problème avec Horizontal Page ou Real View Switcher est que si vous ajoutez un ListView comme un enfant, et le ListView ne dépasse pas la hauteur de l'écran, l'espace entre (la dernière ligne de la ListView à la fin de l'écran) est rempli avec "blanc" ou un arrière-plan transparent toutes les idées autour de ce problème – jake

+0

vraiment une bonne solution, il m'a beaucoup aidé dans mon codage – nirav

+0

ya vraiment aidé – Mahesh

13

Le nouveau package de compatibilité (révision 3) d'Android a ajouté un ViewPager qui le fait.

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

+0

ViewPager docs sont ici: http://developer.android.com/reference/android/support/v4/view/ViewPager.html –

+0

Tutoriel ViewPager ici: http://developer.android.com/training/animation/screen-slide.html –

-1

j'ai trouvé une autre façon d'obtenir le même effet et je pense est plus facile à lire. Voici le chemin:

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

Où hsv est l'objet HorizontalScrollView: P –

+1

Je pense que HorizontalScrollView n'acceptera qu'un seul enfant, ce qui est une sorte de f Groupe de mise en page ... ce groupe est l'endroit où les enfants seront ajoutés, c'est donc à partir de là que le nombre d'entre eux sera récupéré. –

Questions connexes