活动动画从底部滑动

时间:2018-03-30 08:40:19

标签: android android-activity android-animation android-xml android-transitions

我用的是什么:

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内容之下。

6 个答案:

答案 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

enter image description 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).

参考: https://developer.android.com/reference/android/R.attr

答案 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。

来源:What is an Android window?

最后,您可以使用它们来获得相同的结果,但是它们是不同的。

答案 3 :(得分:3)

对于您要完成的工作,我认为Animations API比Transitions API更可取。这是详细的说明: https://www.reddit.com/r/androiddev/comments/8wqjzv/difference_between_animation_and_transitions_api/

答案 4 :(得分:1)

尝试下面,

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

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

no_anim.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.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> 的持续时间。 现在您可以走了。