2014-12-15 6 views
8

Я хочу реализовать анимацию скольжения для перехода активности, как описано в руководстве по разработке материалов.Активность анимации анимации скольжения

Material Transition

Однако, все, что я мог бы сделать сейчас это простое сочетание slide_in и остаться анимации, который не дает мне многослойный слой такого эффекта. Как я могу это достичь?

Моя текущая реализация:

На активность Старт:

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

На активность Закрыть:

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

Где проблема с этой реализацией? – TheRedFox

+1

@gauravsapiens вы нашли hte ответ для этого? –

ответ

6

Я наконец-то нашел решение для этого вопроса. Он работает безупречно.

важные компоненты, используемые в этом ответе:

  • BackActivity = фоновая активность
  • FrontActivity = активность, которая скользит перед
  • BackgroundView = базовая ViewGroup в вашем FrontActivity

решение заключается в анимировании макета FrontActivity перед закрытием FrontActivity. Это возможно только в том случае, если вы используете панель инструментов, встроенную в ваш макет, в качестве панели действий!

Я скопирую код здесь. Моя анимация - это активность, которая скользит спереди снизу, а затем исчезает снова, выгибаясь на дно перед предыдущим действием. Вы можете легко получить этот эффект в любом направлении, просто изменив анимацию.


1) Авто FrontActivity в течение BackActivity
Просто позвоните overridePendingTransition при запуске FrontActivity из BackActivity.

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!

Я сделал это, вызвав следующий метод в моем 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 видна за 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) Нанести прозрачную тему для 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> 

Вот так. Теперь анимация должна работать.


EDIT

Я нашел решение, которое не мерцает. Анимация выглядит безупречно.

При закрытии FrontActivity звоните finish вместо NavUtils.navigateUpFromSameTask(activity). Я изменил это в своем ответе.

+0

Awesome !! Хорошо работает. Не забывайте ** удалять 'super.onBackPress();' ** из события back key. Это блокировало анимацию для меня. – Mangesh

+1

любая идея о том, как сделать тень для 'FrontActivity'? – Mangesh

4

Вы можете получить описанное поведение, просто переопределяя переход между действиями. У меня также есть эффект усадки на задней стороне для улучшения его внешнего вида:

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); 
} 

Тогда на активность Start:

startActivity(intent); 
slideInTransition(); 

Для заднего хода:

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    slideOutTransition(); 
} 
Смежные вопросы