2013-06-09 16 views
8

Sto cercando di ottenere un effetto di parallasse nella mia applicazione. Ho un FragmentActivity che implementa l'interfaccia OnPageChangeListener e ascolta i miei eventi di scorrimento ViewPager.Android Parallax Effect e View Pager

Per ottenere questo effetto nel mio XML, ho uno LinearLayout dietro tutte le altre visualizzazioni con il mio background, e lo sposto nel callback onPageScrolled. Se faccio semplicemente scorrere tutto è ok, l'effetto funziona e la posizione di sfondo cambia. Ma quando il mio dito lascia lo schermo, lo sfondo viene ridisegnato nella sua posizione originale (anche se sono in una nuova pagina). Non riesco a capire perché questo accada. Ecco il codice della mia FragmentActivity:

public class MainActivity extends FragmentActivity implements OnPageChangeListener { 

// DEFINE THE PAGEADAPTER 
private ViewPager viewPager; 
private com.angtrim.ecomilano.PagerAdapter pagerAdapter; 
private int oldPosition = 0; 
private int offSet = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    // CREATE VIEWPAGER 
    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    pagerAdapter = new PagerAdapter(getApplicationContext(),getSupportFragmentManager()); 
    // SET THE ADAPTER 
    viewPager.setAdapter(pagerAdapter);   
    // SET FIRST ITEM 
    viewPager.setCurrentItem(0); 
    // SET CHANGE PAGE LISTENER 
    viewPager.setOnPageChangeListener(this);   
}  

@Override 
public void onPageScrollStateChanged(int arg0) { 
    // TODO Auto-generated method stub  
} 

@Override 
public void onPageScrolled(int arg0, float arg1, int arg2) { 

    // RIGHT SWIPE 
    if((oldPosition < arg2)) 
    {  
     offSet = (int)((arg2 - oldPosition)*0.5);    
     oldPosition = arg2; 
    } 
    // LEFT SWIPE 
    else if((oldPosition > arg2)) 
    { 
     offSet = (int) (-(oldPosition - arg2)*0.5);   
     oldPosition = arg2; 
    } 

    findViewById(R.id.backi).offsetLeftAndRight(offSet);   
} 

@Override 
public void onPageSelected(int arg0) { 
    // TODO Auto-generated method stub 

} 
} 

Grazie.

+0

possono utilizzare questo per lo sfondo e l'effetto di parallasse è dipende dal movimento dello schermo – Prasad

risposta

9

So che è un po 'vecchio, ma dare un'occhiata a quello https://github.com/xgc1986/ParallaxPagerLibrary

Non l'override del metodo OnDraw, e l'effetto non solo con le immagini, funziona con ogni tipo di vista

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

R.id.paraallaxContent è l'id della vista che si desidera avere questo effetto

a meno che le altre soluzioni, non hanno bisogno di alcuna struttura in calcestruzzo a lavorare, ed è anche il layout indipendente

demo : youtube

+0

è effetto di parallasse possibile in vista verticale cercapersone? – user1076881

2

So che la domanda è vecchia, e non posso davvero rispondere alla tua domanda. Ma un ragazzo di nome Matthieu ha creato un eccellente esempio dell'effetto di parallasse di ViewPager che può essere trovato al seguente link.

https://github.com/MatthieuLJ/ViewPagerParallax

1

Dai un'occhiata a questo small library che ho creato - è una sottoclasse di ViewPager, che non richiede alcuna configurazione aggiuntiva affinché l'effetto di parallasse funzioni.

2

questa libreria è completamente personalizzabile in direzioni X e Y e include gli effetti alfa:

https://github.com/prolificinteractive/ParallaxPager

installazione (come di V0.7, controllare README per aggiornamenti):

  1. Aggiungi come dipendenza Maven centrale con Gradle

  2. Utilizzare l'usanza ParallaxContainer nel layout XML invece di ViewPager

  3. Creare un file di layout XML per ogni pagina (gli attributi x/y/alpha possono essere impostati separatamente per ogni oggetto che si muove dentro/fuori la pagina)

  4. Ci sono alcune linee di copia/incolla da aggiungere a onCreate della vostra attività (testa al README per le linee esatte)

parallax planet animation

+0

Ottima libreria, l'ho usata per il mio schermo di parallasse e funziona perfettamente. – Shirane85