android - 滑动层 Activity 动画android

标签 android animation material-design

我想按照 Material Design 指南中的描述为 Activity 转换实现滑动层动画。

Material Transition

但是,我现在所能做的就是简单地组合 slide_in 和停留动画,这并没有给我一种堆叠层的效果。我怎样才能实现它?

我当前的实现:

Activity 开始时:

activity.overridePendingTransition(R.anim.slide_in_right, R.anim.stay);

Activity 结束时:

activity.overridePendingTransition(R.anim.stay, R.anim.slide_out_right);

slide_in_right.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator">
    <translate
        android:fromXDelta="100%p"
        android:toXDelta="0"
        android:duration="@android:integer/config_shortAnimTime" />
</set>

slide_out_right.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator">
    <translate
        android:fromXDelta="0"
        android:toXDelta="100%p"
        android:duration="@android:integer/config_shortAnimTime" />
</set>

stay.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_shortAnimTime"
    android:fromYDelta="0%p"
    android:toYDelta="0%p" />

最佳答案

我终于找到了解决这个问题的方法。它完美无缺。

此答案中使用的重要组件:

  • BackActivity = 后台 Activity
  • FrontActivity = 滑到前面的 Activity
  • BackgroundView = FrontActivity 中的基础 ViewGroup

解决方案是在关闭 FrontActivity 之前将 FrontActivity 的布局动画化。 这只有在您使用布局中集成的工具栏作为操作栏时才有可能!

我会在这里复制我的代码。我的动画是一个从底部滑到前面的 Activity ,然后再次滑出到前一个 Activity 前面的底部消失。只需更改动画,您就可以轻松地在任何方向上获得这种效果。


1) 将 FrontActivity 滑到 BackActivity 上
从 BackActivity 启动 FrontActivity 时只需调用 overridePendingTransition

Intent intent = new Intent(activity, FrontActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_bottom, 0);

slide_in_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="100%p"
    android:toYDelta="0%p"
    android:duration="@android:integer/config_mediumAnimTime"
    android:interpolator="@android:anim/decelerate_interpolator">
</translate>

2) 从 FrontActivity 返回到 BackActivity 时,在关闭 FrontActivity 之前从 FrontActivity 输出动 Canvas 局!

我通过在 onOptionsSelected() 和 FrontActivity 中的 onBackPressed() 中调用以下方法来做到这一点

private void animateOut() {
    Animation slideAnim = AnimationUtils.loadAnimation(this,R.anim.slide_out_bottom);
    slideAnim.setFillAfter(true);;
    slideAnim.setAnimationListener(new AnimationListener() {
        public void onAnimationStart(Animation paramAnimation) { }
        public void onAnimationRepeat(Animation paramAnimation) { }
        public void onAnimationEnd(Animation paramAnimation) { 
            finish();
            // if you call NavUtils.navigateUpFromSameTask(activity); instead, 
            // the screen will flicker once after the animation. Since FrontActivity is 
            // in front of BackActivity, calling finish() should give the same result.
            overridePendingTransition(0, 0);
        }
    });
    BackgroundView.startAnimation(slideAnim);
}

slide_out_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="0%p"
    android:toYDelta="100%p"
    android:duration="@android:integer/config_mediumAnimTime"
    android:interpolator="@android:anim/accelerate_interpolator">
</translate>

3) 现在我们必须确保 BackActivity 在动画结束时在 FrontActivity 后面可见。
为此,我们需要使用透明主题。

styles.xml

<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- your theme -->
    </style>

    <style name="Theme.Transparent" parent="AppTheme">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>

</resources>

4) 将透明主题应用于 list 中的 FrontActivity:

AndroidManifest.xml

<activity
      android:name=".FrontActivity"
      android:theme="@style/Theme.Transparent"
      android:parentActivityName=".BackActivity" />

5) 由于您的 Activity 现在是透明的,因此您需要向 BackgroundView 添加背景。 标准背景是:

android:background="@android:color/background_light"
android:background="@android:color/background_dark"

front_activity.xml

<?xml version="1.0" encoding="utf-8"?>

<!-- This is BackgroundView and can be any ViewGroup -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:background="@android:color/background_light" >

    <android.support.v7.widget.Toolbar
        android:layout_height="@dimen/height_toolbar"
        android:layout_width="match_parent"
        android:minHeight="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    <!-- rest of layout -->

</FrameLayout>

就是这样。动画现在应该可以运行了。


编辑

我找到了一个不闪烁的解决方案。动画看起来完美无瑕。

关闭 FrontActivity 时,调用 finish 而不是 NavUtils.navigateUpFromSameTask(activity)。我已经在我的回答中改变了这一点。

关于android - 滑动层 Activity 动画android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27482865/

相关文章:

Android 媒体记录器启动失败

ios - WatchKit 基本文本动画

javascript - 如何使用 jQuery 切换和动画使外部 div 在单击时从左侧进入,在 ri-click 时转到右侧?

android - 是否可以向 MaterialDateRange Picker 添加页脚?

android - 如何用 RecyclerView 实现无限列表?

android - Android 相机的 Mime 类型 PreviewFormat

java - "new"Java(Android) 中的关键字 :D

android - 如何在位图中获取签名图像

css - 如何停止 CSS 关键帧动画?

Android L Preview Material 风格的标签