Как определить анимацию по умолчанию для действий навигации?

Я использую Android Studio 3.2 Canary 14 и компонент Navigation Architecture. С этим вы можете определить анимацию перехода в значительной степени, как при использовании Intents.

Но анимации устанавливаются как свойства действий в графике навигации, например:

<fragment
    android:id="@+id/startScreenFragment"
    android:name="com.example.startScreen.StartScreenFragment"
    android:label="fragment_start_screen"
    tools:layout="@layout/fragment_start_screen" >
  <action
    android:id="@+id/action_startScreenFragment_to_findAddressFragment"
    app:destination="@id/findAddressFragment"
    app:enterAnim="@animator/slide_in_right"
    app:exitAnim="@animator/slide_out_left"
    app:popEnterAnim="@animator/slide_in_left"
    app:popExitAnim="@animator/slide_out_right"/>
</fragment>

Это становится утомительным для определения всех действий на графике!

Есть ли способ определить набор анимаций по умолчанию, на действия?

Мне не удавалось использовать стили для этого.

Ответ 1

У R.anim определены анимации по умолчанию (как окончательные):

  • nav_default_enter_anim

  • nav_default_exit_anim

  • nav_default_pop_enter_anim

  • nav_default_pop_exit_anim

чтобы изменить это поведение, вам придется использовать пользовательские NavOptions,

потому что именно там анимация назначается NavAction.

их можно назначить с помощью NavOptions.Builder:

protected NavOptions getNavOptions() {

    NavOptions navOptions = NavOptions.Builder()
      .setEnterAnim(R.anim.default_enter_anim)
      .setExitAnim(R.anim.default_exit_anim)
      .setPopEnterAnim(R.anim.default_pop_enter_anim)
      .setPopExitAnim(R.anim.default_pop_exit_anim)
      .build();

    return navOptions;
}

скорее всего, потребуется создать DefaultNavFragment, который расширяет класс androidx.navigation.fragment (документация там пока не завершена).

альтернативно... при просмотре attrs.xml этого пакета; эти анимации стиль-возможности:

<resources>
    <declare-styleable name="NavAction">
        <attr name="enterAnim" format="reference"/>
        <attr name="exitAnim" format="reference"/>
        <attr name="popEnterAnim" format="reference"/>
        <attr name="popExitAnim" format="reference"/>
        ...
    </declare-styleable>
</resources>

это означает, что можно определить соответствующие стили - и определить их, как часть темы...

их можно определить в styles.xml:

<style name="Theme.Default" parent="Theme.AppCompat.Light.NoActionBar">

    <!-- these should be the correct ones -->
    <item name="NavAction_enterAnim">@anim/default_enter_anim</item>
    <item name="NavAction_exitAnim">@anim/default_exit_anim</item>
    <item name="NavAction_popEnterAnim">@anim/default_pop_enter_anim</item>
    <item name="NavAction_popExitAnim">@anim/default_pop_exit_anim</item>

</style>

Ответ 2

Как сказано, у R.anim определены анимации по умолчанию:

  • nav_default_enter_anim

  • nav_default_exit_anim

  • nav_default_pop_enter_anim

  • nav_default_pop_exit_anim

Но вы можете легко их переопределить.

Просто создайте свои собственные четыре ресурса с одинаковыми именами в вашем модуле приложения (просто для уточнения, идентификатор одного из них - your.package.name.R.anim.nav_default_enter_anim) и напишите, какую анимацию вы хотите.