2012-09-14 47 views
12

Intento emular un efecto de paralaje al deslizarme por mis fragmentos, he leído sobre beginFakeDrag y fakeDragBy, pero para ser sincero, no sé si es el mejor enfoque para mi problema .Efecto Parallax en la ViewPager de Android

¿Alguien ha hecho algo similar con ViewPager o tiene una pista sobre cómo debo abordar esto?

Gracias

Respuesta

11

Esta pregunta es un poco viejo, pero lo encontré cuando yo estaba tratando de hacer exactamente eso ...

implementé mi propia solución, que se extiende básicamente ViewPager y primordial onDraw.

puede encontrar todo el código con un ejemplo sencillo here

+0

Muchas gracias! Terminé haciendo mi propio código también. Lo marcaré como una solución. – pdj

+0

Hola, ¿qué tengo que hacer para hacer múltiples efectos de paralaje en el visor? como 2 o 3? – Tsunaze

5

sé que es un poco viejo, pero echa un vistazo a la https://github.com/xgc1986/ParallaxPagerLibrary

No reemplaza el método onDraw, y el efecto no sólo con imágenes, funciona con cualquier tipo de vista

mPager.setPageTransformer(false, new ParallaxTransformer(R.id.parallaxContent)); 

R.id.paraallaxContent es el id de la vista que desea tener este efecto

a menos que las otras soluciones, no es necesario ningún cualquier estructura de hormigón a trabajar, y también es el diseño independiente

demo: youtube

2

Esta es una subclase de ViewPager que escribí, bastante fácil de usar. No necesita hacer nada diferente con él, solo incluya la dependencia y úselo como un ViewPager estándar. Disponible en GitHub.

2

esta biblioteca es completamente adaptable en direcciones X e Y e incluye efectos alfa:

https://github.com/prolificinteractive/ParallaxPager

instalación (como de v0.7, compruebe README para actualizaciones):

  1. Agregar una dependencia Maven central con Gradle

  2. Utilice un ParallaxContainer en XML diseño en lugar de ViewPager

  3. Crear un archivo del formato XML para cada página (los atributos x/y/alpha se pueden establecer por separado para cada objeto que se mueve dentro/fuera de la página)

  4. Hay algunas líneas de copiar/pegar para agregar a onCreate de la Actividad

parallax planet animation

+0

que implementan esta biblioteca y este es mi código: parallaxContainer.setupChildren (getLayoutInflater(), R.layout.parallax_view_1, R.layout.parallax_view_2, R.layout.parallax_view_3); Pero solo muestra la última vista correctamente. La primera vista está vacía, la segunda vista es en realidad la mitad de la tercera y la última vista se ve como debería ser. ¿Cuál es el problema? ¿Por qué no carga las 3 vistas independientemente una de la otra? –

+1

@rosualin mi primera sugerencia sería verificar los atributos personalizados utilizados en los diseños XML. [Este paso del proceso de configuración] (https://github.com/prolificinteractive/ParallaxPager#2-create-a-layout-xml-file-for-each-page) podría ayudar. ¿La línea 'xmlns: app' se ha agregado a la raíz? ¿Cuáles son los valores de 'x_in', etc. para las vistas en cada diseño? Gracias por tu comentario, espero que podamos resolver esto. –

+0

El problema era que era un diseño relativo y no lineal, lo cambió a lineal y funcionó. Puse algunos diseños relativos dentro del lineal y también tuve problemas. Pero luego obligué a todos los elementos a tener un x_in, x_out (x, y, a no importa) y funcionó. Aparentemente tienes que llamar esto incluso si no quieres una traducción, así que simplemente los llamé con valor 0 y ahora está bien, ¡muchas gracias! –

6

Una manera fácil de hacer esto sin necesidad de utilizar una biblioteca personalizada es implementar ViewPager.PageTransformer

creé mis diseños para utilizar el mismo id por su elemento de fondo. Para mi ejemplo todas las imágenes de fondo se utiliza el ID background

<ImageView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/background" 
    android:src="@drawable/img12" 
    android:scaleType="fitXY"/> 

Entonces cuando voy a poner en práctica ViewPager.PageTransformer puedo hacer referencia a esa imagen, así:

public class Transformer implements ViewPager.PageTransformer{ 
    @Override 
    public void transformPage(View page, float position) { 
     if(position >= -1 && position <= 1){ 
      page.findViewById(R.id.background).setTranslationX(-position * page.getWidth()/2); 
     } else { 
      page.setAlpha(1); 
     } 
    } 
} 

Por último, asigno mi ViewPager.PageTransformer a mi ViewPager al igual que.

ViewPager pager = (ViewPager) findViewById(R.id.pager); 
pager.setPageTransformer(false, new Transformer()); 
+1

Esta es la * mejor * respuesta por ahí, gracias amigo – orelzion

+1

Esto es un salvavidas .. Impresionante. – Sanoop

+1

¡Esta respuesta debe ser aceptada! –

0

Puede utilizar Parallax ViewPager Biblioteca Android es necesario implementar esto sólo añadir un poco por debajo de la línea de build.gradle para Android Studio.

allprojects { 
    repositories { 
     ... 
     maven { url 'https://jitpack.io' } 
    } 
} 

Y a continuación, añadir la dependencia

dependencies { 
    compile 'com.github.demoNo:ParallaxViewPager:v1.0.0' 
} 

Y ahora usted puede utilizar esta biblioteca como ViewPager normales

<li.yohan.parallax.ParallaxViewPager 
    android:id="@+id/viewPager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 
ParallaxViewPager mPager = ((ParallaxViewPager) findViewById(R.id.pager)); 
mPager.setAdapter(new Adapter()); 

Se puede ver demo here

que puede establecer en XML :

android:background="@drawable/background" 

o en el código

setBackgroundResource(int resid) 
setBackground(Drawable background)