7

Paint クラスにはメソッドがあります: Paint.getTextBounds()Rectは、何らかのテキストで占められているものを返します。しかし、この答えによると、TextViewの幅/高さとは異なるものを返します。

Q1: Paint.getTextBounds()Rectによって返されるTextView の幅と高さを取得する方法はありますか?

幅/高さを正確に知る必要があることに注意してください。約 2 ~ 3% のエラーが発生する可能性のある の上限を喜んでお知らせrectしますが、それより大きくしてはいけません (画面の解像度とピクセル密度に依存しないすべての電話で機能するはずです)。

Q2: 指定された textSize でテキストの幅と高さを決定する他の QUICK メソッドはありますか?

幅はPaint.measureText()で決定できますが、これは高さを返しません。高さはStaticLayoutテキストで new を作成してからStaticLayout.getHeight()を呼び出すことで決定できますが、これは遅すぎます。もっと速いものが必要です。


このすべての背景は、AutoFitTextViewテキスト サイズを拡大または縮小することによって、テキストをその境界内に自動的に収まるようにすることです。このようなAutoFitTextViews の多くは動的に非常に迅速に変更されるため、これは迅速に行う必要があります。

4

2 に答える 2

10

Paintを使用しない特定の方法で描画されたテキストの幅/高さを決定する、シンプルで遅くない方法を見つけましたStaticLayout

public int getTextWidth(String text, Paint paint) {
    Rect bounds = new Rect();
    paint.getTextBounds(text, 0, text.length(), bounds);
    int width = bounds.left + bounds.width();
    return width;
}

public int getTextHeight(String text, Paint paint) {
    Rect bounds = new Rect();
    paint.getTextBounds(text, 0, text.length(), bounds);
    int height = bounds.bottom + bounds.height();
    return height;
}

トリックの短い簡単な説明:から始まらないPaint.getTextBounds(String text, int start, int end, Rect bounds)戻り値。つまり、同じオブジェクトを呼び出して設定されるテキストの実際の幅を取得するには、 の左位置を追加する必要があります。Rect(0,0)Canvas.drawText(String text, float x, float y, Paint paint) PaintgetTextBounds()Rect

これに注意してくださいbounds.left- これが問題の鍵です。

このようにして、 を使用して受け取るのと同じ幅のテキストを受け取りますCanvas.drawText()


この回答では、より詳細な説明が提供されています。

于 2013-03-13T23:45:15.393 に答える
1

Java では、FontMetrics クラスを使用しました。

Font f= new Font("Arial", Font.BOLD, 16);
FontMetrics metric = getFontMetrics(f);


metric.stringWidth("the text I want to measure");
于 2013-03-13T13:33:01.797 に答える