Сделать анимацию активности сверху донизу
Я пишу приложение для Android, где хочу, чтобы активность отображалась, анимировав ее в нижней части экрана вверх. Я могу сделать это с кодом отсюда:
Тем не менее, я не могу сделать анимацию наоборот, в которой активность исчезла бы, скользя от верхней части к нижней части экрана.
Я использовал код в приведенной выше ссылке; активность появляется при движении вверх, но при ее исчезновении она исчезает, а не скользит на дно.
Я даже попытался поместить код в onCreate()
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
overridePendingTransition(R.anim.appear_from_bottom, R.anim.disappear_to_bottom);
setContentView(R.layout.activity_all_metadata_display);
initializePage();
}
Ответы
Ответ 1
Вам нужно определить анимацию "слайд-шоу" из связанного вопроса и некоторые новые анимации "сползания вниз", которые обращают вспять процесс.
Важными частями анимаций, которые нужно посмотреть, являются значения fromYDelta
и toYDelta
. Они определяют Y-позиции (верхней части вашего представления) в начале и конце анимации.
slide_in_up.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="100%p"
android:toYDelta="0%p" />
slide_out_up.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="0%p"
android:toYDelta="-100%p" />
slide_in_down.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="-100%p"
android:toYDelta="0%p" />
slide_out_down.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="0%p"
android:toYDelta="100%p" />
Для анимации "слайд-шоу" вы должны переопределить ожидающий переход в вашем методе onResume()
следующим образом:
protected void onResume()
{
super.onResume();
overridePendingTransition(R.anim.slide_in_up, R.anim.slide_out_up);
}
Для анимации "сползания вниз" сделайте что-то подобное в методе onPause()
:
protected void onPause()
{
super.onPause();
overridePendingTransition(R.anim.slide_in_down, R.anim.slide_out_down);
}
В некоторых учебниках предлагается использовать неправильные методы жизненного цикла:
-
onCreate()
не вызывается каждый раз, когда отображается действие.
-
onDestroy()
не вызывается каждый раз, когда действие удаляется.
Скорее используйте методы, которые вызывается каждый раз, когда происходит переход экрана:
-
onResume()
вызывается, когда активность отображается пользователю
-
onPause()
вызывается, когда действие будет удалено.
Для получения дополнительной информации об этих методах, посетите сайт разработчика Android:
Когда ваш экран будет отображаться, он будет скользить снизу.
Когда отобразится новый экран, ваш экран вернется вниз.
Ответ 2
Два способа сделать это:
1. Использование стилей
Предполагая, что вы хотите реализовать это для всех действий, в базовой теме укажите следующую запись:
<item name="android:windowAnimationStyle">@style/ActivityAnimations</item>
Затем определите следующий стиль:
<style name="ActivityAnimations" parent="android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/appear_from_bottom</item>
<item name="android:activityOpenExitAnimation">@anim/hold</item>
<item name="android:activityCloseEnterAnimation">@anim/hold</item>
<item name="android:activityCloseExitAnimation">@anim/disappear_to_bottom</item>
</style>
Где @anim/hold
может быть что-то вроде этого:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false" >
<translate
android:duration="1000"
android:zAdjustment="bottom" />
</set>
2. Использование overridePendingTransition()
Завершить завершение():
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.hold, R.anim.disappear_to_bottom);
}
Переопределить onBackPressed():
@Override
public void onBackPressed() {
finish();
}
Переопределить onOptionsItemSelected():
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
Ответ 3
В основном файле xml. Добавьте идентификатор корневого тега и передайте его функции. как
/** The Constant ANIM_NO. */
public static final int ANIM_NO = 0;
public static void topToDown(Context context, View target, int type,
int duration) {
if (type == UtilityAnimations.ANIM_NO) {
UtilityAnimations.topToDown(context, target, duration);
} else {
final Animation animation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, -1.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
animation.setDuration(duration != 0 ? duration
: UtilityAnimations.DURATION_MEDIAM);
animation.setInterpolator(UtilityAnimations.getInterpolator(
context, type));
target.startAnimation(animation);
}
}
Ответ 4
вы можете вместо своего перехода переопределить переход в своем onPause():
@Override
protected void onPause()
{
super.onPause();
overridePendingTransition(R.anim.appear_from_bottom, R.anim.disappear_to_bottom);
}