150 votes

ViewPager avec limites de la page précédente et suivante

Je conçois une vue avec plusieurs pages. Je veux que les bords des pages précédentes et suivantes soient affichés comme ci-dessous et mettre en œuvre un glissement de 2 doigts pour passer d'une page à l'autre.

enter image description here

J'ai essayé d'utiliser ViewPager avec une marge de page négative comme suggéré aquí mais cela ne montre qu'un seul des bords à l'écran, pas les deux simultanément.

Sinon, existe-t-il un moyen de positionner une partie de ma vue en dehors de l'écran, puis de l'animer en lui donnant une valeur de ViewPager effet de type.

Comment dois-je m'y prendre ? Merci !

0 votes

"ne montre qu'un seul des bords à l'écran, pas les deux simultanément." Vous êtes à la page 0 et vous ne voyez qu'une partie de la page 1 ? Peut-être devez-vous utiliser un pager circulaire, par exemple, puis régler votre page toujours sur la position "milieu". Voir cet article et le commentaire : stackoverflow.com/a/8304474/1851478

118voto

Thomas R. Points 131

J'ai une solution similaire :

Sur le viewpager, définissez le padding gauche et droit, par exemple 20dp. Définissez également la marge de page sur le viewpager, par exemple la moitié du padding du pager. Et n'oubliez pas de désactiver le clip padding.

tilePager.setPadding(defaultGap, 0, defaultGap, 0);
tilePager.setClipToPadding(false);
tilePager.setPageMargin(halfGap);

3 votes

Bonne solution fournie.

0 votes

Le moyen le plus simple et le plus efficace

0 votes

C'est la réponse bête oui bête pour considérer les valeurs de nommage xd

102voto

CommonsWare Points 402670

En me citant moi-même un article de blog sur ce sujet :

La troisième approche est celle de Dave Smith, co-auteur du livre très apprécié Android Recipes. Il est allé dans une direction très différente, en utilisant un conteneur personnalisé qui désactive le découpage des enfants pour afficher plus d'une page à la fois.

Son exemple de code publié montre le tout en action. Son conteneur ( com.example.pagercontainer.PagerContainer ) enveloppe le ViewPager et appelle setClipChildren(false); sur lui-même, donc même si le ViewPager se concentre sur une page sélectionnée, d'autres pages dont les coordonnées dépassent l'adresse de la page. ViewPager sont toujours visibles, pour autant qu'elles s'inscrivent dans les limites de l'espace de travail. PagerContainer . En dimensionnant le ViewPager pour être plus petit que le PagerContainer le ViewPager peut dimensionner ses pages à cette taille, en laissant de la place pour que d'autres pages soient visibles. PagerContainer doit cependant donner un coup de main pour les événements tactiles. ViewPager ne traitera les événements de glissement que dans ses propres limites visibles, en ignorant les pages visibles sur les côtés.

enter image description here

1 votes

En utilisant ceci, je suis capable de montrer une partie de la page précédente et suivante comme indiqué dans l'image ci-dessus, mais maintenant je ne veux pas montrer des bords nets sur les images, je veux qu'elles soient floues vers les bords, s'il vous plaît guidez-moi sur la façon dont je peux utiliser z-index pour réaliser la même chose

2 votes

@Shruti - Il suffit d'ajouter une image superposée avec l'effet que vous voulez.

0 votes

J'ai essayé cet exemple, il fonctionne parfaitement dans l'émulateur, mais pas dans l'appareil réel de Samsung. il chevauche les images.

76voto

SergeyA Points 291
  1. Définit le rembourrage gauche et droit pour la vue entière de l'élément. Exemple xml (page_item.xml) :

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingLeft="20dp"
    android:paddingRight="20dp"/>
    
    <TextView
        android:id="@+id/text1"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />
    
    </LinearLayout>
  2. Ensuite, définissez une marge de page négative pour PageView égal à 2*(rembourrage de la vue précédente)

    int margin = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20*2,     getResources().getDisplayMetrics());
    mViewPager.setPageMargin(-margin);
  3. Facultatif. Définissez un remplissage gauche nul pour le premier élément et un remplissage droit nul pour le dernier élément afin de masquer les bords vides. Vous pouvez faire cela dans la section PageAdapter o Page classe de fragment.

0 votes

@Sergey, je n'arrive pas à faire fonctionner cette solution avec votre solution, pouvez-vous poster un exemple ? thx

12 votes

J'ajoute juste une remarque : avec cette solution, lorsque vous glissez de la page 1 à la page 2, la page 3 n'est pas en mémoire, elle apparaît donc avec un certain retard. pour corriger cela, il suffit d'ajouter - yourViewPager.setOffscreenPageLimit(2) ;

0 votes

Je fais la même chose mais cela désactive l'effet de défilement pour le dernier élément. Une piste à suivre ?

49voto

molu2008 Points 93

Pour afficher un aperçu des pages de gauche et de droite, définissez les deux valeurs suivantes

viewpager.setClipToPadding(false)
viewpager.setPadding(left,0,right,0)

Si vous avez besoin d'un espace entre deux pages dans le viewpager, ajoutez viewpager.setPageMargin(int).

Android ViewPager - Afficher l'aperçu de la page à gauche et à droite

3 votes

Cela devrait être la bonne réponse. Je pense que cela ne fonctionnait pas dans les versions précédentes de viewpager mais cela fonctionne maintenant.

0 votes

Il ajoute la même marge sur le côté gauche de la première page et sur le côté droit de la dernière page également. Une solution ?

2 votes

Réponse courte et plus claire.

10voto

44kksharma Points 956

Si quelqu'un cherche encore une solution, j'ai personnalisé le ViewPage pour y parvenir sans utiliser de marge négative, vous trouverez un exemple de projet ici. https://github.com/44kksharma/Android-ViewPager-Carousel-UI cela devrait fonctionner dans la plupart des cas mais vous pouvez toujours définir la marge de page avec mPager.setPageMargin(margin in pixel);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X