Создать выпуклый путь для контура провайдера - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь создать выпуклый путь для контура провайдера. Мне нужен прямоугольник angular с закругленными верхним левым и верхним правым углами. Есть один метод, который может это сделать, но вопрос: что не так с моим выпуклым путем? Это dr aws на краске, как выпуклый, и геометрически должно быть хорошо.

(да, я знаю о publi c void addRoundRect (float left, float top, float right, float bottom, @NonNull float [] радиусы, @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()
    }
}

И результат: enter image description here

Но путь все еще не выпуклый

1 Ответ

1 голос
/ 15 апреля 2020

Во втором вызове arcTo () необходимо указать последний параметр, forceMoveTo = false. arcTo (...., true) завершает путь один раз. Поэтому он рисует два отдельных пути, которые никогда не могут быть выпуклыми.

...