我要按照 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" />
最佳答案
我终于找到了解决这个问题的方法。它的工作无懈可击。
此答案中使用的重要组件:
解决方案是在关闭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/