滑动层活动animationandroid

我想按照材料devise指南中的描述,为活动转换实现滑动层animation

材料转换

不过,我现在所能做的只是slide_in和stayanimation的简单组合,它不会给我一个叠层效果。 我怎样才能做到这一点?

我目前的实施:

在活动开始:

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

在活动closures:

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

Solutions Collecting From Web of "滑动层活动animationandroid"

我终于find了这个问题的解决scheme。 它工作完美无瑕。

在这个答案中使用的重要组件:

  • BackActivity =后台活动
  • FrontActivity =在前面滑动的活动
  • BackgroundView = FrontActivity中的基础ViewGroup

解决方法是在closuresFrontActivity之前将FrontActivity的布局animation化。 只有在布局中集成工具栏作为您的操作栏时,才可以这样做!

我将在这里复制我的代码。 我的animation是一个从底部向前滑动的活动,并且在上一个活动前滑落到底部。 您只需更改animation即可轻松获得任何方向的效果。


1)在BackActivity上滑动FrontActivity
从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时,在closuresFrontActivity之前,将FrontActivity的布局animation化!

我通过在我的onOptionsSelected()和我的onBackPressed()在FrontActivity中调用以下方法

 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在FrontActivityanimation后面可见。
我们需要为这个透明的主题。

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)在您的清单中将透明主题应用于FrontActivity:

AndroidManifest.xml中

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

5)因为你的活动现在是透明的,所以你需要为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> 

而已。 animation应该现在工作。


编辑

我find了一个不闪烁的解决scheme。 animation看起来完美无瑕。

closuresFrontActivity时,请调用finish来代替NavUtils.navigateUpFromSameTask(activity) 。 我在我的答案中改变了这一点。

您可以获得所描述的行为,只是覆盖活动之间的转换。 我还在背部活动中join淡化效果以改善其外观:

slide_in_right.xml

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

slide_out_right.xml

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

fade_back.xml

 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:duration="@android:integer/config_shortAnimTime" android:pivotX="50.0%" android:pivotY="50.0%" android:fromXScale="1.0" android:toXScale="0.9" android:fromYScale="1.0" android:toYScale="0.9"/> <alpha android:duration="@android:integer/config_shortAnimTime" android:fromAlpha="1.0" android:toAlpha="0.7"/> </set> 

fade_forward.xml

 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:duration="@android:integer/config_shortAnimTime" android:pivotX="50.0%" android:pivotY="50.0%" android:fromXScale="0.9" android:toXScale="1.0" android:fromYScale="0.9" android:toYScale="1.0"/> <alpha android:duration="@android:integer/config_shortAnimTime" android:fromAlpha="0.7" android:toAlpha="1.0"/> </set> 

ParentActivity.java

在您的活动中常见的父类中,可以包含可重用代码:

 /* Activity transitions */ protected void slideInTransition() { overridePendingTransition(R.anim.slide_in_right, R.anim.fade_back); } protected void slideOutTransition() { overridePendingTransition(R.anim.fade_forward, R.anim.slide_out_right); } 

然后在活动开始:

 startActivity(intent); slideInTransition(); 

对于后退过渡:

 @Override public void onBackPressed() { super.onBackPressed(); slideOutTransition(); }