【问题标题】:Activity animation slide from bottom活动动画从底部滑动
【发布时间】:2018-09-09 07:17:36
【问题描述】:

我用什么:

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>

开始新活动:

startActivity(NewActivity.getIntent(this))
overridePendingTransition(R.anim.activity_slide_from_bottom, R.anim.activity_stay)

NewActivity 完成():

finish()
overridePendingTransition(R.anim.activity_stay, R.anim.activity_slide_to_bottom)

当 NewActivity 启动时,OldActivity 消失 - 我看到空白屏幕上方 NewActivity 滑到顶部。但是我需要的是我的 NewActivity 在启动时滑到 OldActivity 内容的顶部。我怎样才能做到这一点?

UPD:当我因为某些原因完成我的 NewActivity 时,所有动画都能完美执行:NewActivity 滑到底部,OldActivity 内容显示在 NewActivity 内容下方。

【问题讨论】:

  • 尝试使用相同的逗留时间@android:integer/config_longAnimTime
  • @JyotiJK 感谢您的回答,我试过了,但没有帮助。
  • 这个链接显示了为什么你应该为过渡动画选择正确的循环stackoverflow.com/a/23752530/9287163
  • 如果您希望整个应用程序的转换工作,您可以创建一个 rootacivity 并在您需要的活动中继承它。见例子stackoverflow.com/a/20188089/9287163
  • 如果你想使用你的方法只尝试覆盖你的完成方法并添加一个条件是完成检查并通过你的 overidependingtranstion() 方法我几乎认为这可能有效但你可以尝试

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


【解决方案1】:

您可以使用以下代码实现动画:

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

文档:

使用动画开始一个活动 活动在材料中的过渡 设计应用程序提供不同状态之间的视觉连接 通过共同元素之间的运动和转换。你可以 为进入和退出过渡指定自定义动画以及 活动之间共享元素的转换。

进入转换决定了活动中的视图如何进入 场景。例如,在爆炸进入过渡中,视图进入 从外面的场景飞向中心 屏幕。退出转换确定活动中的视图如何退出 现场。例如,在爆炸退出过渡中,视图退出 远离中心的场景。

指定自定义转场首先,启用窗口内容转场 当你定义一个 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

享受!!

【讨论】:

  • android:activityOpenEnterAnimation android:activityOpenExitAnimation android:activityCloseEnterAnimation android:activityCloseExitAnimation 和 android:windowEnterTransition android:windowExitAnimation android:windowReenterTransition android:windowReturnTransition 什么时候应该使用一个而不是另一个?跨度>
【解决方案2】:

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

开始新活动:

startActivity(NewActivity.getIntent(this));
overridePendingTransition(R.anim.activity_slide_from_bottom, R.anim.activity_stay)

NewActivity 完成():

@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

对定义所需转换的转换 XML 资源的引用,用于 从先前开始的返回时将视图移动到场景中 活动。对应于 Window.setReenterTransition(android.transition.Transition).

android:windowReturnTransition 对定义所需转换的转换 XML 资源的引用,用于 > 将视图移出 窗口准备关闭时的场景。对应于 Window.setReturnTransition(android.transition.Transition).

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

【讨论】:

  • android:activityOpenEnterAnimation android:activityOpenExitAnimation android:activityCloseEnterAnimation android:activityCloseExitAnimation 和 android:windowEnterTransition android:windowExitAnimation android:windowReenterTransition android:windowReturnTransition 什么时候应该使用一个而不是另一个?跨度>
【解决方案3】:

根据文档:

public void overridePendingTransition (int enterAnim, int exitAnim) 在 startActivity(Intent) 或 finish() 风格之一之后立即调用,以指定接下来要执行的显式过渡动画。

从 Build.VERSION_CODES.JELLY_BEAN 开始,在启动活动时使用它的替代方法是通过 ActivityOptions 捆绑包向 startActivity(Intent, Bundle) 或相关函数提供所需的动画信息。即使从当前顶级活动的上下文之外启动活动,这也允许您指定自定义动画。

这意味着只需在startActivity(Intent, Bundle) 之后添加overridePendingTransition(R.anim.activity_stay, R.anim.activity_slide_to_bottom) 应该会给出所需的结果。

编辑:

android:activityOpenEnterAnimation android:activityOpenExitAnimation android:activityCloseEnterAnimation android:activityCloseExitAnimation

影响活动

android:windowEnterTransition android:windowExitAnimation android:windowReenterTransition android:windowReturnTransition

影响窗口

有关活动与窗口的更多信息:

一个 Activity 有一个窗口(它在其中绘制它的用户界面),

一个窗口有一个 Surface 和一个附加的视图层次结构,

Surface 包含 ViewGroup,其中包含视图。

来源:What is an Android window?

总而言之,您可以使用它们来实现相同的结果,但它们是不同的。

【讨论】:

  • android:activityOpenEnterAnimation android:activityOpenExitAnimation android:activityCloseEnterAnimation android:activityCloseExitAnimation 和 android:windowEnterTransition android:windowExitAnimation android:windowReenterTransition android:windowReturnTransition 什么时候应该使用一个而不是另一个?跨度>
【解决方案4】:

对于您要完成的任务,我认为动画 API 比转换 API 更可取。这是一个详细的解释: https://www.reddit.com/r/androiddev/comments/8wqjzv/difference_between_animation_and_transitions_api/

【讨论】:

    【解决方案5】:

    最好的方法是使用样式,因为如果您希望在所有 Activity 中都使用此动画,则不必在每个 Activity 中编写代码。

    我总是使用的最短路径

    在所有活动中设置幻灯片主题

    <application
        android:theme="@style/Theme.SlideAnimWindow"
        ...
        >
    

    在一个活动中设置幻灯片主题

    <activity
        android:name=".YourActivity"
        android:theme="@style/Theme.SlideAnimWindow" />
    

    slide_from_bottom.xml 放入您的 res>anim

    <?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_to_bottom.xml 放入您的 res>anim

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

    none.xml 放入您的 res>anim

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

    将此样式放入 res>values>styles.xml

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

    您可以根据需要更改android:duration="@android:integer/config_longAnimTime" 持续时间。 现在你可以开始了。

    【讨论】:

      【解决方案6】:

      试试下面,

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

      开始新活动:

      startActivity(NewActivity.getIntent(this))
      overridePendingTransition(R.anim.slide_in_up, R.anim.no_anim);
      

      NewActivity 完成():

      finish();
      overridePendingTransition(R.anim.no_anim, R.anim.slide_out_down);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-22
        • 2019-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-10
        • 1970-01-01
        相关资源
        最近更新 更多