【问题标题】:ViewPager with setCurrentItem(position, false) but with fade-in transition?带有 setCurrentItem(position, false) 但带有淡入过渡的 ViewPager?
【发布时间】:2016-05-31 08:46:53
【问题描述】:

我正在尝试使用 AHBottomNavigation (https://github.com/aurelhubert/ahbottomnavigation),我正在关注它的演示应用程序来制作我自己的应用程序。

在演示应用程序中,它使用 ViewPager 和 FragmentPagerAdapter 在片段之间切换,一切正常。

我的问题是,我想在片段之间添加一个淡入淡出的过渡,我试图改变这个:

viewPager.setCurrentItem(position, false);

viewPager.setCurrentItem(position);

我已经在我的 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));
        }
    }
}

它确实有效,但如果我想从第一个片段转到最后一个片段,它会显示它们之间的所有片段,就像滚动视图一样。

它在Fragment类(DemoFragment)中有一个方法,我想我可以用它来进行淡入淡出转换,但是我不知道如何实现它,这是方法:

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

对不起,我是android新手,还在学习中,希望您能帮助我,谢谢!

更新:

我想在片段之间添加交叉淡入淡出动画,如 Material Design 中的示例 (https://www.google.com/design/spec/components/bottom-navigation.html#bottom-navigation-behavior)

使用交叉淡入淡出在活动视图和非活动视图之间转换 动画。

【问题讨论】:

    标签: android android-fragments android-viewpager transition fade


    【解决方案1】:

    由于 viewpagers 在中间的页面之间进行转换,因此不应根据材料设计指南使用其动画页面更改。相反,您应该使用 setCurrentItem(int, boolean) 并将布尔参数设置为 false(这会删除通过中间元素的过渡)并在 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;
                }
            });
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-17
      • 1970-01-01
      • 2018-12-10
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多