滑动层活动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" /> 

  • animation列表视图数据更改
  • 滑动和滑动布局与animationandroid
  • 像及时闹钟应用程序的animation背景
  • Android 2.2上的CSS3animation闪烁(webkit-transform:同时翻译(..)scale(..))
  • Android谷歌地图v2相机animation
  • 使用自定义animation显示活动
  • AlphaAnimation不起作用
  • 用DrawerLayout打开Activity时如何消除延迟?
  • 我终于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(); }