4

Android デバイスの解像度に応じてテキストを動的にスケーリングする Android アプリがあります。Android シミュレータで事前定義されたすべての解像度でこのコードをテストしましたが、コードは正常に動作します。(これには、HTC Desire および Motorola Droid と同じ解像度が含まれます)

HTC Wildfire でも問題なく動作します。

シミュレーターのスクリーン ショットを次に示します。

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

ただし... HTC Desire でこれを試してみたところ、Motorola Droid を使用しているユーザーから、フォントが正しくスケーリングされていないという報告がありました。

ここに画像の説明を入力

テキストが切り落とされていることに注意してください。

これらの特定のデバイスでこれが機能しない理由はありますか?

私は現在、テキストの利用可能な高さに応じてテキストを縮小する関数を持っています...次のようなものです:

public static float calculateHeight(FontMetrics fm) {

    return Math.abs(fm.ascent) + fm.descent;

}


public static int determineTextSize(Typeface font, float allowableHeight) {

    Paint p = new Paint();
    p.setTypeface(font);

    int size = (int) allowableHeight;
    p.setTextSize(size);

    float currentHeight = calculateHeight(p.getFontMetrics());

    while (size!=0 && (currentHeight) > allowableHeight) {
            p.setTextSize(size--);
        currentHeight = calculateHeight(p.getFontMetrics());
    }

    if (size==0) {
        System.out.print("Using Allowable Height!!");
        return (int) allowableHeight;
    }

    System.out.print("Using size " + size);
    return size;
}

これがいくつかのデバイスでのみ発生する理由は何ですか? どうすれば修正できますか?ここで検討する必要がある、私が知らない別のフォントメトリックはありますか? スケールや DPI が好きですか?

ありがとう。

4

1 に答える 1

6

私が言及したいことが2つあります。

私の経験では、FontMetrics.bottomからFontMetrics.topを引くことにより、フォントの高さをピクセル単位で計算しました。これは、Y軸ごとの下部と上部の正と負の値によるものです。これについては、Androidのドキュメントを参照してください。したがって、calculateHeightメソッドを次のように変更します。

public static float calculateHeight(FontMetrics fm) {
    return fm.bottom - fm.top;
}

次に、determineTextSizeメソッドがサイズをピクセル単位で返すことを覚えておく必要があります。これを使用してTextViewなどのテキストサイズを設定する場合は、単位をTypedValue.COMPLEX_UNIT_PXとして指定する必要があります。このメソッドのデフォルトの単位はTypedValue.COMPLEX_UNIT_SPです。

于 2011-05-20T06:34:44.943 に答える