美文网首页
【Android】动画 —— view高度渐变的动画

【Android】动画 —— view高度渐变的动画

作者: CentForever | 来源:发表于2020-12-26 19:56 被阅读0次

【问题】
实现可见度为 gone 的 view ,高度从0变化到测量的高度;
如果view 可见度为 gone, 直接通过 view.getHeight();得到的是0;
虽然可以通过一个固定值来设置高度,但是如果高度设置的不准就会存在适配问题(应该有一种方法在gone的情况下也可以获取到view的高度)

import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
import android.app.Activity
import android.graphics.Point
import android.util.Log
import android.view.View

object AnimatorUtil {
    // 高度渐变的动画;
    private fun animHeightToView(
        v: View, start: Int, end: Int, isToShow: Boolean,
        duration: Long
    ) {
        val va = ValueAnimator.ofInt(start, end)
        val layoutParams = v.layoutParams
        va.addUpdateListener { animation ->
            val h = animation.animatedValue as Int
            layoutParams.height = h
            v.layoutParams = layoutParams
            v.requestLayout()
            if (isToShow && h > 0) {
                v.visibility = View.VISIBLE
            }
            Log.e("mgg","Animation Animating Current Value $h");
        }
        va.addListener(object : AnimatorListenerAdapter() {
            override fun onAnimationStart(animation: Animator) {
                super.onAnimationStart(animation)
            }

            override fun onAnimationEnd(animation: Animator) {
                super.onAnimationEnd(animation)
                if (!isToShow) {
                    v.visibility = View.GONE
                }
            }
        })
        va.duration = duration
        va.start()
    }

    fun animHeightToView(
        context: Activity,
        v: View,
        isToShow: Boolean,
        duration: Long
    ) {
        if (isToShow) {
// 显示:通过上下文对象context获取可见度属性为 gone 的 view 的高度;
            val display = context.windowManager.defaultDisplay
            val size = Point()
            display.getSize(size)
            v.measure(size.x, size.y)
            val end = v.measuredHeight
            animHeightToView(v, 0, end, isToShow, duration)
        } else {
// 隐藏:从当前高度变化到0,最后设置不可见;
            animHeightToView(v, v.layoutParams.height, 0, isToShow, duration)
        }
    }
}

参考
https://blog.csdn.net/ly1414725328/article/details/50916270

相关文章

网友评论

      本文标题:【Android】动画 —— view高度渐变的动画

      本文链接:https://www.haomeiwen.com/subject/xufgzhtx.html