60

canvasを使用して特定の幅のテキストを描画したい.drawtext

たとえば400px、入力テキストが何であれ、テキストの幅は常に一定であるべきです。

入力テキストが長い場合はフォント サイズが小さくなり、入力テキストが短い場合はそれに応じてフォント サイズが大きくなります。

4

3 に答える 3

119

より効率的な方法を次に示します。

/**
 * Sets the text size for a Paint object so a given string of text will be a
 * given width.
 * 
 * @param paint
 *            the Paint to set the text size for
 * @param desiredWidth
 *            the desired width
 * @param text
 *            the text that should be that width
 */
private static void setTextSizeForWidth(Paint paint, float desiredWidth,
        String text) {

    // Pick a reasonably large value for the test. Larger values produce
    // more accurate results, but may cause problems with hardware
    // acceleration. But there are workarounds for that, too; refer to
    // http://stackoverflow.com/questions/6253528/font-size-too-large-to-fit-in-cache
    final float testTextSize = 48f;

    // Get the bounds of the text, using our testTextSize.
    paint.setTextSize(testTextSize);
    Rect bounds = new Rect();
    paint.getTextBounds(text, 0, text.length(), bounds);

    // Calculate the desired size as a proportion of our testTextSize.
    float desiredTextSize = testTextSize * desiredWidth / bounds.width();

    // Set the paint for that size.
    paint.setTextSize(desiredTextSize);
}

次に、あなたがする必要があるのはsetTextSizeForWidth(paint, 400, str);(質問の幅の例は400です)だけです。

効率をさらに高めるためにRect、静的クラス メンバーを作成して、毎回インスタンス化する手間を省くことができます。ただし、これにより同時実行性の問題が発生する可能性があり、間違いなくコードの明瞭性が妨げられます。

于 2014-02-20T00:27:35.840 に答える
28

これを試して:

/**
 * Retrieve the maximum text size to fit in a given width.
 * @param str (String): Text to check for size.
 * @param maxWidth (float): Maximum allowed width.
 * @return (int): The desired text size.
 */
private int determineMaxTextSize(String str, float maxWidth)
{
    int size = 0;       
    Paint paint = new Paint();

    do {
        paint.setTextSize(++ size);
    } while(paint.measureText(str) < maxWidth);

    return size;
} //End getMaxTextSize()
于 2012-08-28T19:51:08.193 に答える