如何在Android中的两个活动之间应用幻灯片动画?

Jig*_*iya 52 android android-animation android-activity

当我从一个活动移动到另一个活动时,我想从左到右实现滑动效果.为此,我使用以下代码,但我没有得到任何结果.请指正.

在java这两个文件中:

super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
setContentView(R.layout.main);
Run Code Online (Sandbox Code Playgroud)

res/anim目录中的两个文件:

fadein.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromAlpha="0.0"
    android:interpolator="@android:anim/slide_out_right"
    android:toAlpha="1.0" >
</alpha>
Run Code Online (Sandbox Code Playgroud)

fadeout.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromAlpha="0.0"
    android:interpolator="@android:anim/slide_in_left"
    android:toAlpha="1.0" >
</alpha>
Run Code Online (Sandbox Code Playgroud)

Bor*_*Win 150

在res/anim文件夹中添加这两个文件.

slide_in.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
   xmlns:android="http://schemas.android.com/apk/res/android" 
   android:duration="@android:integer/config_longAnimTime" 
   android:fromXDelta="100%p" 
   android:toXDelta="0%p"/>
Run Code Online (Sandbox Code Playgroud)

slide_out.xml

<?xml version="1.0" encoding="utf-8"?>
<translate
   xmlns:android="http://schemas.android.com/apk/res/android" 
   android:duration="@android:integer/config_longAnimTime" 
   android:fromXDelta="0%p" 
   android:toXDelta="-100%p"/>
Run Code Online (Sandbox Code Playgroud)

并在您通过Intent传递的下一个活动的onCreate()方法中编写以下代码.

overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢 - 现在,当按下后退按钮返回旧活动时,我应该在哪里放置反向动画 (11认同)
  • @EmAe,我问过一个类似的问题,并在这里自己回答:http://stackoverflow.com/questions/39711666/activity-change-animation-with-popenter-and-popexit-animations/41025993#41025993。希望能帮到你! (2认同)

Sho*_*jan 64

您可以覆盖默认活动动画,它的性能优于overridePendingTransition.我使用这个适用于每个Android版本的解决方案.只需复制粘贴4个文件并添加4行样式,如下所示:

创建一个"CustomActivityAnimation"并通过"windowAnimationStyle"将其添加到您的基本主题.

<!-- 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/colorPrimary</item>
    <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>

</style>

<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>
Run Code Online (Sandbox Code Playgroud)

然后在res文件夹下创建anim文件夹,然后将这四个动画文件创建到anim文件夹中:

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Run Code Online (Sandbox Code Playgroud)

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Run Code Online (Sandbox Code Playgroud)

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="-100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Run Code Online (Sandbox Code Playgroud)

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Run Code Online (Sandbox Code Playgroud)

如果您遇到任何问题,那么您可以从github下载我的示例项目.

谢谢

  • 非常感谢你 ! (2认同)
  • 不适用于adnroid 6(huawei p8) (2认同)
  • 非常好..工作非常好..我们不需要添加此方法的优势的所有意图..比 shohan (2认同)
  • 这是一个神奇的解决方案,值得 1000 票赞成。您很少会找到像这样简单而优雅的解决方案。最重要的是,不需要丑陋的长编码,只需简单的 XML 即可完成这一切。 (2认同)

MAC*_*MAC 28

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splashscreen);

         new Handler().postDelayed(new Runnable() {
             public void run() {

                     /* Create an intent that will start the main activity. */
                     Intent mainIntent = new Intent(SplashScreen.this,
                             ConnectedActivity.class);
                     mainIntent.putExtra("id", "1");

                     //SplashScreen.this.startActivity(mainIntent);
                     startActivity(mainIntent);
                     /* Finish splash activity so user cant go back to it. */
                     SplashScreen.this.finish();

                     /* Apply our splash exit (fade out) and main
                        entry (fade in) animation transitions. */
                     overridePendingTransition(R.anim.mainfadein,R.anim.splashfadeout);
             }
     }, SPLASH_DISPLAY_TIME);   
    }
Run Code Online (Sandbox Code Playgroud)

  • 请不要做这种延迟Activity启动的事情!即使您的应用程序不再处于前台,它也会启动您的 MainActivity。 (7认同)

Pha*_*inh 10

在Alpha动画中向上/向下滑动,并附带一些注意事项

在此处输入图片说明

slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@integer/activity_transition_time"
    >
    <translate
        android:fromYDelta="100%p"
        android:toYDelta="0"/>
    <alpha
        android:fromAlpha="0.5"
        android:toAlpha="1"/>
</set>
Run Code Online (Sandbox Code Playgroud)

slide_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@integer/activity_transition_time"
    >
    <translate
        android:fromYDelta="0"
        android:toYDelta="100%p"/>
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0.5"/>
</set>
Run Code Online (Sandbox Code Playgroud)

no_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@integer/activity_transition_time"
    android:fromYDelta="0"
    android:toYDelta="0"/>
Run Code Online (Sandbox Code Playgroud)

第一次活动

startActivity(new Intent(this, SecondActivity.class));
overridePendingTransition(R.anim.slide_up,  R.anim.no_animation); // remember to put it after startActivity, if you put it to above, animation will not working
// document say if we don't want animation we can put 0. However, if we put 0 instead of R.anim.no_animation, the exist activity will become black when animate
Run Code Online (Sandbox Code Playgroud)

第二次活动

finish();
overridePendingTransition(R.anim.no_animation, R.anim.slide_down);
Run Code Online (Sandbox Code Playgroud)

完成了

另外,
当显示视图模型(例如https://www.youtube.com/watch?v=deZobvh2064)时,我尝试制作类似于iOS动画的幻灯片动画,但失败了。

查看iOS当前的动画,您将看到:动画从底部开始带有alpha(大约50%),然后又快又慢,动画时间大约> 500ms(我使用修整视频工具来计算动画时间 https:// www.kapwing.com/trim-video,所以它不能完全是100%)

然后,我尝试申请android。
为了使alpha我使用<alpha>并取得成功。
为了使动画的开始速度比慢的速度更快,android:interpolator="a decelerate interpolator"但它几乎失败了。

decelerate interpolatorAndroid中有3个默认值
@android:interpolator/decelerate_quad-> factor = 1-
@android:interpolator/decelerate_cubic> factor = 1.5
@android:interpolator/decelerate_quint_> factor = 2.5
(较高的factor <=>动画从开始开始更快,结束时更慢)
这是一个很好的教程http:// cogitolearning。 co.uk/2013/10/android-animations-tutorial-5-more-on-interpolators/了解它

我在上面的3个尝试中无法实现像iOS一样的动画,无法像iOS那样更快地启动动画。然后我创建一个自定义的decelerateInterpolator,其中factor = 3像

<?xml version="1.0" encoding="utf-8"?>
<decelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
    android:factor="3" />
Run Code Online (Sandbox Code Playgroud)

并且我从延长了持续时间500 -> 750。它运行良好(非常类似于iOS)。但是,它只能在某些设备上运行良好,在某些设备上动画效果非常慢。稍后,我知道动画在不同的设备上可能会有所不同(例如:某些设备会更快,而某些设备会更慢),因此我无法使它在所有Android设备上都具有相似的动画。因此,我不使用interpolator。我不知道我的测试是否完全是100%,但我希望这种经验对您有所帮助