Paint.setStrokeJoin не работает с canvas.drawLines - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь нарисовать линейную диаграмму, используя canvas.drawLines(...), но кажется, что линии не связаны должным образом. Как я понимаю, использование Paint.setStrokeJoin должно использовать соединение митры:

chartLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
chartLinePaint.setStyle(Paint.Style.STROKE);
chartLinePaint.setStrokeJoin(Paint.Join.MITER);
chartLinePaint.setStrokeWidth(6.0f);

Как мне исправить эту проблему и правильно соединить линии?

enter image description here

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Как я уже говорил вам в комментарии, Paint объекты полностью применяются только тогда, когда вы рисуете их с помощью Path.

В документации drawLine есть параграф с: ' Стиль игнорируется в краске ', и то же самое применяется к методу drawLines.

Чтобы проверить это, я создал простое пользовательское представление:

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

    private val textPaint1 = Paint(ANTI_ALIAS_FLAG).apply {
        style = Paint.Style.STROKE
        strokeJoin = Paint.Join.MITER
        strokeWidth = 12.0f
        color = Color.RED
    }

    private val textPaint2 = Paint(ANTI_ALIAS_FLAG).apply {
        style = Paint.Style.STROKE
        strokeJoin = Paint.Join.MITER
        strokeWidth = 12.0f
        color = Color.BLUE
    }

    @SuppressLint("DrawAllocation")
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)

        canvas?.apply {

            val floatArray = floatArrayOf(250f, 550f, 450f, 200f, 450f, 200f, 650f, 700f)
            drawLines(floatArray, textPaint2)

            val path = Path()
            path.moveTo(200f, 500f)
            path.lineTo(400f, 200f)
            path.lineTo(600f, 700f)
            drawPath(path, textPaint1)
        }

    }
}

И вот результат:

enter image description here

Таким образом, используя drawLines, частично применяйте стили Paint obj, например, цвета, но не применяйте strokeJoin свойства.drawPath, кажется, применяет все вместо них.

Если у вас есть проблемы с производительностью, может быть, вы можете попытаться где-то кешировать результат, предварительно вычислить анимацию или попробовать более простую.

Помните, что если у вас нет особых требований, есть замечательная библиотека: MPAndroidChart , которая уже имеет некоторые встроенные анимации

2 голосов
/ 19 марта 2019

Задача

Как вы, возможно, заметили в документации Android, вы не можете подать заявку стиль до drawLine.

исх

Из документации Canvas

DrawLine:

public void drawLine (float startX, float startY, float stopX, float stopY, Paint paint)

Нарисуйте отрезок линии с указанными начальными и конечными координатами x, y, используя указанную краску.

Обратите внимание, что, поскольку строка всегда "в рамке", стиль игнорируется в краска.

Вырожденные линии (длина 0) не будут нарисованы.

drawLines:

public void drawLines (float[] pts, int offset, int count, Paint paint)

Нарисуйте серию линий. Каждая строка берется из 4 последовательных значений в массиве pts. Таким образом, чтобы нарисовать 1 линию, массив должен содержать как минимум 4 значения. Это логически так же, как рисование массива как следует:

drawLine(pts[0], pts[1], pts[2], pts[3]) 
followed by:
drawLine(pts[4], pts[5], pts[6], pts[7])

и т. Д.

Решение

Если вам нужно применить style, решение - использовать drawPath. Он будет применять style, установленный в объекте paint.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...