片段或活动之间的交叉淡入淡出动画

时间:2018-01-08 09:50:39

标签: android android-fragments android-animation android-6.0-marshmallow

我想在片段之间实现Crossfade动画(不是淡出/淡入动画,因为它允许在动画之间简单地看到底层的Activity /片段)

Android开发人员有如何使用Crossfade视图的指南 " Crossfading Two Views"但是我没有得到如何在片段或活动之间实现Crossfade。

以某种方式制作自定义动画并覆盖onCreateAnimator函数或甚至可能吗??

2 个答案:

答案 0 :(得分:10)

尝试使用此活动(可以将其添加到某些BaseActivity中)

    @Override public void startActivity(Intent intent) {
        super.startActivity(intent);
        overridePendingTransition(R.anim.fade_in, R.anim.fade_out)
    }

    @Override public void finish() {
        super.finish();
        overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
    }

fade_in:

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:duration="@integer/activity_transition_duration"
       android:fromAlpha="0.0"
       android:interpolator="@android:anim/accelerate_interpolator"
       android:toAlpha="1.0" />

和fade_out:

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:duration="@integer/activity_transition_duration"
       android:fillAfter="true"
       android:fromAlpha="1.0"
       android:interpolator="@android:anim/accelerate_interpolator"
       android:toAlpha="0.0" />

对于碎片:

    FragmentTransaction transaction = supportFragmentManager.beginTransaction()

    transaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out,
                R.anim.fade_in, R.anim.fade_out)

答案 1 :(得分:1)

这是一个古老的问题,但是我将为片段添加我的交叉淡入淡出动画版本。 @Demonick片段的答案对我不起作用,因为我为片段使用ViewPager,而使用FragmentTransaction则比我看到的还要多。

private inner class FadeBetweenFragments : ViewPager.PageTransformer {

    private val MIN_SCALE = 0.1f
    private val MIN_ALPHA = 0.4f

    override fun transformPage(view: View, position: Float) {
        view.apply {
            alpha = when {
                position < -1 -> {
                    0f
                }
                position <= 1 -> {
                    val scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position))
                    (MIN_ALPHA +
                            (((scaleFactor - MIN_SCALE) / (1 - MIN_SCALE)) * (1 - MIN_ALPHA)))
                }
                else -> {
                    0f
                }
            }
        }
    }
}

我在具有viewPager的活动中添加了以下类。 实现该类后,需要在设置ViewPager时添加以下内容:

viewPager.setPageTransformer(true, FadeBetweenFragments())