微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有路径的自定义跨度重复路径

如何解决带有路径的自定义跨度重复路径

我想为 TextView Spas 画一个弯曲的下划线,所以我有一个自定义的 span 和 textview,如下所示:

class UnderscoreSpan(context: Context) : ReplacementSpan() {

private val underscoreHeight = context.resources.getDimension(R.dimen.underscoreHeight)
private val vectorPath = Path()

override fun getSize(
    paint: Paint,text: CharSequence,start: Int,end: Int,fm: FontMetricsInt?
): Int {
    return measureText(paint,text,start,end).roundToInt()
}

private fun measureText(paint: Paint,end: Int): Float {
    return paint.measureText(text,end)
}

override fun draw(
    canvas: Canvas,x: Float,top: Int,y: Int,bottom: Int,paint: Paint
) {
    val w = measureText(paint,end)
    val h = bottom.toFloat() - top.toFloat()
    paint.color = Color.RED
    paint.strokeWidth = underscoreHeight
    paint.style = Paint.Style.stroke
    vectorPath.moveto(x,bottom.toFloat() - underscoreHeight)
    vectorPath.cubicTo(
        x + w / 2,bottom - underscoreHeight - h / 10,x + w - w / 5,bottom - underscoreHeight + h / 20,x + w,bottom - underscoreHeight,)
    canvas.save()
    canvas.drawPath(vectorPath,paint)
    paint.color = Color.BLACK
    paint.style = Paint.Style.FILL
    paint.typeface = Typeface.create(Typeface.DEFAULT,Typeface.BOLD)
    canvas.drawText(text,end,x,y.toFloat(),paint)
    canvas.restore()
}

}

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

fun setSpannableText(text: String) {

    val start = text.findAnyOf(listof("<b>"))?.first ?: 0
    val temp = text.replace("<b>","")
    val end = temp.findAnyOf(listof("</b>"))?.first ?: 0
    val finalText = temp.replace("</b>","")

    val spannable = SpannableString(finalText)

    spannable.setSpan(
        UnderscoreSpan(context),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
    super.setText(spannable)
}

}

但是,路径绘制了两次,偏移了几个像素。如果我不使用路径(例如只使用 drawRect),那就没问题了。然而,对于路径,它总是双倍的,即使我关闭路径并且不使用笔画。我做错了什么?

解决方法

在第二次 onDraw 调用中,我未能重置路径变量,因此它被重绘。所以它只需要在 draw() 开始时调用 path.reset()。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。