问题描述
我正在尝试在实际视图动画时为 recyclerview 分隔线装饰设置动画。
override fun onDraw(canvas: Canvas,parent: RecyclerView,state: RecyclerView.State) {
val childCount = parent.childCount
for (i in 0 until childCount - 1) {
val child = parent.getChildAt(i)
val childAdapterPosition = parent.getChildAdapterPosition(child)
.let { if (it == RecyclerView.NO_POSITION) return else it }
val type = parent.adapter?.getItemViewType(childAdapterPosition)
val drawable = itemViewTypesMap[type]?.drawable ?: continue
val margin = itemViewTypesMap[type]?.margin?.toInt() ?: 0
val params = child.layoutParams as RecyclerView.LayoutParams
val childLeftOffset = child.paddingLeft + params.leftMargin
val childRightOffset = child.paddingRight + params.rightMargin
val dividerLeft = if (parent.clipToPadding) 0 + childLeftOffset else parent.paddingLeft + childLeftOffset
val dividerRight = if (parent.clipToPadding) parent.width - childRightOffset else parent.width - parent.paddingRight - childRightOffset
val dividerTop = child.bottom + params.bottomMargin + child.translationY.roundToInt()
val offset = child.animationMatrix?.values()?.get(5)?.toInt() ?: 0
val dividerBottom = dividerTop + drawable.intrinsicHeight
drawable.setBounds(dividerLeft + margin,dividerTop + offset,dividerRight - margin,dividerBottom + offset)
drawable.draw(canvas)
}
}
上面的代码运行良好,但 IDE 抱怨在 api 29 中添加了 child.animationMatrix
。使用 child.matrix
不起作用,因为它只包含 0.0 值。同样使用 child.getTranslationY 总是返回 0.0。
我们使用这种动画应该会有所帮助:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="@android:anim/decelerate_interpolator">
<translate
android:duration="400"
android:fromXDelta="0%"
android:fromYDelta="100%"
android:toXDelta="0%"
android:toYDelta="0%" />
</set>
并通过以下方式加载它们:
viewHolder.itemView.startAnimation(AnimationUtils.loadAnimation(viewHolder.itemView.context,R.anim.down_from_top))
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)