2011-01-09 21 views
4

私はdrawTextOnPath()を使用してキャンバスにテキストを表示しています。描画されるテキストのサイズを知る必要があります。私はこれが複数のセグメント、曲線などで構成されるパスでは実現不可能であることを知っていますが、私のパスは完全に水平な単一のセグメントです。私はPaint.getTextBounds()を使用して、描画したいテキストの大きさのRectを取得しています。drawTextOnPath()によってキャンバス上に描画されるテキストのサイズを正確に測定する方法

私はこの矩形を使用して、任意の場所に描画するときにテキストの周りにバウンディングボックスを描画します。

ここで私が現在やっているものを反映して、いくつかの単純化されたコードです:

// to keep this example simple, always at origin (0,0) 
public drawBoundedText(Canvas canvas, String text, Paint paint) { 
    Rect textDims = new Rect(); 
    paint.getTextBounds(text,0, text.length(), textDims); 
    float hOffset = 0; 
    float vOffset = paint.getFontMetrics().descent; // vertically centers text 
    float startX = textDims.left;/0 
    float startY = textDims.bottom; 
    float endX = textDims.right; 
    float endY = textDims.bottom; 

    path.moveTo(startX, startY); 
    path.lineTo(endX, endY); 
    path.close(); 

    // draw the text 
    canvas.drawTextOnPath(text, path, 0, vOffset, paint); 

    // draw bounding box 
    canvas.drawRect(textDims, paint); 
} 

結果は-close-が、完全ではないが。 2行目から最後の行を次のように置き換えた場合:

canvas.drawText(text, startX, startY - vOffset, paint); 

これは完全に機能します。通常、右端と下端には1〜3ピクセルのギャップがあります。このエラーはフォントサイズによっても異なるようです。何か案は?私はすべてを正しくやっている可能性があり、問題はdrawTextOnPath()です。パスが水平であっても、補間アルゴリズムやその背後で使用されているものが原因で、パスに沿って描画するときにテキストの品質が著しく低下します。私は、サイズのジッタもそこから来ていることを知って驚いていません。

+0

descentがペイントの関数であり、getTextBounds()によって返されるRectangleが実際に使用されるテキストの関数なので、getTextBounds()と一緒にdescentを使用するのは良い考えではないことに気づきました。つまりすべての文字列に降順の文字が含まれるわけではありません。いずれにせよ、これは私が直面している問題ではありません。 – Nick

答えて

0

私は特定の状況に適した解決策を見つけましたが、元の質問は実際に解決されません。

特定のユースケースでは、1つのセグメントの直線パスに沿ってテキストが描画されるため、パスを一掃してCanvas.translate()およびcanvas.rotate()とともにCanvas.drawText()を使用することができました。これは、パスに沿って描画するときに見ていたテキストサイズのランダム性と醜さを取り除きました。

関連する問題