使用getSegment逐步绘制路径

问题描述 投票:1回答:2

我创建了一个自定义视图来画一条线,但是要逐步。我尝试使用PathMeasure和getSegment,但是效果不起作用。它只是一直在用最终尺寸绘制线。

private val paint = Paint().apply {
    isAntiAlias = true
    color = Color.WHITE
    style = Paint.Style.STROKE
    strokeWidth = 10f
}


override fun onDraw(canvas: Canvas?) {
    super.onDraw(canvas)

    val path = Path().apply {
        moveTo(width/2.toFloat(), height/2.toFloat())
        lineTo(width/2.toFloat(), height/4.toFloat())
    }

    val measure = PathMeasure(path, false)
    val length = measure.length
    val partialPath = Path()
    measure.getSegment(0.0f, length, partialPath, true)
    partialPath.rLineTo(0.0f, 0.0f)
    canvas!!.drawPath(partialPath, paint)
}
android android-studio android-layout kotlin android-canvas
2个回答
0
投票

您可以使用DashPathEffect进行此操作

DashPathEffect dashPathEffect = new DashPathEffect(new float[]{1000.0f,9999999},0);
Paint.setPathEffect(dashPathEffect);

将长度更改为1000(在Dash中为“ on”部分)

并且将99999999设置为最大值(在Dash中为“ off”部分)

使用此参数并请阅读此article

enter image description here


0
投票

这是我做到的方式,如@mohandes解释:

private var path = Path()
private var paint = Paint()
private val dashes = floatArrayOf(125f, 125f)

init {

    paint = Paint().apply {
        isAntiAlias = true
        color = Color.WHITE
        style = Paint.Style.STROKE
        strokeWidth = 10.0f
        pathEffect = CornerPathEffect(8f)
    }

    path = Path().apply {
        moveTo(312f, 475f)
        lineTo(312f, 375f)
    }


    val lineAnim = ValueAnimator.ofFloat(100f, 0f)
    lineAnim.interpolator = LinearInterpolator()
    lineAnim.addUpdateListener {
        paint.pathEffect = ComposePathEffect(DashPathEffect(dashes, lineAnim.animatedValue as Float), CornerPathEffect(8f))
        invalidate()
    }

    lineAnim.duration = 1000
    lineAnim.start()
}

override fun onDraw(canvas: Canvas?) {
    super.onDraw(canvas)
    canvas!!.drawPath(path, paint)
}
© www.soinside.com 2019 - 2024. All rights reserved.