1

canvas.drawLines() に行き詰まりました。

私のアプリケーションはトラックを地図ビューに表示しますが、結果の線はひどいものです。誰かがそのような行動を見ましたか?つまり、線は同じ幅ではなく、「正方形」でもなく、菱形であり、時には消えることさえあります!

代わりに for(){drawLine()} でテストし、代わりに drawPath でテストしました-同じ問題。

スクリーンショットは、富士通の 10 インチ タブレット 1280x800 で撮影したものです。Lenovo タブレットでも同じことが示されています。

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 に答える