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

时间:2012-04-20 09:28:41

标签: android android-activity android-animation

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

在java这两个文件中:

super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
setContentView(R.layout.main);

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>

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>

9 个答案:

答案 0 :(得分:146)

在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"/>

<强> 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"/>

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

overridePendingTransition(R.anim.slide_in, R.anim.slide_out);

答案 1 :(得分:48)

enter image description here

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

创建“CustomActivityAnimation”并通过“windowAnimationStyle”将其添加到基本主题。

NumPy

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

slide_in_right.xml

knn

slide_out_left.xml

<!-- 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>

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>

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>

如果您遇到任何问题,可以下载我的sample project from github

由于

答案 2 :(得分:27)

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);   
    }

答案 3 :(得分:7)

带有一些注释的alpha动画向上/向下滑动

enter image description here

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>

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>

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"/>

第一个活动

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

第二活动

finish();
overridePendingTransition(R.anim.no_animation, R.anim.slide_down);

完成

更多
当展示视图模型(例如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",但它几乎失败了。

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

我尝试了以上3项,但我无法实现类似iOS的效果,动画也无法像iOS一样快速启动。然后我创建一个自定义的decelerateInterpolator,其中factor = 3 like

<?xml version="1.0" encoding="utf-8"?>
<decelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
    android:factor="3" />

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

答案 4 :(得分:1)

您可以在overridePendingTransition而不是startActivity中使用onCreate。至少,这对我有用!

查看完整示例How to avoid redeclaring ticks on every file in PHP 7。它包括一个(反向)动画onBackPressed,所以在返回上一个活动时!在你的具体例子中(淡入和淡出)虽然可能是不必要的。

答案 5 :(得分:1)

希望它对你有用。

startActivityForResult( intent, 1 , ActivityOptions.makeCustomAnimation(getActivity(),R.anim.slide_out_bottom,R.anim.slide_in_bottom).toBundle());

答案 6 :(得分:0)

通过调用overridePendingTransition并为进入和退出活动传递动画资源,可以将幻灯片动画应用于活动过渡。

幻灯片动画可以向右滑动,向左滑动,向上滑动并向下滑动。

向上滑动

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator">
    <scale
        android:duration="800"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="1.0"
        android:toYScale="0.0" />
</set>

向下滑动

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator">
    <scale
        android:duration="800"
        android:fromXScale="1.0"
        android:fromYScale="0.0"
        android:toXScale="1.0"
        android:toYScale="1.0" />
</set>

overridePendingTransition(R.anim.slide_down,R.anim.slide_up);

有关更多活动转换示例,请参阅activity transition animation examples

答案 7 :(得分:0)

Kotlin示例:

 private val SPLASH_DELAY: Long = 1000
    internal val mRunnable: Runnable = Runnable {
        if (!isFinishing) {
            val intent = Intent(applicationContext, HomeActivity::class.java)
            startActivity(intent)
            overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
            finish()
        }
    }


   private fun navigateToHomeScreen() {
        //Initialize the Handler
        mDelayHandler = Handler()

        //Navigate with delay
        mDelayHandler!!.postDelayed(mRunnable, SPLASH_DELAY)

    }

    public override fun onDestroy() {

        if (mDelayHandler != null) {
            mDelayHandler!!.removeCallbacks(mRunnable)
        }

        super.onDestroy()
    }

将动画放入动画文件夹:

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">
</translate>

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">
</translate>

用法

  navigateToHomeScreen();

答案 8 :(得分:0)

这是给您的幻灯片动画。

enter image description here

假设您有两项活动。

  1. MovieDetailActivity
  2. AllCastActivity

然后单击按钮,就会发生这种情况。

enter image description here

您可以通过3个简单的步骤来实现

1)启用内容转换

转到您的style.xml并添加此行以启用内容转换。

<item name="android:windowContentTransitions">true</item>

2)为您的AllCastActivity编写默认的进入和退出过渡

public void setAnimation()
{
    if(Build.VERSION.SDK_INT>20) {
        Slide slide = new Slide();
        slide.setSlideEdge(Gravity.LEFT);
        slide.setDuration(400);
        slide.setInterpolator(new AccelerateDecelerateInterpolator());
        getWindow().setExitTransition(slide);
        getWindow().setEnterTransition(slide);
    }
}

3)以意图开始活动

在您的MovieDetailActivity中编写此方法以启动AllCastActivity

public void startActivity(){

Intent i = new Intent(FirstActivity.this, SecondActivity.class);
i.putStringArrayListExtra(MOVIE_LIST, movie.getImages());

  if(Build.VERSION.SDK_INT>20)
   {
       ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(BlankActivity.this);
       startActivity(i,options.toBundle());
   }
   else {
       startActivity(i);
   }
}

最重要!

将您的setAnimation()方法放在setContentView()方法之前,否则动画将不起作用。
因此,您的AllCastActivity.java应该看起来像这样

 class AllCastActivity extends AppcompatActivity {

   @Override
   protected void onCreate(Bundle savedInstaceState)
   {
      super.onCreate(savedInstaceState);

      setAnimation();

      setContentView(R.layout.all_cast_activity);

      .......
   }

   private void setAnimation(){

      if(Build.VERSION.SDK_INT>20) {
      Slide slide = new Slide();
      slide.setSlideEdge(Gravity.LEFT);
      ..........
  }
}