0

誰かが私がAndroidのクレイジーなCanvasクラスを理解するのを手伝ってくれます。正確ではないようで、パラメータが浮動小数点値である理由がよくわかりません。たとえば、絶対点の値を使用して、描画したいポリゴンを次に示します。

       mPaint.setStyle(Paint.Style.STROKE);
       mPaint.setColor(Color.RED);
       mPaint.setAntiAlias(false);
       mPaint.setDither(false);
       mPaint.setFilterBitmap(false);

       Path path1 = new Path();
       path1.moveTo(151, 100);
       path1.lineTo(200, 200);
       path1.lineTo(100, 151);
       path1.lineTo(200, 151);
       path1.lineTo(100, 201);
       path1.lineTo(151, 100);
       //   So that these points constitute a closed polygon  
       path1.setFillType(Path.FillType.EVEN_ODD);
       mPaint.setStyle(Paint.Style.FILL);
       mPaint.setColor(Color.GRAY);
       //   Draw the polygon  
       mCanvas.drawPath(path1, mPaint);

Windows GDIを使用してWindowsで同様のコードを実行すると、ポイントが正確に特定されます。ただし、Androidでは、次の2つの問題があります。

1)アンチエイリアシングをオフにしたのに、線がアンチエイリアシングされているように見えます(灰色の線の周りに黒っぽいピクセルがあります)。2)必ずしも指定されたポイントに達するとは限りません。することもあればしないこともあります

私が望んでいたポイントに近づくために、私はこれをしなければなりません:

       Path path1 = new Path();
       path1.moveTo(151, 100-1);
       path1.lineTo(200+1, 200+1);
       path1.lineTo(100-1, 151);
       path1.lineTo(200+2, 151);
       path1.lineTo(100, 201);
       path1.lineTo(151+1, 100);

ここでのルールや、それがとても奇妙なことを理解することはできません。

4

1 に答える 1

1

それはあなたが意味するPathクラスとは異なり、Canvasではありません。ここで、ディザーを true に設定することをお勧めしますmPaint.setDither(true)。ディザーの方法を引用させてください。

setFlags() のヘルパー、DITHER_FLAG ビットの設定またはクリア ディザリングは、デバイスよりも精度の高い色をダウンサンプリングする方法に影響します。ディザリングなしは一般的に高速ですが、高精度の色は切り捨てられます (例: 8888 -> 565)。ディザリングは、視覚的なアーティファクトを減らすために、このプロセスに固有のエラーを分散しようとします。

つまり、色の解析に問題がある可能性があることを示しています。そのため、それが問題の原因となっている可能性があります。

于 2012-06-22T00:30:29.080 に答える