web-dev-qa-db-ja.com

デバイスの幅とフォントサイズに基づいてTextViewの高さを測定する方法

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

彼のコンテンツに基づいてテキストビュー/ウェブビューの高さランタイムを設定しています。ワープコンテンツについては承知していますが、ウェブビューの最小の高さの問題のため、私の場合は使用できません。

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

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

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に戻します

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

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

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

21
Mac
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()の最初のパラメーターを変更します。

47

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

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

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

9
jfcogato

Paint.getTextBounds()は期待した結果を返しません。詳細は こちら です。

代わりに、次の方法を試すことができます。

int mMeasuredHeight = (new StaticLayout(mMeasuredText, mPaint, targetWidth, Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true)).getHeight();
7
Prizoff