Evans Kakpovi
Evans Kakpovi

Reputation: 312

draw lots of lines with android drawLines

when i draw a lot of lines, the apps takes a long time to finish drawing. My goal is to connecting of the points in a1[] to form a line. Is there is faster way of doing this? please help!

           > $ for (int i = 0; i < x.length - 1; i++) {
       >        _canvas.drawLine(a1[i].x, a1[i].y, a1[i + 1].x, a1[i + 1].y,_paint);}

Upvotes: 2

Views: 9435

Answers (3)

Giuseppe Laera
Giuseppe Laera

Reputation: 310

Use Canvas.drawLines(float[] pts, Paint paint);

Using Canvas.drawLines instead of Canvas.drawLine i have halved the time of drawing.

I have to draw 12 lines with 5000 points for line and the time of drawing with this code is 2393 milliseconds instead of 6000 milliseconds using Canvas.drawLine() method.

            int lineIndex = 0;
            float[] lines = new float[a1.length * 4];
            for (int i = 0; i < a1.length-1; i++) // -1 to deal with last point
            {
                    lines[lineIndex++] = a1[i].x;
                    lines[lineIndex++] = a1[i].y;
                    lines[lineIndex++] = a1[i + 1].x
                    lines[lineIndex++] = a1[i + 1].y;
            }
            _canvas.drawLines(lines, _paint);

Upvotes: 3

Tatarize
Tatarize

Reputation: 10796

Use draw lines. Pack the points into a float[] with 2 points for each point in the line then do this:

if (count >= 4) {
    if ((count & 2) != 0) {
        canvas.drawLines(pointlist, 0, count-2, linePaint);
        canvas.drawLines(pointlist, 2, count-2, linePaint);
    }
    else {
        canvas.drawLines(pointlist, 0, count, linePaint);
        canvas.drawLines(pointlist, 2, count - 4, linePaint);
    }
}

Where count is the number usable length in the float[] of points. Drawlines goes by 4 floats per segment, but if you stagger them like that you get the result you want without needing to waste 2x the memory and you can effectively move the points if need be.

Upvotes: 6

mgiuffrida
mgiuffrida

Reputation: 3569

Try creating a Path first, then calling _canvas.drawPath():

Path p = new Path();
p.moveTo(a1[0].x, a1[0].y);
for (int i = 1; i < x.length; i++) {
    p.lineTo(a1[i].x, a1[i].y);
}
_canvas.drawPath(p, _paint);

Upvotes: -1

Related Questions