第一种方式
val animatorSet = AnimatorSet().apply {
play(ObjectAnimator.ofFloat(binding.navMenu, View.ALPHA, 1f, 0f))
.with(ObjectAnimator.ofFloat(binding.navMenu, View.TRANSLATION_Y, 0f, binding.navMenu.height.toFloat() / 2))
duration = 300
addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator?) {}
override fun onAnimationEnd(animation: Animator?) {
binding.navMenu.visibility = View.GONE
}
override fun onAnimationCancel(animation: Animator?) {}
override fun onAnimationRepeat(animation: Animator?) {}
})
}
animatorSet.start()
第一段代码使用了 AnimatorSet 类来创建一系列动画效果,以实现在 binding.navMenu 的可见性发生变化时,添加一个渐隐渐出和向下滑动的动画效果。
具体来说,我们使用了 ObjectAnimator 来分别控制 binding.navMenu 的透明度和垂直方向上的平移动画。我们在 AnimatorSet 中添加了这两个动画,并设置了动画的持续时间为 300 毫秒。最后,我们添加了一个监听器,当动画结束时,将 binding.navMenu 的可见性设置为 View.GONE。
第二种方式
val anim = AnimationUtils.loadAnimation(context, R.anim.slide_out_right)
anim.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationStart(animation: Animation?) {}
override fun onAnimationEnd(animation: Animation?) {
binding.navMenu.visibility = View.GONE
}
override fun onAnimationRepeat(animation: Animation?) {}
})
binding.navMenu.startAnimation(anim)
slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0%" android:toXDelta="100%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="@integer/slide"/>
</set>
第二段代码使用了 XML 资源文件来定义了一个简单的位移动画效果,通过将 binding.navMenu 视图从屏幕左侧移动回到原来的位置来实现动画效果。我们使用 AnimationUtils 类中的 loadAnimation() 方法加载该动画,然后将该动画设置为 binding.navMenu 视图的动画效果,并添加了一个监听器,当动画结束时,将 binding.navMenu 的可见性设置为 View.GONE。
anim.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationStart(animation: Animation?) {
binding.navHostContainer.visibility = View.VISIBLE
}
override fun onAnimationEnd(animation: Animation?) {
binding.navMenu.visibility = View.GONE
}
override fun onAnimationRepeat(animation: Animation?) {}
})
这是一个使用 Kotlin 语言编写的动画监听器,它被设置在一个动画对象(Animation)上。
动画监听器有三个方法:onAnimationStart、onAnimationEnd 和 onAnimationRepeat,分别对应动画开始、动画结束和动画重复播放时的事件。在这个代码中,使用了对象表达式(object expression)来创建一个匿名类,实现了 Animation.AnimationListener 接口,并覆盖了这三个方法。具体来说:
- onAnimationStart 方法在动画开始播放时被调用,它将主页面(binding.navHostContainer)的可见性设置为 View.VISIBLE,即显示主页面。
- onAnimationEnd方法在动画播放结束时被调用,它将导航菜单(binding.navMenu)的可见性设置为 View.GONE,即隐藏导航菜单。
- onAnimationRepeat 方法在动画重复播放时被调用,但是这个方法也没有实现任何逻辑,因此使用空实现。
通过设置动画监听器,可以在动画播放过程中监听到各种事件,以便在适当的时候执行相应的逻辑。在这个例子中,当导航菜单的隐藏动画结束时,将导航菜单设置为不可见。
<action
android:id="@+id/action_menu_to_setting"
app:destination="@id/settingFragment"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/fade_out"/>
这是一个 Android Navigation 组件中的一个导航动作(Action)。当用户点击菜单界面中的某个按钮时,将会触发这个导航动作,使应用程序切换到设置界面。
该导航动作的 ID 为 action_menuFragment_to_settingFragment,它使用了 Navigation 组件中的 destination 属性,指定了要切换到的目标界面的 ID,即 settingFragment。
此外,该导航动作还使用了 popEnterAnim 和 popExitAnim 属性,用于在返回上一个界面时播放进入和退出的动画效果。其中,popEnterAnim 属性指定了要播放的进入动画资源 ID,即 @anim/slide_in_left,表示从左侧滑入。popExitAnim 属性指定了要播放的退出动画资源 ID,即 @anim/fade_out,表示淡出效果。
这些属性通常是在 Navigation 图中使用的,可以用于在应用程序中创建具有流畅动画效果的导航。