【问题标题】:How to apply slide animation between two activities in Android?如何在 Android 中的两个活动之间应用幻灯片动画?
【发布时间】:2012-04-20 09:28:40
【问题描述】:

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

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

【问题讨论】:

  • 我使用了这个代码:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); 您可以在GmailAnimationLopeAnimations 中看到这些示例。您还可以在Blog 中看到更多信息。

标签: android android-activity android-animation


【解决方案1】:

将这两个文件添加到 res/anim 文件夹中。

R.anim.slide_out_bottom

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
    android:duration="@integer/time_duration_max"
    android:fromXDelta="0%"
    android:fromYDelta="100%"
    android:toXDelta="0%"
    android:toYDelta="0%" />
</set>

R.anim.slide_in_bottom

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
    android:duration="@integer/time_duration_max"
    android:fromXDelta="0%"
    android:fromYDelta="0%"
    android:toXDelta="0%"
    android:toYDelta="100%" /> 
</set>

并在您的视图点击监听器中编写以下代码行。

startActivity(new Intent(MainActivity.this, NameOfTargetActivity.class));
overridePendingTransition(R.anim.slide_out_bottom, R.anim.slide_in_bottom);

【讨论】:

  • 谢谢 - 现在按下返回按钮返回旧活动时,我应该如何将反向动画放在哪里
  • @EmAe,我问了一个类似的问题,并在这里自己回答:stackoverflow.com/questions/39711666/…。希望对你有帮助!
  • @Born To Win 如果可能的话你能添加反向动画吗?
  • 那些动画不是走错路了吗?它是 (enterAnim, exitAnim)
【解决方案2】:

您可以覆盖您的默认活动动画,它比 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>

然后在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>

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>

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

谢谢

【讨论】:

  • 我使用的是android 6 Huawei,它的表现非常好。 :)
  • 非常好..工作非常好..我们不需要添加所有意图,这是这种方法的优势..thans shohan
  • 我喜欢这种解决方案!把它放在一个地方,就像一个魅力一样无处不在!
  • 这是最好的解决方案。无需使用 Java/Kotlin 编写代码。只需将这些 XML 文件放入,一切就轻松搞定了。
  • 这是一个神奇的解决方案,值得 1000 次投票。很少你能找到像这样简单而优雅的解决方案。最重要的是,不需要丑陋的长编码,只需简单的 XML 就可以了。
【解决方案3】:
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);   
    }

【讨论】:

  • 请不要做这种延迟的Activity开始!即使您的应用不再处于前台,它也会启动您的 MainActivity。
【解决方案4】:

带有一些音符的 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>

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,我使用 &lt;alpha&gt; 并成功。
为了让动画启动得快于慢,我使用了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 -&gt; 750 增加持续时间。它运行良好(与 iOS 非常相似)。但是,它只在某些设备上运行良好,在某些设备上动画很慢。后来,我知道不同设备上的动画可能会有所不同(例如:某些设备会更快,而某些设备会更慢)所以我不能让它在所有 Android 设备上都相似。因此我不使用interpolator。我不知道我的测试是否准确 100%,但我希望这次经历对您有所帮助

【讨论】:

    【解决方案5】:

    这是给你的幻灯片动画。

    假设您有两个活动。

    1. MovieDetailActivity
    2. AllCastActivity

    点击一个按钮,就会发生这种情况。

    您可以通过 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) 以 Intent 启动 Activity

    将此方法写入您的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()method 放在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);
          ..........
      }
    }
    

    【讨论】:

      【解决方案6】:

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

      将动画放入 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">
      </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();
      

      【讨论】:

        【解决方案7】:

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

        查看完整示例 here。它包括一个(反向)动画 onBackPressed,所以在返回之前的活动时!不过,在您的具体示例(淡入和淡出)中,这可能是不必要的。

        【讨论】:

          【解决方案8】:

          希望它对你有用。

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

          【讨论】:

            【解决方案9】:

            通过调用 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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-12-06
              • 1970-01-01
              相关资源
              最近更新 更多