Как сохранить состояние активности после анимации при повороте экрана?

avatar
umbasa07
8 апреля 2018 в 03:44
370
1
0

Так, например, я использую объектный аниматор, чтобы изменить альфа кнопки на 0, а затем я поворачиваю экран, после чего он возвращается в предварительно анимированное состояние, потому что снова вызывается onCreate. Я думал, что должен реализовать что-то вроде прослушивателя анимации, и в конце анимации я должен изменить свойства кнопки, но я не уверен, как это сделать. Например, если у меня есть макет ограничения, и я переместил кнопку на 100 пикселей вверх, какой код должен быть в прослушивателе анимации, чтобы изменение оставалось после окончания анимации. Я читал что-то о том, чтобы установить значение fill after tag как true, но я считаю, что это для анимации просмотра.

Спасибо за помощь.

Источник
krishank Tripathi
8 апреля 2018 в 04:34
0

просто добавьте android:configChanges="orientation" в свой манифест в действии, в котором вы хотите сохранить состояние

umbasa07
8 апреля 2018 в 04:57
0

@krishankTripathi везде, где я читал большинство разработчиков Google, они не одобряют сохранение активности при ротации для сохранения состояния. См. это

Ответы (1)

avatar
Cvarier
8 апреля 2018 в 04:45
0

Для описанного вами приложения вы можете использовать ValueAnimator и установить для него AnimatorUpdateListener для записи состояния после каждого кадра анимации.

Чтобы прослушивать изменения ориентации и сохранять состояние анимации, вы должны сначала включить android:configChanges="orientation" в тег <activity> вашего манифеста. Это гарантирует, что ваша активность не будет воссоздана при изменении ориентации и что onCreate() не будет вызываться снова. Всякий раз, когда происходит изменение ориентации, будет вызываться onConfigurationChanged(), поэтому вы должны переопределить его, чтобы сохранить состояние анимации.

Итак, в вашем onCreate() вы могли бы сделать что-то вроде:

ValueAnimator valueAnimator = ValueAnimator.ofObject(new IntEvaluator(),
                            initialPosition, finalPosition);
valueAnimator.setDuration(duration);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        // mCurrentPosition should be a member variable 
        mCurrentPosition = (int)animation.getAnimatedValue();
        // Update the position of your button with currentPosition
    }
}
valueAnimator.start();

и ваш onConfigurationChanged() должен выглядеть так:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.your_layout);      
    // Set the position of your button with mCurrentPosition
}

Для получения дополнительной информации см. https://developer.android.com/reference/android/animation/ValueAnimator.html и https://developer.android.com/guide /topics/resources/runtime-changes.html.

umbasa07
8 апреля 2018 в 05:00
1

Но в большинстве статей (см. this и this) прямо указано, что не следует сохранять состояние активности с помощью android:configChanges="orientation"

Cvarier
8 апреля 2018 в 05:14
0

Хорошо, если вы хотите полностью избежать этого, вы можете сохранить состояние анимации в SharedPreferences, а затем восстановить состояние, загрузив настройку в onCreate().

umbasa07
8 апреля 2018 в 05:39
0

Хорошо, это должно сработать, спасибо. Хотя я ожидал, что мне придется сделать что-то вроде динамического изменения параметров макета.

Cvarier
8 апреля 2018 в 05:42
0

Если вы динамически меняете положение кнопки, вам обязательно нужно будет изменить параметры макета. Посетите coderhelper.com/a/31673553/2671503 для получения подробной информации.

umbasa07
8 апреля 2018 в 05:53
0

Не рекомендуется ли в этом случае использование компоновки ограничений, потому что ограничения будут испорчены?

Cvarier
8 апреля 2018 в 06:03
0

Можно использовать ConstraintLayout, но тогда вам нужно будет использовать ConstraintSet. См. это: coderhelper.com/a/44361279/2671503