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

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

在 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

<?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>
160708 次浏览
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);
}

将这两个文件添加到 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);

enter image description here

您可以覆盖您的默认活动动画,并且它比覆盖 PendingTransfer 执行得更好。我使用的这个解决方案适用于每个 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 _ 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 _ 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 的示例项目

谢谢

你可以在 startActivity中使用 overridePendingTransition而不是 onCreate。至少,对我来说是这样的!

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

幻灯片动画可以通过调用 overridePendingTransfer 和传递进入和退出活动的动画资源来应用于活动转换。

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

往上滑

<?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.slidedown,R.anim.slideup) ;

有关更多活动转换示例,请参见 活动过渡动画示例

使用 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 _ anime.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 现在的动画你会看到: 动画从底部的 alpha (约50%) ,然后它去非常快,然后慢,动画时间大约 > 500毫秒(我使用修剪视频工具来计算动画时间 Https://www.kapwing.com/trim-video ,所以不能完全100%)

然后我尝试申请机器人。
为了制作 alpha,我使用 <alpha>和成功。
为了使动画启动比较慢,我使用 android:interpolator="a decelerate interpolator",但它几乎失败。

在 Android 中有3个默认的 decelerate interpolator
@android:interpolator/decelerate_quad-> 因子 = 1
@android:interpolator/decelerate_cubic-> 因子 = 1.5
因子 = 2.5
(较高的因子 < = > 动画开始时速度较快,结束时速度较慢)
这里有一个很好的教程
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" />

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

科特林的例子:

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

这里有一个幻灯片动画给你。

enter image description here

假设你有两个活动。

  1. 电影详情活动
  2. AllCastActivity

只要点击一下按钮,就会发生这种情况。

enter image description here

您可以通过三个简单的步骤来实现这一点

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()方法之前,否则动画将无法工作。
所以你的 ABC 应该是这样的

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