【问题标题】:How to perform a fade animation on Activity transition?如何在 Activity 过渡上执行淡入淡出动画?
【发布时间】: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>

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

【问题讨论】:

    标签: android animation android-intent pending-transition


    【解决方案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);
    • 只有在开发者选项中启用时才会执行上述转换,请参阅stackoverflow.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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-06
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 2012-05-20
      • 2015-01-17
      • 1970-01-01
      相关资源
      最近更新 更多