3

Изменение действия с анимацией можно с помощью кода ниже:активность навигации: пользовательские анимации с popEnter и popExit как фрагменты

Bundle animation = ActivityOptions.makeCustomAnimation(App.getContext(), R.anim.enter_from_right, R.anim.exit_to_left).toBundle(); 
startActivity(intent, animation); 

Для фрагментов вы можете сделать что-то похожее на FragmentTransaction:

// ... 
transaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left); 
// ... 

Это работает! Но я хотел бы иметь анимацию при нажатии (pop from backstack). Для фрагментов вы просто добавляете 2 ANIM ресурсов (popEnter & popExit):

transaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right); 

Как я могу создать такой же 'бэк-анимации' для деятельности?

+1

Я использовал этот код: 'overridePendingTransition (android.R.anim.fade_in, android.R.anim.fade_out) ; Вы можете увидеть эти примеры в [GmailAnimation] (https://github.com/CabezasGonzalezJavier/GmailAnimation) или [LopeAnimations] (https://github.com/CabezasGonzalezJavier/LopeAnimations). Также вы можете увидеть больше в этом [блоге] (http://thedeveloperworldisyours.com/android/gmail-overriding-pending-transition/#sthash.CEhJwJLg.dpbs). – Cabezas

+0

Я ответил на вопрос своего вопроса с тем же примером, но немного расширил его ;-) –

ответ

17

Я нашел другой, хотя и простой подход, который, кажется, работает достаточно хорошо. Анимации для действий также могут быть выполнены с использованием overridePendingTransition, поэтому, когда действие завершается, вы просто будете использовать этот метод.

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

public abstract class BaseActivity extends AppCompatActivity { 

    @Override 
    public void finish() { 
     super.finish(); 
     onLeaveThisActivity(); 
    } 

    protected void onLeaveThisActivity() { 
     overridePendingTransition(R.anim.enter_from_left, R.anim.exit_to_right); 
    } 

    // It's cleaner to animate the start of new activities the same way. 
    // Override startActivity(), and call *overridePendingTransition* 
    // right after the super, so every single activity transaction will be animated: 

    @Override 
    public void startActivity(Intent intent) { 
     super.startActivity(intent); 
     onStartNewActivity(); 
    } 

    @Override 
    public void startActivity(Intent intent, Bundle options) { 
     super.startActivity(intent, options); 
     onStartNewActivity(); 
    } 

    protected void onStartNewActivity() { 
     overridePendingTransition(R.anim.enter_from_right, R.anim.exit_to_left); 
    } 
} 

Чтобы закруглить вещи, я буду включать 4 Anim ресурсы:

enter_from_right

<translate xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="500" 
    android:fromXDelta="100%p" 
    android:toXDelta="0%p"/> 

exit_to_left

<translate xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="500" 
    android:fromXDelta="0%p" 
    android:toXDelta="-100%p"/> 

enter_from_left

<translate xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="500" 
    android:fromXDelta="-100%p" 
    android:toXDelta="0%p"/> 

exit_to_right

<translate xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="500" 
    android:fromXDelta="0%p" 
    android:toXDelta="100%p"/> 

пс. Вы, вероятно, хотели бы исключить экзит-анимацию в стартовой/основной деятельности ;-)

public class MainMenuActivity extends BaseActivity { 
    .... 
    @Override 
    protected void onLeaveThisActivity() { 
     // Don't use an exit animation when leaving the main activity! 
    } 
} 
+1

Приятный подход. Я бы обновил ответ, чтобы переопределить методы startActivityForResult. – ikarhun

+0

Отличное предложение ikarhun, я попробую его и скоро обновит свой код! –

+0

Хорошее решение. Единственная проблема заключается в том, что на устройстве, которое на моем Samsung s6, у которого этот переход встроен, требуется примерно в два раза больше, чтобы выполнить эту анимацию по сравнению с устройствами, которые ее не имеют. Я создал сообщение: https://stackoverflow.com/questions/45735395/activity-navigation-translation-animation-not-working-correctly-on-samsung-s6 –