如何在Android的应用两种活动之间的幻灯片动画?(How to apply slide anim

2019-06-23 19:18发布

我想实现从左侧滑动效果,权当我从一个活动移动到另一个。 对于我使用下面的代码,但我没有得到任何结果。 请指正。

在java中这两个文件:

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

两个文件在res /阿尼姆目录:

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>

Answer 1:

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


Answer 2:

在res /动画文件夹中添加这两种文件。

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

谱写的onCreate下面的代码(下一个活动的)方法,你经过的意图。

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


Answer 3:

您可以覆盖默认的活动动画比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文件夹下的动画文件夹,然后创建这四个动画文件到文件夹的动画:

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>

如果您遇到任何问题,那么你可以下载我从GitHub样本项目 。

谢谢



Answer 4:

幻灯片上/下与奥飞动漫有几注

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

完成

更多
我尽量让像iOS的动画幻灯片动画时存在的视图模型(这样https://www.youtube.com/watch?v=deZobvh2064 ),但失败了。

纵观目前的iOS动画,你会看到:从阿尔法(约50%),底部的动画,然后它去非常快,然后慢,动画时间约为> 500毫秒(我用修剪视频工具进行计算动画时间https://开头www.kapwing.com/trim-video所以不能确切地100%)

然后我尝试应用到Android。
为了使阿尔法我用<alpha>和成功。
为了使动画启动慢我使用更快android:interpolator="a decelerate interpolator" ,但它几乎失败。

有3个默认decelerate interpolator在Android中
@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因素室内用= 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设备类似的动画。 因此,我不使用interpolator 。 我不知道如果我的测试是完全100%或没有,但我希望这方面的经验帮助



Answer 5:

你可以使用overridePendingTransitionstartActivity代替onCreate 。 至少,这对我的作品!

看到一个完整的例子在这里 。 它包括(反向)动画onBackPressed,所以退回到以前的活动,同时! 在您的具体的例子(淡入和退房手续),可能是不必要的,但。



Answer 6:

滑盖动画可以通过调用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);

请参见活动过渡动画的例子更多的活动转变例子。



Answer 7:

科特林例如:

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


Answer 8:

这里是你幻灯片动画。

比方说,你有两个活动。

  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)启动活动意图

在你写这个方法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);
      ..........
  }
}


文章来源: How to apply slide animation between two activities in Android?