如何在 Activity 过渡上执行淡入淡出动画?

Posted

技术标签:

【中文标题】如何在 Activity 过渡上执行淡入淡出动画?【英文标题】:How to perform a fade animation on Activity transition? 【发布时间】:2013-08-30 19:32:00 【问题描述】:

我正在编码我的徽标活动和我的主要活动之间的过渡效果,但我有一个问题,即在消失之前活动移动到顶部:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

    <alpha
        android:duration="2000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" >
    </alpha>

</set>

我怎样才能改进这段代码以获得消失的效果?

【问题讨论】:

【参考方案1】:

您可以创建自己的 .xml 动画文件来淡入新的Activity 并淡出当前的Activity

fade_in.xml

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

fade_out.xml

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

在这样的代码中使用它:(在您的 Activity 中)

Intent i = new Intent(this, NewlyStartedActivity.class);
startActivity(i);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

以上代码将淡出当前活动的Activity,淡入新启动的Activity,从而实现平滑过渡。

更新: @Dan J 指出,使用内置的 Android 动画提高了性能,我在做了一些测试后确实发现了这种情况。如果您更喜欢使用内置动画,请使用:

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

注意我引用 android.R 而不是 R 来访问资源 ID。

更新:现在通常使用Transition class introduced in API level 19 执行转换。

【讨论】:

使用内置的 Android 动画似乎可以实现更平滑的过渡:overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); 查看这些文件还可以为您提供有关如何改进自定义动画的提示(例如,通过使淡入持续时间超过淡出)。 它有一个取消标记:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); :) 我必须使用 overridePendingTransition onCreate 还是在每个 Intent 中?还是取决于我想要什么?谢谢。 有一个选项没有“覆盖”:Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); startActivity(intent, bundle); 只有在开发者选项中启用时才会执行上述转换,请参阅***.com/a/30422015/2914140。【参考方案2】:

只是重新发布answer by oleynikd,因为它简单整洁

Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),
    android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
startActivity(intent, bundle);

按下后退按钮时动画,

override fun onNavigateUp(): Boolean 
    return super.onNavigateUp()
    overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)


override fun onBackPressed() 
    super.onBackPressed()
    overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)

【讨论】:

由于 overridePendingTransition 在某些手机上不起作用,而且 Enes 的解决方案也不是很好,所以这个答案应该是正确的。 它适用于开始活动,但回来(完成)活动呢 查看更新的答案【参考方案3】:

您还可以在您的活动中添加动画,在 onCreate 方法中,如下所示,因为 overridePendingTransition 不适用于某些移动设备,或者它取决于设备设置...

View view = findViewById(android.R.id.content);
Animation mLoadAnimation = AnimationUtils.loadAnimation(getApplicationContext(), android.R.anim.fade_in);
mLoadAnimation.setDuration(2000);
view.startAnimation(mLoadAnimation);

【讨论】:

如何处理前一个或父活动的动画? 要设置过渡回父活动的动画,请使用以下代码:@Override public void onBackPressed() super.onBackPressed(); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); 【参考方案4】:

您也可以在 style.xml 文件中使用此代码,因此您无需在 activity.java

中编写任何其他内容
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowAnimationStyle">@style/AppTheme.WindowTransition</item>
</style>

<!-- Setting window animation -->
<style name="AppTheme.WindowTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>

【讨论】:

以上是关于如何在 Activity 过渡上执行淡入淡出动画?的主要内容,如果未能解决你的问题,请参考以下文章

使用 CSS 过渡的滑动 + 淡入淡出效果

复制 iBooks 缩放/淡入淡出动画

在 jQuery 中与 CSS 中的过渡同时使用淡入淡出和淡出

如何在 Flutter 中移除原生闪屏和主屏幕之间的默认淡入淡出过渡? (仅使用本机启动画面)

如何在推送路由颤动上创建淡入淡出过渡?

如何在Aframe中向实体添加淡入淡出过渡