效果图:

实现原理
利用属性动画的特性,动态地改变控件宽度。
这里唯一要注意的坑点在于我们一定要拿到准确的子控件(即内部几个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

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

被折叠的 条评论
为什么被折叠?



