Android实现展开收起动画的悬浮按钮

本文介绍了一种使用属性动画实现控件伸缩效果的方法,通过动态改变控件宽度,实现展开与收缩动画。文章详细解释了实现原理,包括获取子控件准确尺寸、避免文字换行影响及代码实现细节。
该文章已生成可运行项目,

效果图:

实现原理

    利用属性动画的特性,动态地改变控件宽度。

    这里唯一要注意的坑点在于我们一定要拿到准确的子控件(即内部几个view)的宽度与高度 才能精准地对要伸展以及收缩的宽度进行控制。同时,为了不让子控件内部由于文字挤压所带来的换行影响,这里可以设置textview的maxLine属性为1。

    由于现在需求急于上线,这里先直接上代码了~等忙完这阵子再来细细分享实现过程中遇到的坑以及一些代码逻辑的实现原理。

Coding Time

class ExpandAnimationView : LinearLayout {

    private lateinit var mImageView: ImageView

    private val mAnimatorSet = AnimatorSet()

    private var mExpandWidth = 0

    private val mExpandContainer = LinearLayout(context)

    private val mExpandItems = listOf(ExpandItem(R.drawable.ic_next, "收起"), ExpandItem(R.drawable.ic_share, "分享"))

    private var mIsExpanding = false

    private var mClickListener: OnExpandViewClickListener? = null

    constructor(context: Context): this(context, null)

    constructor(context: Context, attrs: AttributeSet?): super (context, attrs)

    init {
        // 设置父级控件的属性
        orientation = HORIZONTAL
        gravity = Gravity.CENTER_VERTICAL
        background = ResourcesCompat.getDrawable(context.resources, R.drawable.bg_expand_view, null)
        mImageView = ImageView(context)
        addView(mImageView)
        mImageView.apply {
            layoutParams = LinearLayout.LayoutParams(dip2px(25F), dip2px(25F))
            val p = layoutParams as LayoutParams
            p.setMargins(dip2px(13F), dip2px(13F), dip2px(13F), dip2px(13F))
            layoutParams = p
            setImageResource(R.drawable.ic_add)
        }

        setOnClickListener {
            mImageView.performClick()
        }

        mImageView.setOnClickListener {
            startAnimation()
        }

        // 设置扩展的子控件的属性
        initExpandView()
    }

    private fun initExpandView() {
        if (mExpandItems.isEmpty()) return

        addView(mExpandContainer, 0)

        mExpandContainer.layoutParams = LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT)
        val containerParam = mExpandContainer.layoutParams as LayoutParams
        mExpandContainer.gravity = Gravity.CENTER_VERTICAL

        for ((index, item) in mExpandItems.withIndex()) {
            val textView = TextView(context)
            textView.apply {
                gravity = Gravity.CENTER_VERTICAL
                textView.textSize = 13F
                textView.setTextColor(Color.WHITE)
                textView.text = item.text
                textView.maxLines = 1
                
本文章已经生成可运行项目
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值