从 android.view.View#getAnimationMatrix 访问 api 级别低于 29

问题描述

我正在尝试在实际视图动画时为 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 (将#修改为@)