0

複数行のテキストTextViewで私が定義した境界に収まるようにフォントサイズを計算する方法は?

私は のTextView中に を持っていRelativeLayoutます。それに基づいて、実行時にアプリの画面サイズが認識されます。

    Rect boundsTv = TextPositions.getTextViewBounds(1, mainActivity.mWidthPx, mainActivity.mHeightPx);
    Log.e("SlideLoader", "paint.boundsTv() left, right, top, bottom :"+boundsTv.flattenToString());//paint.boundsTv() left, right, top, bottom :163 363 1767 749

    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) tvText.getLayoutParams();
    params.width = boundsTv.width();// right - left;
    params.height = boundsTv.height();// bottom - top;
    params.leftMargin = boundsTv.left; // Your X coordinate
    params.topMargin = boundsTv.top; // Your Y coordinate
    tvText.setLayoutParams(params);
    tvText.invalidate();

そして、ここで問題が発生します。一部のデバイスでは、フォントが小さすぎて、TextView の半分未満しか表示されない場合があります。他のデバイスでは、大きすぎて半分にも収まりません。

出力コードは、フォントサイズがはるかに大きいデバイスからのものです。いくつかの方法を確認しましたが、おそらくこれら 2 つの方法が提案されますが、どちらも失敗します。

    // left, top - right, bottom        
    TextPaint paint = tvText.getPaint();        
    paint.getTextBounds(text, 0, text.length()-1, boundsTv);        
    Log.e("SlideLoader", "paint.getTextBounds() left, right, top, bottom :"+boundsTv.flattenToString());//paint.getTextBounds() left, right, top, bottom :2 -33 16049 9, how to interpret this values?!

    float width = paint.measureText(text);// for single line
4

2 に答える 2

1

たとえば、フォルダ名を使用して画面サイズに基づいてテキストサイズを定義してもかまわない場合:

res/values-sw600dp/dimens.xml

dimens.xml の内容

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="text_size">20sp</dimen>
</resources>

解像度/値-w1024dp

dimens.xml の内容

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="text_size">35sp</dimen>
</resources>

画面サイズ固有のテキスト サイズをレイアウト内で直接使用できるようになりました。

テキスト res/values/styles.xml のスタイルを定義することにしました

<style name="Text">
    <item name="android:padding">5dp</item>
    <item name="android:paddingLeft">10dp</item>
    <item name="android:paddingRight">10dp</item>
    <item name="android:shadowColor">@color/Grey</item>
    <item name="android:shadowDx">1</item>
    <item name="android:shadowDy">1</item>
    <item name="android:shadowRadius">1</item>
    <item name="android:textColor">@color/Black</item>
    <!-- Here the dimen/text_size is used -->
    <item name="android:textSize">@dimen/text_size</item>
    <item name="android:textStyle">bold</item>
    <item name="android:typeface">monospace</item>
    <item name="android:ellipsize">none</item>
    <item name="android:gravity">left</item>
    <item name="android:maxLines">1</item>
    <item name="android:background">@color/Transparent</item>
</style>

また、レイアウトに TextView を動的に追加するため、単純な entry.xml レイアウトを定義します。

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="false" />

それでおしまい。entry.xml レイアウトをインフレートすると、テキスト サイズはディスプレイのサイズを反映します。

ここでテクニックの詳細を読むことができます: http://wptrafficanalyzer.in/blog/different-layouts-for-different-screen-sizes-in-android/

于 2013-11-02T14:54:11.863 に答える
0

ここで私は解決策を投稿しました。誰かがこれよりも良い答えを出してくれることを願っています。

次の結果になることもあります: 1行半...

ここに画像の説明を入力

いくつかのテスト デバイス データ: 同じ画面サイズまたは画面サイズの比率、または Android バージョンなどの 2 つのデバイスがあることを確認できて「うれしい」です。:)

// Lenovo phone: DisplayMetrics{density=1.5, width=800, height=480, scaledDensity=1.6500001, xdpi=240.0, ydpi=240.0}        width/height: 1.666
// Lenovo tablet: DisplayMetrics{density=1.0, width=1024, height=552, scaledDensity=1.0, xdpi=160.0, ydpi=160.0}            width/height: 1.85
// Samsung tablet: DisplayMetrics{density=1.0, width=1280, height=752, scaledDensity=1.0, xdpi=149.82489, ydpi=150.51852}   width/height: 1.7
// THL phone:  DisplayMetrics{density=3.0, width=1920, height=1080, scaledDensity=3.3000002, xdpi=480.0, ydpi=480.0}        width/height: 1.77

ああ、幅と高さの比率が異なるため、テキストは同じ単語で終了しません。たまたま 1 行しかない場合もありますが、他のデバイスでは 2 行が必要でした...

        // get the text size
        int textSize = 50;
        int maxHeight = boundsTv.height();
        while (getHeightOfMultiLineText(text, textSize, params.width) > maxHeight) {
            textSize--;
        }
        float scaleFactor = mainActivity.getResources().getDisplayMetrics().density;
        float fuckingMagic = 1.8f; // large screens need a lower number, smaller screens a higher number.
        // Samsung tablet 1.4
        // THL phone 1.6
        // Lenovo phone: 2.2
        // Lenovo table 1.8

        float size = textSize / (fuckingMagic * scaleFactor);
于 2013-11-02T14:50:00.347 に答える