如何在Activity转换上执行淡入淡出动画?

Mar*_*orn 82 animation android android-intent pending-transition

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

<?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>
Run Code Online (Sandbox Code Playgroud)

我怎么能改进这个代码才能获得消失效果呢?

Phi*_*oda 219

您可以创建自己的.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" />
Run Code Online (Sandbox Code Playgroud)

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" />
Run Code Online (Sandbox Code Playgroud)

在代码中使用它:(在你的内部Activity)

Intent i = new Intent(this, NewlyStartedActivity.class);
startActivity(i);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
Run Code Online (Sandbox Code Playgroud)

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

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

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Run Code Online (Sandbox Code Playgroud)

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

更新:现在通常使用API级别19中引入Transition类来执行转换.

  • 使用内置的Android动画似乎可以实现更平滑的过渡:`overridePendingTransition(android.R.anim.fadein,android.R.anim.fadeout);`查看这些文件也可以为您提供有关如何改进自定义动画的提示(例如,使淡入淡出的持续时间长于淡出淡出量). (60认同)
  • 它有一个不受欢迎的:`overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);`:) (39认同)
  • 有一个没有"覆盖"的选项:`Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),android.R.anim.fade_in,android.R.anim.fade_out).toBundle(); startActivity(intent,bundle);` (16认同)

Ene*_*nes 18

你也可以在你的活动中添加动画,在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);
Run Code Online (Sandbox Code Playgroud)

  • 要将转换的动画设置回父活动,请使用以下代码:`@Override public void onBackPressed(){super.onBackPressed(); overridePendingTransition(R.anim.fade_in,R.anim.fade_out); }` (9认同)

Nik*_*hil 18

只需重新发布 oleynikd的答案,因为它简单而整洁

Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),
    android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
startActivity(intent, bundle);
Run Code Online (Sandbox Code Playgroud)


小智 12

您也可以在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>
Run Code Online (Sandbox Code Playgroud)