如何在条件导航中制作片段动画
How to animate fragment animation in conditional navigation
要在导航组件中的目的地之间设置动画,可以在如下所示的 action 标记中指定以下属性。
<fragment
.........>
<action
........
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
</fragment>
我阅读了有关条件导航 (https://developer.android.com/guide/navigation/navigation-conditional) 的内容,它建议某些屏幕(例如登录屏幕)应独立于导航流程进行处理。
<navigation
.........
app:startDestination="@id/main_fragment">
<fragment
android:id="@+id/main_fragment"
android:name="com.google.android.conditionalnav.MainFragment"
android:label="fragment_main"
tools:layout="@layout/fragment_main">
<action
android:id="@+id/navigate_to_profile_fragment"
app:destination="@id/profile_fragment"/>
</fragment>
<fragment
android:id="@+id/login_fragment"
android:name="com.google.android.conditionalnav.LoginFragment"
android:label="login_fragment"
tools:layout="@layout/login_fragment"/>
<fragment
android:id="@+id/profile_fragment"
android:name="com.google.android.conditionalnav.ProfileFragment"
android:label="fragment_profile"
tools:layout="@layout/fragment_profile"/>
</navigation>
我想在用户尚未通过动画验证时从 ProfileFragment 重定向到 LoginFragment。我知道我们可以在进入或退出片段时在 LoginFragment 上明确定义转换。
class LoginFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val inflater = TransitionInflater.from(requireContext())
enterTransition = inflater.inflateTransition(R.transition.slide_right)
exitTransition = inflater.inflateTransition(R.transition.fade)
}
}
class ProfileFragment : Fragment() {
.......
navController.navigate(R.id.login_fragment)
.......
}
我想知道是否有其他方法可以使用导航组件或动画属性从 ProfileFragment 到 LoginFragment 进行动画处理,就像我们在 action 标签上使用的那样,而无需在 LoginFragment 中指定它。
如果您有一个需要多个目的地可以访问的操作(您可能希望 navigate_to_profile_fragment
操作是这样的),这正是 global actions 的用例 - 定义在<navigation>
图表级别,而不是仅与单个目的地相关联。这意味着您图表中的任何目的地都可以通过 navigate(R.id.navigate_to_profile_fragment)
触发操作
<navigation
.........
app:startDestination="@id/main_fragment">
<action
android:id="@+id/navigate_to_profile_fragment"
app:destination="@id/profile_fragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right"/>
<fragment
android:id="@+id/main_fragment"
android:name="com.google.android.conditionalnav.MainFragment"
android:label="fragment_main"
tools:layout="@layout/fragment_main">
</fragment>
<fragment
android:id="@+id/login_fragment"
android:name="com.google.android.conditionalnav.LoginFragment"
android:label="login_fragment"
tools:layout="@layout/login_fragment"/>
<fragment
android:id="@+id/profile_fragment"
android:name="com.google.android.conditionalnav.ProfileFragment"
android:label="fragment_profile"
tools:layout="@layout/fragment_profile"/>
</navigation>
要在导航组件中的目的地之间设置动画,可以在如下所示的 action 标记中指定以下属性。
<fragment
.........>
<action
........
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
</fragment>
我阅读了有关条件导航 (https://developer.android.com/guide/navigation/navigation-conditional) 的内容,它建议某些屏幕(例如登录屏幕)应独立于导航流程进行处理。
<navigation
.........
app:startDestination="@id/main_fragment">
<fragment
android:id="@+id/main_fragment"
android:name="com.google.android.conditionalnav.MainFragment"
android:label="fragment_main"
tools:layout="@layout/fragment_main">
<action
android:id="@+id/navigate_to_profile_fragment"
app:destination="@id/profile_fragment"/>
</fragment>
<fragment
android:id="@+id/login_fragment"
android:name="com.google.android.conditionalnav.LoginFragment"
android:label="login_fragment"
tools:layout="@layout/login_fragment"/>
<fragment
android:id="@+id/profile_fragment"
android:name="com.google.android.conditionalnav.ProfileFragment"
android:label="fragment_profile"
tools:layout="@layout/fragment_profile"/>
</navigation>
我想在用户尚未通过动画验证时从 ProfileFragment 重定向到 LoginFragment。我知道我们可以在进入或退出片段时在 LoginFragment 上明确定义转换。
class LoginFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val inflater = TransitionInflater.from(requireContext())
enterTransition = inflater.inflateTransition(R.transition.slide_right)
exitTransition = inflater.inflateTransition(R.transition.fade)
}
}
class ProfileFragment : Fragment() {
.......
navController.navigate(R.id.login_fragment)
.......
}
我想知道是否有其他方法可以使用导航组件或动画属性从 ProfileFragment 到 LoginFragment 进行动画处理,就像我们在 action 标签上使用的那样,而无需在 LoginFragment 中指定它。
如果您有一个需要多个目的地可以访问的操作(您可能希望 navigate_to_profile_fragment
操作是这样的),这正是 global actions 的用例 - 定义在<navigation>
图表级别,而不是仅与单个目的地相关联。这意味着您图表中的任何目的地都可以通过 navigate(R.id.navigate_to_profile_fragment)
<navigation
.........
app:startDestination="@id/main_fragment">
<action
android:id="@+id/navigate_to_profile_fragment"
app:destination="@id/profile_fragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right"/>
<fragment
android:id="@+id/main_fragment"
android:name="com.google.android.conditionalnav.MainFragment"
android:label="fragment_main"
tools:layout="@layout/fragment_main">
</fragment>
<fragment
android:id="@+id/login_fragment"
android:name="com.google.android.conditionalnav.LoginFragment"
android:label="login_fragment"
tools:layout="@layout/login_fragment"/>
<fragment
android:id="@+id/profile_fragment"
android:name="com.google.android.conditionalnav.ProfileFragment"
android:label="fragment_profile"
tools:layout="@layout/fragment_profile"/>
</navigation>