我用的是什么:
activity_stay.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="0%p"
android:toYDelta="0%p" />
</set>
activity_slide_to_bottom.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator">
<translate
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="0"
android:toYDelta="100%p" />
</set>
activity_slide_from_bottom.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator">
<translate
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="100%p"
android:toYDelta="0" />
</set>
启动NewActivity:
startActivity(NewActivity.getIntent(this))
overridePendingTransition(R.anim.activity_slide_from_bottom, R.anim.activity_stay)
NewActivity finish():
finish()
overridePendingTransition(R.anim.activity_stay, R.anim.activity_slide_to_bottom)
启动NewActivity时,OldActivity会消失 - 我看到空白屏幕,NewActivity在其上方滑动到顶部。但是我需要的是我的NewActivity在启动时滑到OldActivity内容之上。我怎样才能做到这一点?
UPD :当我因某些原因完成NewActivity时,所有动画都会完美执行:NewActivity滑到底部,OldActivity内容显示在NewActivity内容之下。
答案 0 :(得分:13)
您可以使用以下代码实现动画:
bottom_up.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="1000"
android:fromYDelta="90%"
android:toYDelta="0" />
</set>
bottom_down.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="1500"
android:fromYDelta="5"
android:toYDelta="90%" />
</set>
nothing.xml:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromYDelta="0%p"
android:toYDelta="0%p" />
开始第二活动:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.bottom_up, R.anim.nothing);
第二次活动结束时:
@Override
public void onBackPressed() {
super.onBackPressed();
overridePendingTransition(R.anim.nothing, R.anim.bottom_down);
}
文档:
使用动画启动活动材料中的活动过渡 设计应用程序提供不同状态之间的可视连接 通过运动和常见元素之间的转换。您可以 为进入和退出过渡以及为 活动之间共享元素的过渡。
Enter过渡确定活动中的视图如何进入 现场。例如,在爆炸输入过渡中,视图输入 从外面看到场景,然后飞向中心 屏幕。退出过渡决定活动中的视图如何退出 现场。例如,在爆炸出口转换中,视图退出 远离中心的场景。
指定自定义过渡首先,启用窗口内容过渡 当您定义android:windowActivityTransitions属性时 从材质主题继承的样式。您还可以指定 在样式定义中输入,退出和共享元素转换:
<style name="BaseAppTheme" parent="android:Theme.Material"> <!-- enable window content transitions -->
<item name="android:windowActivityTransitions">true</item>
<!-- specify enter and exit transitions -->
<item name="android:windowEnterTransition">@transition/explode</item>
<item name="android:windowExitTransition">@transition/explode</item> </style>
请检查文档。 here
享受!
答案 1 :(得分:9)
activity_slide_from_bottom.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:fromYDelta="100%p"
android:toYDelta="0%p" />
activity_slide_to_bottom.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:fromYDelta="0%p"
android:toYDelta="100%p" />
activity_stay.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromYDelta="0%p"
android:toYDelta="0%p" />
启动NewActivity:
startActivity(NewActivity.getIntent(this));
overridePendingTransition(R.anim.activity_slide_from_bottom, R.anim.activity_stay)
NewActivity finish():
@Override
public void onBackPressed() {
super.onBackPressed();
overridePendingTransition(R.anim.activity_stay, R.anim.activity_slide_to_bottom);
}
此外,动画可以用样式声明
<style name="Animation.MyCustomAnimation" parent="android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/activity_slide_from_bottom</item>
<item name="android:activityOpenExitAnimation">@anim/activity_stay</item>
<item name="android:activityCloseEnterAnimation">@anim/activity_stay</item>
<item name="android:activityCloseExitAnimation">@anim/activity_slide_to_bottom</item>
</style>
在主题中设置此样式:
<style name="Theme.MyAnimTheme" parent="YourThemeParent">
<item name="android:windowAnimationStyle">@style/Animation.MyCustomAnimation</item>
</style>
将主题设置为清单中的活动
<activity
android:name=".NewActivity"
android:theme="@style/Theme.MyCustomTheme" />
android:activityOpenEnterAnimation
打开新活动时,这是在 下一个活动(正在进入屏幕)
android:activityOpenExitAnimation
打开新活动时,这是在 上一个活动(正在退出屏幕)。
android:activityCloseEnterAnimation
关闭当前活动时,这是运行的动画 在下一个活动(正在进入屏幕)上。
android:activityCloseExitAnimation
关闭当前活动时,这是运行的动画 当前活动(正在退出屏幕)上。
android:windowReenterTransition
参考Transition XML资源,该资源定义了用于 从先前启动的视图返回时将视图移入场景 活动。对应于
Window.setReenterTransition(android.transition.Transition).
android:windowReturnTransition 引用用于定义所需过渡的过渡XML资源,该过渡用于将视图移出 窗口准备关闭时的场景。对应于
Window.setReturnTransition(android.transition.Transition).
答案 2 :(得分:3)
根据文档:
public void overlayPendingTransition(int enterAnim, int exitAnim) 在调用startActivity(Intent)或finish()中的一种之后立即调用,以指定要执行的显式过渡动画。
从Build.VERSION_CODES.JELLY_BEAN开始,将其与开始活动一起使用的替代方法是通过ActivityOptions捆绑包向startActivity(Intent,Bundle)或相关功能提供所需的动画信息。这样,即使从当前热门活动的上下文之外开始活动,也可以指定自定义动画。
这意味着仅在overridePendingTransition(R.anim.activity_stay, R.anim.activity_slide_to_bottom)
之后添加startActivity(Intent, Bundle)
应该会提供所需的结果。
编辑:
android:activityOpenEnterAnimation android:activityOpenExitAnimation android:activityCloseEnterAnimation android:activityCloseExitAnimation
影响活动
android:windowEnterTransition android:windowExitAnimation android:windowReenterTransition android:windowReturnTransition
影响窗口
有关活动与窗口的更多信息:
活动具有一个窗口(在其中绘制其用户界面)
一个窗口具有一个Surface和一个附加的视图层次结构,
一个包含视图的Surface包含ViewGroup。
最后,您可以使用它们来获得相同的结果,但是它们是不同的。
答案 3 :(得分:3)
对于您要完成的工作,我认为Animations API比Transitions API更可取。这是详细的说明: https://www.reddit.com/r/androiddev/comments/8wqjzv/difference_between_animation_and_transitions_api/
答案 4 :(得分:1)
尝试下面,
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="100%p"
android:toYDelta="0%p" />
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="0%p"
android:toYDelta="100%p" />
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromYDelta="0%p"
android:toYDelta="0%p" />
启动NewActivity:
startActivity(NewActivity.getIntent(this))
overridePendingTransition(R.anim.slide_in_up, R.anim.no_anim);
NewActivity finish():
finish();
overridePendingTransition(R.anim.no_anim, R.anim.slide_out_down);
答案 5 :(得分:1)
最好的方法是使用样式,因为您不必在每个活动中都进行编码,以防万一您希望在所有活动中都使用此动画。
我一直使用的最短方式
在所有活动中设置幻灯片主题
ConvertUtils.register(new Converter() {
@Override
public <T> T convert(Class<T> type, Object value) {
// TODO
return null;
}
}, JAXBElement.class);
要在一项活动中设置幻灯片主题
<application
android:theme="@style/Theme.SlideAnimWindow"
...
>
将 slide_from_bottom.xml 放入您的动画中。
<activity
android:name=".YourActivity"
android:theme="@style/Theme.SlideAnimWindow" />
将 slide_to_bottom.xml 放入 res 动画中。
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="100%p"
android:toYDelta="0%p" />
将 none.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:fromYDelta="0%p"
android:toYDelta="100%p" />
将此样式放入 res> values> styles.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromYDelta="0%p"
android:toYDelta="0%p" />
您可以根据需要更改<style name="SlideAnimation" parent="android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/slide_from_bottom</item>
<item name="android:activityOpenExitAnimation">@anim/none</item>
<item name="android:activityCloseEnterAnimation">@anim/none</item>
<item name="android:activityCloseExitAnimation">@anim/slide_to_bottom</item>
</style>
<style name="Theme.SlideAnimWindow" parent="AppTheme">
<item name="android:windowAnimationStyle">@style/SlideAnimation</item>
</style>
的持续时间。
现在您可以走了。