我要按照 Material 设计指南中的描述,为 Activity 过渡实现滑动层动画。

但是,到目前为止,我所能做的就是将slide_in和Stay动画简单地组合在一起,而这并没有给我带来叠加的效果。我该如何实现?

我当前的实现:

在 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 从底部向前滑动,而消失在上一个 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动画出布局!

    我是通过在FrontActivity中的onOptionsSelected()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/

    10-11 23:24