Javaコードを使用してsp値にテキストサイズを割り当てる方法


205

整数値を割り当てTextViewてJavaコードを使用して特定のテキストサイズを変更すると、値はピクセル(px)として解釈されます。

誰かがそれをどのように割り当てるか知っていますspか?

回答:


535

18
SPはスケーリングされたピクセルを表すので、画面密度によってサイズを減らす必要があります。これは次のように簡単に実行できます。SCREEN_DENSITY = getResources()。getDisplayMetrics()。density; yourView.setTextSize(TypedValue.COMPLEX_UNIT_SP、(desiredTextHeightInSP / SCREEN_DENSITY);
PeteH

4
リソースからSPを収集しようとしたときに、ソリューションが機能しませんでした。PeteH、あなたは私を正しい軌道に乗せました!次は私のためのトリックをしました:... float textSize = getResources()。getDimension(R.dimen.textsize)/ getResources()。getDisplayMetrics()。density; myTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP、textSize);
Pカイパーズ2014年

52
リソースからspサイズを取得する場合、次のようにCOMPLEX_UNIT_PXを使用する必要があります。textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));この方法でテキストサイズを取得すると、画面密度とテキストスケールファクターの両方を考慮して、SPがPXに変換されます。
Ciske Boekelo、2015

示されているように、提供されたソリューションは私にとってうまくいきました。ありがとう!
Martin Erlic 2017年

35

DisplayMetricsオブジェクトを使用すると、scaledDensity属性を持つピクセルとスケーリングされたピクセルの間の変換に役立ちます

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity; 

1
これは、画面密度スケーリング係数を考慮に入れますが、ユーザーが設定で指定したテキストスケール係数は考慮しません。@Santoshのソリューションではこの要素が考慮されるのに対し、このスニペットでは考慮されないと思います。
greg7gkb

3
ただし、ペイントをキャンバスに書き込むときなど、@ Santoshのメソッドを使用できない場合があります。次に、この方法が便利になり、うまく機能するので、これらの2つの答えを高く評価します。
byemute 2014

1
@ greg7gkbは正しくありません。ドキュメントにはmay be adjusted in smaller increments at runtime based on a user preference for the font size、フォントサイズ考慮されると記載されています。
Luca Vitucci

32

よりクリーンで再利用可能なアプローチは

ディレクトリ内のdimens.xmlファイルにテキストサイズを定義しますres/values/

</resources>
   <dimen name="text_medium">14sp</dimen>
</resources>

次にそれを適用しますTextView

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));

20

のソースコードに基づくsetTextSize

public void setTextSize(int unit, float size) {
    Context c = getContext();
    Resources r;

    if (c == null)
        r = Resources.getSystem();
    else
        r = c.getResources();

    setRawTextSize(TypedValue.applyDimension(
        unit, size, r.getDisplayMetrics()));
}

ピクセルの寸法を計算するために、この関数を作成します。

int getPixels(int unit, float size) {
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    return (int)TypedValue.applyDimension(unit, size, metrics);
}

単位はのようなものですTypedValue.COMPLEX_UNIT_SP


最後の方法は救命です。
Ajibola 14

12

デフォルトでは、単位なしのsetTextSizeがSPで機能します(ピクセルをスケーリング)

public void setTextSize (float size) 
Added in API level 1
Set the default text size to the given value, interpreted as "scaled pixel" units. This 
size is adjusted based on the current density and user font size preference.

11

@John Leeheyと@PeterHに感謝します。

desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);

問題は、dimen.xmlでR.dimen.desired_spを25に定義した場合です。

  1. 非HDデバイスの場合:desiredSpは依然として25、密度= 1
  2. HDデバイス(Nexus 7 2nd Generationなど):desiredSpは50 ish、密度= 2

11

受け入れられた回答が機能しない場合(たとえば、ペイントを扱う場合)は、以下を使用できます。

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);

わかりました、うまくいきました。それが私の望みです。それを共有してくれたpomberに感謝します。
レモン氏、

8
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))

テキストサイズをピクセル値(COMPLEX_UNIT_PX)として設定することがどのように役立つかを説明してください。OPは、「SP値のアサインテキストサイズ」に望んでいる
Boはブラウマクト

使用COMPLEX_UNIT_PXする場合は、密度を分割する必要があります。
ウィリアム・胡

getDimensionがすでに「dp」を「px」に変換しているためだと思います
Ali Mousavi Kherad

3

これは、PXSP形式に変換するためのコードです。100%の作品

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);

0

すべての解決策を試したところ、許容できる結果が得られなかった(おそらく、デフォルトの非常に大きなフォントを備えたデバイスで作業していたためである)後、次のことがうまくいきました(COMPLEX_UNIT_DIP = Device Independent Pixels):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

0

APIレベル1から、このpublic void setTextSize (float size)メソッドを使用できます。

ドキュメントから:

デフォルトのテキストサイズを、「スケーリングされたピクセル」単位として解釈される指定された値に設定します。このサイズは、現在の密度とユーザーフォントサイズの設定に基づいて調整されます。

パラメータ:size-> float:スケーリングされたピクセルサイズ。

だからあなたは簡単に行うことができます:

textView.setTextSize(12); // your size in sp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.