Подтвердить что ты не робот

Сделать анимацию активности сверху донизу

Я пишу приложение для 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();
}
4b9b3361

Ответ 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);

}