web-dev-qa-db-ja.com

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

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

誰でもspでそれを割り当てる方法を知っていますか?

196
capecrawler
506
Santosh

DisplayMetrics オブジェクトを使用して、 scaledDensity属性 を使用してピクセルとスケーリングされたピクセルを変換できます。

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

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

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));
32
klimat

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);
}

UnitはTypedValue.COMPLEX_UNIT_SPのようなものです。

19
rekire

デフォルトでは、単位なしの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.
12
Zeus Monolitics

@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
10
macio.Jun

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

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);
10
pomber
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))
8
William Hu

これはPXからSP形式に変換するためのコードです。 100%作品

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
2
Kamran Gasimov

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

ドキュメントから:

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

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

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

textView.setTextSize(12); // your size in sp
0
user2342558

すべてのソリューションを試してみて、許容できる結果が得られない場合(おそらく、デフォルトの非常に大きなフォントを使用するデバイスで作業していたため)、次のように動作しました(COMPLEX_UNIT_DIP = Device Independent Pixels):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
0
tsig