【问题标题】:Create convex path for outline provider为轮廓提供者创建凸路径
【发布时间】:2020-07-27 19:00:12
【问题描述】:

我尝试为大纲提供者创建凸路径。我需要一个带有圆形左上角和右上角的矩形。 有一种方法可以做到这一点,但问题是:我的凸路径有什么问题?它像凸面一样绘制油漆,在几何上应该没问题。

(是的,我知道 public void addRoundRect(float left, float top, float right, float bottom, @NonNull float[] radii, @NonNull Direction dir))

我的 ConvexView 有实现

val Int.toPx: Int
    get() = (this * Resources.getSystem().displayMetrics.density).toInt()

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

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

    private val convexPath = Path()

    val r = 24.toPx.toFloat()
    val d = r * 2

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        with (convexPath) {
            reset()
            arcTo(0f, 0f, d, d, -90f, -90f, true)
            lineTo(0f, measuredHeight.toFloat())
            lineTo(measuredWidth.toFloat(), measuredHeight.toFloat())
            lineTo(measuredWidth.toFloat(), r)
            arcTo(measuredWidth.toFloat() - d, 0f,
                measuredWidth.toFloat(), d,
                0f, -90f, true)
            lineTo(r, 0f)
        }
        Log.d("CONVEX", "Path is convex = ${convexPath.isConvex}")
    }

    override fun onDraw(canvas: Canvas?) {
        canvas?.save()
        canvas?.drawPath(convexPath, paint)
        canvas?.restore()
    }
}

结果:

但路径仍然不是凸的

【问题讨论】:

    标签: android path android-custom-view paint convex


    【解决方案1】:

    在第二次 arcTo() 调用中,您需要指定最后一个参数 forceMoveTo=false。 arcTo(.... , true) 终止路径一次。所以它绘制了两条永远不会凸出的独立路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-23
      • 2013-03-24
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多