1

我被 canvas.drawLines() 卡住了。

我的应用程序显示轨道 om 地图视图,但结果线很糟糕。有没有人看到这样的行为?即,线条没有相同的宽度,甚至不是“方形”,而是菱形,有时甚至会消失!

我已经用 for(){drawLine()} 和 drawPath 进行了测试——同样的问题。

屏幕截图采用 10" 平板电脑 1280x800,富士通。联想平板电脑显示相同。

http://jpegshare.net/c8/1d/c81daa6cff15e3d14cb1268679bb1af1.png.html

    borderPaint = new Paint();
    borderPaint.setAntiAlias(true);
    borderPaint.setStrokeWidth(5);        
    borderPaint.setStyle(Paint.Style.STROKE);
    borderPaint.setColor(Color.WHITE);
    //borderPaint.setAlpha(190);      


    fillPaint = new Paint();
    fillPaint.setAntiAlias(true);
    fillPaint.setStyle(Paint.Style.STROKE);
    fillPaint.setStrokeWidth(3);
    fillPaint.setColor(Color.RED);

....
    canvas.drawLines(linepoints, 0, linepoints_count, borderPaint);
    canvas.drawLines(linepoints, 0, linepoints_count, fillPaint);

其中 linepoints 是要绘制的轨迹线数组。每行由 4 个浮点数组成。

4

2 回答 2

2

好吧,我发现了我的问题。希望这可以帮助某人。

在画线之前,我做

canvas.translate(X, Y);

其中 X 和 Y 值很大。比如 10E+6..10E+7 什么的。

当我画线时,它们的 xy 值也很大,但是是负数,因此在屏幕坐标中,这个 xy+XY 在屏幕内给出了一些东西——但这个事实很重要,并且会产生我自己的第一篇文章中描述的问题。为什么会这样?我找到了一个线索。当 drawLine 算法试图画一条线时,它会弄乱线坐标(除法、乘法),并且由于机器算法的精度有限,算法会得到错误的数字。

How this was solved?

我放弃了 canvas.translate(),并在绘图之前即时计算屏幕坐标。

现在,像这样

screen_line_coords_x = line_coord_x - X; //X is offset applied in translate.           
screen_line_coords_y = line_coord_y - Y; //Y is offset applied in translate.

canvas.drawLine(screen_line_coords_x, screen_line_coords_y, ...); 
... or drawLines() or drawPath() - all give good results.

希望这可能会有所帮助。

于 2013-07-12T11:40:21.490 回答
0

我面临着同样的事情。但是,既然屏幕大约是 1280x800 分辨率,为什么要使用这么大的偏移量?我相信系统坐标离真实显示坐标太远,导致平移/旋转/缩放操作计算错误。

尝试修改您的计算,以便在显示坐标内工作。

于 2017-04-12T03:45:12.603 回答