2012-01-12 17 views
40

Esiste la possibilità di visualizzare due pagine contemporaneamente, quando si utilizza uno ViewPager? Non sto cercando un effetto bordo, ma piuttosto per due pagine complete allo allo stesso tempo.Più pagine contemporaneamente su un ViewPager

Grazie in anticipo.

+0

io non sono abbastanza sicuro di quello che sei asking..can voi spiegare un po 'di più? – Cody

+0

Voglio che il ViewPager visualizzi due pagine affiancate, proprio come un libro. –

+0

potresti usare due frammenti per ottenere un effetto di pagine affiancate? è solo un'idea ... non incolpare me ..... – NIPHIN

risposta

-2

Non penso sia possibile con i limiti di un View Pager. Permette solo a un utente di visualizzare le pagine 1 alla volta. Potresti essere in grado di risolvere qualcosa con l'uso di frammenti e disporre di 2 frammenti ViewPager uno accanto all'altro e utilizzare i pulsanti per elaborare il plipping della pagina che desideri implementare, ma il codice potrebbe diventare molto complesso.

Puoi provare qualcosa come un ViewFlipper - dove puoi fare molte più personalizzazioni (incluse le animazioni).

Spero che questo aiuti.

64

Si prega di dare un'occhiata al metodo getPageWidth nel corrispondente PagerAdapter. Esegui l'override e torna ad es. 0.8f per fare in modo che tutte le pagine figlio occupino solo l'80% della larghezza di ViewPager.

Maggiori informazioni: http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#getPageWidth(int)

+0

il problema con quella tecnica, è che appare un margine in più in basso, aggiungendo uno strano spazio bianco sotto il Viewpager – elgui

+0

Penso, questa è la migliore risposta! –

+0

Questo aggiunge un po 'di sfarfallio sulla visualizzazione del pager, posso ancora scorrere e posso vedere le viste fare uno strano sfarfallio. – pyus13

5

Vedi that blog entry.
La tecnica PagerContainer è stata risolta il mio problema.

EDIT:
ho trovato stessa risposta.
How to migrate from Gallery to HorizontalScrollView & ViewPager?

+1

Benvenuti in StackOverflow! Vorresti aggiungere un estratto di quel post del blog alla tua risposta, in modo che sia ancora utile se il link muore? –

+0

@ S.L.Barth Grazie per il vostro consiglio. Ho modificato la mia risposta. – kaw

2

È possibile risolvere questo problema utilizzando getPageWidth nella classe PagerAdapter.

essere sicuri se il vostro JAR è up-to-date .Dal precedenza ViewPager non sosteneva più pagine contemporaneamente.

flottante pubblico getPageWidth() {

ritorno 0.4f; (potete sceglierli .Per schermo intero per pagina si dovrebbe dare 1f) }

30

Vedere il mio più up-to-date risposta qui: Can ViewPager have multiple views in per page?

Ho scoperto che una soluzione forse ancora più semplice attraverso la specifica di un margine negativo per il ViewPager. Ho creato il progetto MultiViewPager su GitHub, che si consiglia di dare un'occhiata a:

https://github.com/Pixplicity/MultiViewPager

Anche se questa domanda chiede specificamente per una soluzione senza effetto bordo, alcune risposte qui propongono la soluzione temporanea di CommonsWare, ad esempio il suggerimento di kaw.

Ci sono vari problemi con la gestione del tocco e l'accelerazione hardware con quella particolare soluzione.Una soluzione più semplice e più elegante, a mio parere, è quello di indicare un margine negativo per la ViewPager:

ViewPager.setPageMargin(
    getResources().getDimensionPixelOffset(R.dimen.viewpager_margin)); 

Ho poi specificato questa dimensione nel mio dimens.xml:

<dimen name="viewpager_margin">-64dp</dimen> 

Per compensare sovrapposizione pagine, visualizzare il contenuto di ogni pagina ha il margine opposto:

android:layout_marginLeft="@dimen/viewpager_margin_fix" 
android:layout_marginRight="@dimen/viewpager_margin_fix" 

Sempre nel dimens.xml:

<dimen name="viewpager_margin_fix">32dp</dimen> 

(Si noti che la dimensione viewpager_margin_fix è metà di quella del viewpager_margin dimensione assoluta.)

abbiamo implementato questa in the Dutch newspaper app De Telegraaf Krant:

Phone example in De Telegraaf KrantTablet example

+0

Ho amato la tua soluzione. Semplice ed elegante ...! Grazie uomo. Stavo cercando di ottenere ciò usando 'PageTransformer'. –

+2

ha funzionato per me.È inoltre necessario aggiungere setOffScreenPageLimit (2) per migliorare la memorizzazione nella cache su 2 per evitare di ritardare la seconda vista successiva. – Giorgio

+0

Nella nota precedente: è ViewPager.setOffscreenPageLimit (2) nel caso in cui qualcuno venga espulso. – fooser

11

Devi eseguire l'override del metodo getPageWidth() sulla Adattatore viewpager. Per esempio:

@Override 
public float getPageWidth(int position) { 
    return 0.9f; 
} 

Prova questo codice nell'adattatore e quindi capirai.

+2

Questo sembra molto simile alla risposta di @ Markus-Wörz? – bummi

1

creare il file di layout: my_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
<FrameLayout 
    android:id="@+id/pager_container" 
    android:layout_width="match_parent" 
    android:layout_height="240dp" 
    android:clipChildren="false"> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="200dp" 
     android:clipToPadding="false" 
     android:layout_height="200dp" 
     android:layout_marginLeft="70dp" 
     android:layout_marginRight="70dp" 
     android:layout_gravity="center" /> 
</FrameLayout> 
</layout> 

il viewpager è di circa piccolo come si desidera che le pagine siano. Con android: clipToPadding = "false" sono visibili anche le pagine all'esterno del pager. Ma ora trascinando fuori dalla viewpager non ha alcun effetto Questo può essere risolto con la scelta tocchi dal pager-contenitore e passarli al cercapersone:

MyLayoutBinding binding = DataBindingUtil.<MyLayoutBinding>inflate(layoutInflater, R.layout.my_layout, parent, false) 
binding.pager.setOffscreenPageLimit(3); 
binding.pager.setPageMargin(15); 
binding.pagerContainer.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      return chatCollectionLayoutBinding.pager.onTouchEvent(event); 
     } 
}); 
0

Può essere don nel Layout Item del Viewpager. Supponiamo che tu voglia due pagine alla volta.

Questo è il layout Item (photo_slider_item.xml):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/photosSliderItem"> 
     <ImageView android:id="@id/photoBox1" style="@style/photoBox"/> 
     <ImageView android:id="@id/photoBox2" style="@style/photoBox"/> 
    </LinearLayout> 

E nel tuo PagerAdapter:

@Override 
public View instantiateItem(ViewGroup container, int position){ 
    View sliderItem = LayoutInflater.from(container.getContext()).inflate(photo_slider_item, container, false); 
    ImageView photoBox1 = (ImageView) sliderItem.findViewById(R.id.photoBox1); 
    ImageView photoBox2 = (ImageView) sliderItem.findViewById(R.id.photoBox2); 
    photoBox1.setImageResource(photosIds[position]); 
    if(position < photosIds.length-1){ 
     photoBox2.setImageResource(photosIds[position+1]); 
    } else {photoBox2.setImageResource(photosIds[0]);} 
    container.addView(sliderItem); 
    return sliderItem; 
} 
Problemi correlati