安卓visibility = View.GONE如何加上动画效果

第一种方式

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 图中使用的,可以用于在应用程序中创建具有流畅动画效果的导航。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值