2012-01-12 16 views
40

¿Existe la posibilidad de mostrar dos páginas al mismo tiempo, cuando se utiliza un ViewPager? No estoy buscando un efecto de borde, sino dos páginas completas al mismo tiempo.Varias páginas al mismo tiempo en un ViewPager

Gracias de antemano.

+0

no estoy muy seguro de lo que estás asking..can explicar un poco mas? – Cody

+0

Quiero que ViewPager muestre dos de las páginas disponibles una al lado de la otra, igual que un libro. –

+0

¿podría usar dos fragmentos para lograr un efecto de lado a lado? es solo una idea ... no me culpes ..... – NIPHIN

Respuesta

-2

No creo que sea posible con las limitaciones de un Buscapersonas. Solo permite que un usuario vea las páginas 1 a la vez. Es posible que pueda resolver algo con el uso de fragmentos, y tenga 2 fragmentos de ViewPager uno al lado del otro y use botones para calcular la página que desea implementar, pero el código puede volverse muy complejo.

Puede probar algo como un ViewFlipper, donde puede hacer muchas más personalizaciones (incluidas las animaciones).

Espero que esto ayude.

64

Por favor, eche un vistazo al Método getPageWidth en el PagerAdapter correspondiente. Anularlo y devolver, p. 0.8f para que todas las páginas secundarias abarquen solo el 80% del ancho de ViewPager.

Más información: http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#getPageWidth(int)

+0

el problema con esa técnica, es que aparece un margen de margen extra, añadiendo un extraño espacio en blanco debajo del Viewpager – elgui

+0

¡Creo que esta es la mejor respuesta! –

+0

Esto agrega un poco de efecto de parpadeo en el buscapersonas, todavía puedo deslizar y puedo ver que las vistas producen un parpadeo extraño. – pyus13

2

Puede resolver este problema utilizando getPageWidth en la clase PagerAdapter.

estar seguro acerca de si su JAR es hasta a la fecha .Desde previamente ViewPager no estaba apoyando a varias páginas al mismo tiempo.

flotación pública getPageWidth() {

retorno 0,4F; (se puede elegir que .Por pantalla completa por página usted debe dar 1f) }

30

ver mis más arriba-hasta la fecha respuesta aquí: Can ViewPager have multiple views in per page?

Descubrí que una solución quizás incluso más simple mediante la especificación de un margen negativo para ViewPager. He creado el proyecto MultiViewPager en GitHub, que es posible que desee echar un vistazo a:

https://github.com/Pixplicity/MultiViewPager

pesar de que esta pregunta se refiere específicamente a una solución sin efecto de borde, algunas respuestas aquí proponen la solución por parte de CommonsWare, como la sugerencia de kaw.

Existen varios problemas con el manejo táctil y la aceleración de hardware con esa solución en particular.Una solución más simple y más elegante, en mi opinión, es especificar un margen negativo para el ViewPager:

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

entonces he especificado esta dimensión en mi dimens.xml:

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

Para compensar las páginas superpuestas, ver el contenido de cada página tiene el margen opuesto:

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

de nuevo en dimens.xml:

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

(Tenga en cuenta que la dimensión viewpager_margin_fix es la mitad de la viewpager_margin dimensión absoluta.)

implementamos este in the Dutch newspaper app De Telegraaf Krant:

Phone example in De Telegraaf KrantTablet example

+0

Me encantó su solución. Simple y elegante ...! Gracias hombre. Intentaba lograr esto usando 'PageTransformer'. –

+2

funcionó para mí.También necesita agregar setOffScreenPageLimit (2) para mejorar el almacenamiento en caché en 2 para evitar retrasos en la segunda vista siguiente. – Giorgio

+0

En nota anterior: Eso es ViewPager.setOffscreenPageLimit (2) en caso de que alguien sea expulsado. – fooser

11

Hay que reemplazar el método getPageWidth() en el Adaptador de viewpager. Por ejemplo:

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

Pruebe ese código en su adaptador y entonces lo comprenderá.

+2

Esto se ve muy similar a la respuesta @ Markus-Wörz? – bummi

1

crear su archivo de diseño: 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> 

la ViewPager es casi tan pequeño como usted quiere que sus páginas sean. Con android: clipToPadding = "false", las páginas fuera del buscapersonas también son visibles. Pero ahora arrastrando fuera del ViewPager no tiene ningún efecto Esto puede remediarse por recoger toques del localizador-contenedor y pasarlos al buscapersonas:

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

Puede ser don en el diseño artículo del ViewPager. Supongamos que quieres dos páginas a la vez.

Ésta es la disposición artículo (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> 

Y en su 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; 
} 
Cuestiones relacionadas