2

Ich versuche, die AHBottomNavigation (https://github.com/aurelhubert/ahbottomnavigation) zu verwenden und ich befolge seine Demo-App, um mein eigenes zu erstellen.ViewPager mit setCurrentItem (position, false) aber mit Fade-In-Übergang?

In der Demo-App verwendet ViewPager und FragmentPagerAdapter, um zwischen Fragmenten zu wechseln, und alles funktioniert perfekt.

Mein Problem ist, ich will ein Fade-In Fade-Out-Übergang zwischen den Fragmenten hinzuzufügen, hatte ich versucht, dies zu ändern: hinzugefügt

viewPager.setCurrentItem(position, false); 

für

viewPager.setCurrentItem(position); 

Und ich hatte in dieser meiner MainActivity:

viewPager.setPageTransformer(false, new FadePageTransformer()); 

... 

public class FadePageTransformer implements ViewPager.PageTransformer { 
    public void transformPage(View view, float position) { 
     view.setTranslationX(view.getWidth() * -position); 

     if(position <= -1.0F || position >= 1.0F) { 
      view.setAlpha(0.0F); 
     } else if(position == 0.0F) { 
      view.setAlpha(1.0F); 
     } else { 
      // position is between -1.0F & 0.0F OR 0.0F & 1.0F 
      view.setAlpha(1.0F - Math.abs(position)); 
     } 
    } 
} 

es funktioniert tatsächlich, aber wenn ich aus dem ersten Fragmente bis zum letzten gehen will, es zeigt alle Fragmente zwischen ihnen, wie eine Bildlaufansicht.

Es ist ein Verfahren, in der Fragment-Klasse (DemoFragment), dass ich denke, dass ich für eine Fade-In Fade-Out-Übergang verwenden kann, aber ich habe keine Ahnung, wie es zu implementieren, ist dies die Methode:

/** 
* Called when a fragment will be displayed 
*/ 
public void willBeDisplayed() { 
    // Do what you want here, for example animate the content 
} 

Sorry, ich bin neu in Android, ich lerne immer noch, und ich hoffe, Sie können mir helfen, danke!

UPDATE:

ich eine Cross-Fade-Animation zwischen den Fragmenten hinzugefügt werden soll, wie das Beispiel in Material Design (https://www.google.com/design/spec/components/bottom-navigation.html#bottom-navigation-behavior)

Übergang zwischen aktiven und inaktiven Ansichten, die eine grenzüberschreit mit verblassen Animation.

Antwort

1

Da Viewpager die Seiten dazwischen durchlaufen, sollte die animierte Seitenänderung nicht gemäß den Richtlinien für das Materialdesign verwendet werden. Stattdessen sollten Sie setCurrentItem(int, boolean) mit dem booleschen Parameter als false (dies entfernt den Übergang durch die inbetween Elemente) und führen Sie die Animation innerhalb OnTabSelected:

private Animation fadeOut; 
private Animation fadeIn; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    fadeOut = AnimationUtils.loadAnimation(this, android.R.anim.fade_out); 
    fadeOut.setDuration(150); 
    fadeIn = AnimationUtils.loadAnimation(this, android.R.anim.fade_in); 
    fadeIn.setDuration(150); 
    ... 

    bottomNavigation.setOnTabSelectedListener(new AHBottomNavigation.OnTabSelectedListener() { 
      @Override 
      public boolean onTabSelected(int position, boolean wasSelected) { 
       if(!wasSelected) { 
        Fragment oldFrag = getCurrentFragment(); 
        if(oldFrag.getView() != null) { 
         oldFrag.getView().startAnimation(fadeOut); 
        } 

        mViewPager.setCurrentItem(position, false); 

        // The following line might not be necessary 
        getSupportFragmentManager().executePendingTransactions(); 

        Fragment newFrag = getCurrentFragment(); 
        if(newFrag.getView() != null) { 
         newFrag.getView().startAnimation(fadeIn); 
        } 
       } else { 
        getCurrentFragment().onReopen(); 
       } 

       return true; 
      } 
     }); 
}