简单来说就是在当前 Activity 的标题栏左上角加一个返回按钮,点击后自动返回设置的 Activity 而不是回到之前的 Task。
比如为 TestActivity 设置:
<activity android:name=".TestActivity"
android:parentActivityName=".MainActivity"/>
则点击左上角的返回图标后将自动回到 MainActivity。
关于 android:parentActivityName 详见 官方文档
然而,在设置该属性后我发现系统在 Activity 切换时的过渡动画似乎有点不对劲。
首先看图:
为了更好的演示切换时的过渡动画,我把 过渡动画缩放 设置为了 5X 。
可以看到,正常的进入 Activity 应该是新 Activity 从右往左进入并逐渐覆盖当前Activity。
点击返回后应该是当前 Activity 从左往右退出,并逐渐显露出上层 Activity。
例如:图中的点击进入 设置界面 和退出 设置界面。
但是,通过在 AndroidManifest 中为 Activity 添加 android:parentActivityName 的方法来返回上层时却是上层 Activity 从右往左进入并覆盖当前 Activity,而非正常的当前 Activity 从左往右退出。
例如:图中点击进入 关于界面 后退出。
通过以上分析不难得出结论,使用 android:parentActivityName 并非是 finish 当前 Activity 后返回上层,而是新建一个上层 Activity 来覆盖当前 Activity。
查询资料得知
所以系统在的过渡动画给出的是进入 Activity 的动画而非退出动画,怪不得总觉得看起来怪怪的。
我个人的解决方案是手动设置 Toolbar,并添加返回按钮:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
getSupportActionBar().setDisplayHomeAsUpEnabled(true)
然后继承 onOptionsItemSelected ,当点击 返回 按钮时手动 finish :
if (id ==android.R.id.home) {
finish()
}
这样虽然麻烦了点,但至少动画看起来顺眼了点......
如果各位大佬还有更好的方法欢迎指教~
PS:我没有刻意去设置切换 Activity 的动画,都是用的系统默认的过渡动画,所以可能不同的 ROM 动画效果不一样(比如我截图中的 MIUI 是左右滑出滑入,我使用原生安卓测试是上下滑出滑入),但实质都是一样的。
PPS:写完才发现原来文档里用的本来就是 “启动” 而非 “返回” Activity......所以说,就因为没好好看文档折腾了这么久......
首先定义好acitivity切换的动画<style name="FeelyouWindowAnimTheme" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/in_from_left</item>
<item name="android:activityOpenExitAnimation">@anim/out_from_right</item>
<item name="android:activityCloseEnterAnimation">@anim/in_from_right</item>
<item name="android:activityCloseExitAnimation">@anim/out_from_left</item>
</style>
注意需要继承自 @android:style/Animation.Activity。
4个属性的意思:
假设我们有 2 个 Activity,分别是 A1 和 A2:
当我们从 A1 启动 A2 时,A1 从屏幕上消失,这个动画叫做 android:activityOpenExitAnimation
当我们从 A1 启动 A2 时,A2 出现在屏幕上,这个动画叫做 android:activityOpenEnterAnimation
当我们从 A2 退出回到 A1 时,A2 从屏幕上消失,这个叫做 android:activityCloseExitAnimation
当我们从 A2 退出回到 A1 时,A1 出现在屏幕上,这个叫做 android:activityCloseEnterAnimation
定义具体的动画文件
anim/out_from_right.xml
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="100%p"
android:toYDelta="0" >
</translate>
anim/in_from_left.xml
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromXDelta="-100%p"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="0" >
</translate>
anim/out_from_left.xml
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="-100%p"
android:toYDelta="0" >
</translate>
anim/in_from_right.xm
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromXDelta="100%p"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="0" >
</translate>
最后设定activity的主题的android:windowAnimationStyle
<style name="AnimActivityTheme">
<item name="android:windowAnimationStyle">@style/FeelyouWindowAnimTheme</item>
</style>
注意两个activity都需要应用相同动画主题
<activity
android:name="com.test..A1"
android:theme="@style/AnimActivityTheme" >
</activity>
<activity
android:name="com.test.A2"
android:theme="@style/AnimActivityTheme" >
</activity>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)