Я наконец-то нашел решение для этого вопроса. Он работает безупречно.
важные компоненты, используемые в этом ответе:
- 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)
. Я изменил это в своем ответе.
Где проблема с этой реализацией? – TheRedFox
@gauravsapiens вы нашли hte ответ для этого? –