咱们好,我是似曾相识2022。不喜欢唱跳篮球,但对杰伦的Rap却情有独钟。

今日给咱们带来一个打开和收起的简单作用。假如只是代码中简单设置显示或躲藏,了解安卓系统的朋友都知道,那一定是闪现。所以笔者结合了动画,使得体验作用瞬间提升一个档次。话不多说,直接上作用:

Android:实现一个简单带动画的展开收起功能

首要观察图中作用,视图有打开和折叠两种状况,右侧图标和文字会跟从这个状况改动。那么其间就有折叠的高度和打开的高度需求咱们记录。折叠高度是固定的,打开高度需求动态获取。需求留意的是不能直接经过视图直接获取高度,由于视图的制作和Activity的生命周期是不同步的,在Activity中直接lin.height获取高度无法保证此时的视图已经完结计算。这儿直接用简单的post办法获取到制作完结的总高度。原理是将这个音讯放到队列最后一条,这样就能够保证回调办法中能够获取到实在的高度。

lin?.post {
    val h = lin!!.height
    hight = if (h > 0) h else baseHight
    if (h > 0 && ivTop?.visibility == View.GONE) {
        ivTop?.visibility = View.VISIBLE
    }
}

接下来就是动画的运用和动态操控视图的高度了。这儿需求用到特点动画,咱们知道的特点动画有ValueAnimatorObjectAnimatorObjectAnimator是继承于ValueAnimator,说明ValueAnimator能做的事情ObjectAnimator也能够实现。由于咱们要操控的视图不止一个,所以还是运用ValueAnimator便利点。经过addUpdateListener增加监听后,animation.animatedValue就是咱们需求的当时值。在此处不断将当时高度赋值给视图,而且图标也根据这个值进行等比例的旋转以到到达视图不断更新。

//根据打开、封闭状况传入对应高度
val animator = ValueAnimator.ofInt(
    if (isExpand) hight - baseHight else 0,
    if (isExpand) 0 else hight - baseHight
)
animator.addUpdateListener { animation ->
    val params = lin?.layoutParams
    params?.height = if ((animation.animatedValue as Int) < baseHight) baseHight else (animation.animatedValue as Int) //当高度小于根底高度时 给与根底高度
    lin?.layoutParams = params//拿到当时高度
    //图标旋转
    ivTop?.rotation = (animation.animatedValue as Int) * 180f / (hight - baseHight)
}
animator.duration = 500//动画时长
animator.start()
isExpand = !isExpand
tvExpand?.text = if (isExpand) "封闭" else "打开"

编写过程需求留意打开和收起状况下值的正确输入,在回调办法中获取对应的当时值并赋值。

好了,一个简单的打开收起功用就实现了,期望对咱们有所协助。