22

入力(text、text_font_size、device_width)を受け取るAndroidのメソッドを探しています。これらの計算に基づいて、特定のテキストを表示するために必要な高さを返しますか?

彼のコンテンツに基づいてテキスト ビュー/Web ビューの高さのランタイムを設定しています。

だから私は高さを計算しようとしており、それに基づいてビューの高さを設定しています。

私は次の方法で試しました

Paint paint = new Paint();
paint.setTextSize(text.length()); 
Rect bounds = new Rect();
paint.getTextBounds(text, 0, 1, bounds);
mTextViewHeight= bounds.height();

したがって、出力は

1) "Hello World" は、フォント 15 に対して高さ 13 を返します。

2) 「Jelly Bean の最新バージョンはこちらです。パフォーマンスが最適化されています」は、フォント 15 に対して高さ 16 を返します。

それから私は試してみました

Paint paint = new Paint();
paint.setTextSize(15);
paint.setTypeface(Typeface.SANS_SERIF);
paint.setColor(Color.BLACK);

Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), result);

Paint.FontMetrics metrics = brush.getFontMetrics();
int totalHeight = (int) (metrics.descent - metrics.ascent + metrics.leading);

したがって、出力は

1) "Hello World" は、フォント 15 に対して高さ 17 を返します。

2) 「Jelly Bean の最新バージョンがここにあります。パフォーマンスが最適化されています」は、フォント 15 に対して高さ 17 を返します。

これらの値を自分のビューに設定すると、一部のテキストが切り取られ、すべてのコンテンツが表示されるわけではありません。

繰り返しになりますが、一部のテーブルでは幅が広いため問題ないように見えますが、電話では問題ありません。

コンテンツに基づいて高さを計算する方法はありますか?

4

3 に答える 3

53
public static int getHeight(Context context, String text, int textSize, int deviceWidth) {
    TextView textView = new TextView(context);
    textView.setText(text);
    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
    int widthMeasureSpec = MeasureSpec.makeMeasureSpec(deviceWidth, MeasureSpec.AT_MOST);
    int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
    textView.measure(widthMeasureSpec, heightMeasureSpec);
    return textView.getMeasuredHeight();
}

がピクセル単位で指定されていない場合textSizeは、 の最初のパラメーターを変更しますsetTextSize()

于 2013-01-11T13:09:09.410 に答える
10

ペイントする前に線の実際の高さを知る簡単な方法があります。これが皆さんの助けになるかどうかはわかりませんが、線の高さを取得する私の解決策は、レイアウトの高さとは無関係です。次のようなフォント メトリックを取得します。

myTextView.getPaint().getFontMetrics().bottom - myTextView.getPaint().getFontMetrics().top)

これで、ペイントされるテキストビューからフォントが取得する実際の高さを取得します。これは int にはなりませんが、Math.round を作成して近い値を取得できます。

于 2016-10-19T13:48:21.000 に答える
9

Paint.getTextBounds() returns not what you would expect. Details are here.

Instead, you can try this way:

int mMeasuredHeight = (new StaticLayout(mMeasuredText, mPaint, targetWidth, Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true)).getHeight();
于 2013-03-13T13:16:42.517 に答える