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

Как получить право на левую анимацию, чтобы начать работу

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

left_to_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate android:fromXDelta="-100%" android:toXDelta="0%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="500"/>
</set>

right_to_left.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:duration="500"
        android:fromXDelta="0%"
        android:fromYDelta="0%"
        android:toXDelta="100%"
        android:toYDelta="0%" />
</set>

Я начинаю с activity следующим образом

startActivity(new Intent(this, LoginActivity.class));
overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left);

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

Спасибо заранее.

4b9b3361

Ответ 1

Сделайте эти изменения в ваших файлах анимации:

enter.xml:

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:duration="500"
        android:fromXDelta="100%"
        android:fromYDelta="0%"
        android:toXDelta="0%"
        android:toYDelta="0%" />
</set>

exit.xml:

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:duration="500"
        android:fromXDelta="0%"
        android:fromYDelta="0%"
        android:toXDelta="-100%"
        android:toYDelta="0%" />
</set>

У вас будет вторая активность, скользящая справа налево.

Для лучшего понимания того, как играть с значениями fromXDelta и toXDelta для анимаций, приведена очень базовая иллюстрация значений: Activity transition values on X axis

Таким образом, вы можете легко понять, почему вы добавляете android: fromXDelta = "0%" и android: toXDelta = "- 100%" для вашей текущей деятельности. И это потому, что вы хотите, чтобы он переместился с 0% до -100%.

[EDIT]

Итак, если вы хотите открыть ActivityB из ActivityA, вы выполните следующее (скажем, у вас есть кнопка):

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(ActivityA.this, ActivityB.class));
            overridePendingTransition(R.anim.enter, R.anim.exit);
        }
    });

Теперь, если вы хотите иметь "обратную" анимацию первого, когда вы покидаете Activity B, вам понадобятся 2 новых файла анимации и некоторый код в методе ActivityB onBackPressed, например:

Сначала файлы анимации: left_to_right.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:duration="500"
        android:fromXDelta="-100%"
        android:fromYDelta="0%"
        android:toXDelta="0%"
        android:toYDelta="0%" />
</set>

right_to_left.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:duration="500"
        android:fromXDelta="0%"
        android:fromYDelta="0%"
        android:toXDelta="100%"
        android:toYDelta="0%" />
</set>

И в ActivityB сделайте следующее:

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left);
}

Также, если вы включили навигацию, вам также нужно добавить анимацию:

Вы активируете навигацию типа ВВЕРХ:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

И так вы обрабатываете анимацию в этом случае:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar Up/Home button
    case android.R.id.home:
       //NavUtils.navigateUpFromSameTask(this);
       finish();
       overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left);
       return true;
    }
    return super.onOptionsItemSelected(item);
}

Также имейте в виду, что даже если ваш код в порядке, ваш телефон может отключить анимацию. Чтобы включить затем, выполните следующие действия:

  • Откройте "Настройки" и перейдите в "Параметры разработчика"
  • Удостоверьтесь, что он включен (сдвинув кнопку переключения в правом верхнем углу)
  • Прокрутите вниз и в разделе "Рисование" коснитесь этих параметров один за другим: масштаб анимации Windows, масштаб анимации перехода и масштаб анимации аниматора.
  • Выберите "Масштаб анимации 1x"

Помогает ли это?

Ответ 2

overridePendingTransition должен быть вызван в "целевой" активности. Например: перейдя из операции A → B, вы должны поместить вызов overridePendingTransition в onCreate Activity B.

Имейте в виду, что если пользователь отключил анимацию на системном уровне, вы не можете заставить анимацию показывать.

EDIT:

Пример будет выглядеть так:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    overridePendingTransition(R.anim.enter, R.anim.exit);
}

Ответ 3

Попробуйте этот код, он работает для меня

Для перемещения справа налево

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true" >
    <translate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:fromXDelta="0%"
        android:toXDelta="-50%" >
    </translate>
</set>

Чтобы слайд слева направо

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromXDelta="-50%"
    android:toXDelta="0%" >
</translate>