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

如何在Android中的两个活动之间应用幻灯片动画?,android,android-activity,android-animation,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"

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

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

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_out_right"
    android:toAlpha="1.0" >
</alpha>
<?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>
<?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>
<?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>
<?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"/>

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

R.anim.滑出底部

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

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

创建“CustomActivityAnimation”,并通过“windowAnimationStyle”将其添加到基础主题中


@颜色/原色
@颜色/原色暗
@颜色/原色
@样式/自定义活动动画
@动画/幻灯片在右侧
@动画/滑出左
@动画/幻灯片在左
@动画/滑出\右
然后在res文件夹下创建动画文件夹,然后将这四个动画文件创建到动画文件夹中:

将\u滑入\u 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>
<?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>

滑出\u 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>

在\u left.xml中滑动\u

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

滑出\u 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>
<?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>

如果你遇到任何问题,那么你可以下载我的


谢谢

您可以在
startActivity
中使用
覆盖翻译
而不是
onCreate
。至少,这对我有用


请参阅完整示例。它包括一个(反向)动画,所以在返回到上一个活动时!在您的特定示例中(淡入淡出),这可能是不必要的。

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

覆盖过渡(R.anim.slide\u向下,R.anim.slide\u向上)


有关更多活动转换示例,请参见。

使用alpha动画向上/向下滑动,并附带一些注释

向上滑动.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>
<?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>
<?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>
<?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>
<?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);
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);
    }
}
完成

更多
当呈现视图模型时,我尝试使幻灯片动画类似于iOS动画(如下图所示),但失败了

查看iOS当前的动画,您将看到:从底部开始的动画使用alpha(约50%),然后速度非常快,然后变慢,动画时间大约>500毫秒(我使用修剪视频工具来计算动画时间) 所以它不可能完全是100%)

然后我尝试应用到android上。
为了制作alpha,我使用
来理解它

我试过上面的3个我不能实现像iOS一样的动画,也不能像iOS那样启动得更快。然后我创建一个自定义减速器插值器,其系数为3,如

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

我将持续时间从
500->750
增加。它运行良好(与iOS非常相似)。然而,它只在某些设备中工作良好,在某些设备中动画速度相当慢。后来,我知道动画在不同的设备上可能会有所不同(例如:有些设备会更快,有些设备会更慢),所以我不能让它在所有Android设备上都类似。因此,我不使用
插值器
。我不知道我的测试是否完全是100%,但我希望这一经验对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>
这是一个幻灯片动画。

假设你有两项活动

  • 电影活动
  • 所有卡斯特活动
  • 点击一个按钮,就会发生这种情况

    您可以通过3个简单的步骤实现这一点 1)启用内容转换

    <?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>
    
    转到
    style.xml
    并添加此行以启用内容转换

    <item name="android:windowContentTransitions">true</item>
    
    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);
          ..........
      }
    }
    

    希望它对你有用

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

    谢谢-现在,当按back键返回到旧活动时,如何放置反向动画button@EmAe,我问了一个类似的问题,并在这里自己回答:。希望对你有帮助@如果可能的话,你能添加反向动画吗?我使用了以下代码:
    overridePendingTransition(android.R.anim.fade\u-in,android.R.anim.fade\u-out)您可以在或中看到这些示例。您也可以从中看到更多。我使用的是android 6华为,它的性能非常好。:)非常好。工作非常好。我们不需要加入所有的意图,这就是这种方法的优势。thans shohanI喜欢这种解决方案!把它放在一个地方,像一个魔咒一样在任何地方都能发挥作用!这是最好的解决办法。无需使用Java/Kotlin编写代码。只要放上这些XML文件,一切都很容易完成。这是一个神奇的解决方案,值得1000票的支持。你很少能找到像这样简单而优雅的解决方案。最重要的是,不需要难看的长代码,只需要简单的XML就可以了。请不要做这种延迟的活动启动!即使你的应用程序不再在前台,它也会启动你的主要活动。