MotionLayout过渡期间自定义视图的路径绘制不正确

问题描述

MotionLayout过渡期间,使用自定义视图遇到了不良行为。此自定义视图绘制了Path,导致底部弯曲。当我在MotionLayout的过渡期间更改视图的底部约束时,该曲线不会在过渡期间绘制,而只会在过渡完成后重新出现。我在底部尝试了不同的路径,包括一个更简单的三角形,但发生了相同的行为。

以下是Motion Editor播放过渡音的屏幕录像的链接: https://imgur.com/a/PdzJAnO

请注意如何正确绘制第一次曲线,但在随后的过渡中,该曲线消失了,直到最终在过渡结束时重新出现。这仅发生在Motion Editor上,在物理设备上,过渡期间永远不会正确绘制曲线。

我的自定义视图:

class CustomBackgroundView @JvmOverloads constructor(
    context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : View(context,attrs,defStyleAttr) {

    private val path: Path = Path()
    private val paint: Paint = Paint().apply {
        isAntiAlias = true
        isDither = true
        style = Paint.Style.FILL
    }

    private var pathInset: Int = resources.getDimensionPixelSize(R.dimen.default_padding)

    init {
        if (attrs != null) {
            val typedArray = context.obtainStyledAttributes(attrs,R.styleable.CurvedBackgroundView)
            typedArray.use { array ->
                pathInset = array.getDimensionPixelSize(
                    R.styleable.CurvedBackgroundView_pathInset,resources.getDimensionPixelSize(R.dimen.default_padding)
                )
                paint.color = array.getColor(
                    R.styleable.CurvedBackgroundView_pathColor,ContextCompat.getColor(context,R.color.green)
                )
            }
        }
    }

    override fun onSizeChanged(w: Int,h: Int,oldw: Int,oldh: Int) {
        super.onSizeChanged(w,h,oldw,oldh)
        calculatePath(w.toFloat(),h.toFloat())
    }

    private fun calculatePath(viewWidth: Float,viewHeight: Float) {
        with(path) {
            moveTo(0F,0F)
            lineTo(viewWidth,viewHeight - pathInset)
            cubicTo(
                viewWidth * FIRST_CONTROL_OFFSET,viewHeight,viewWidth * SECOND_CONTROL_OFFSET,0F,viewHeight - pathInset
            )
            close()
        }
    }

    override fun draw(canvas: Canvas) {
        super.draw(canvas)
        canvas.drawColor(Color.TRANSPARENT)
        canvas.drawPath(path,paint)
    }

    companion object {
        private const val FIRST_CONTROL_OFFSET = 0.7F
        private const val SECOND_CONTROL_OFFSET = 0.3F
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...