So weisen Sie die Textgröße in sp-Wert mithilfe von Java-Code zu


205

Wenn ich einen ganzzahligen Wert zum Ändern einer bestimmten Textgröße eines TextViewverwendeten Java-Codes zuweise, wird der Wert als pixel ( px) interpretiert .

Weiß jetzt jemand, wie man es zuweist sp?

Antworten:


535

http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29

Beispiel:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);

18
Da SP für skalierte Pixel steht, müssen Sie die Größe um die Bildschirmdichte reduzieren. Dies ist ganz einfach wie folgt: SCREEN_DENSITY = getResources (). GetDisplayMetrics (). Density; yourView.setTextSize (TypedValue.COMPLEX_UNIT_SP, (gewünschteTextHeightInSP / SCREEN_DENSITY);
PeteH

4
Die Lösung hat bei mir nicht funktioniert, als ich versucht habe, SP aus Ressourcen zu sammeln. PeteH, du hast mich auf den richtigen Weg gebracht! Folgendes hat den Trick für mich getan: ... float textSize = getResources (). GetDimension (R.dimen.textsize) / getResources (). GetDisplayMetrics (). Density; myTextView.setTextSize (TypedValue.COMPLEX_UNIT_SP, textSize);
P Kuijpers

52
Wenn Sie die SP-Größe aus Ihren Ressourcen erhalten, sollten Sie COMPLEX_UNIT_PX wie folgt verwenden: textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));Wenn Sie Ihre Textgröße auf diese Weise ermitteln, wird SP bereits in PX konvertiert, wobei sowohl die Bildschirmdichte als auch der Textskalierungsfaktor berücksichtigt werden.
Ciske Boekelo

Die bereitgestellte Lösung funktionierte für mich wie gezeigt. Vielen Dank!
Martin Erlic

35

Sie können ein DisplayMetricsObjekt verwenden, um die Konvertierung zwischen Pixeln und skalierten Pixeln mit dem scaledDensityAttribut zu unterstützen .

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

1
Dies berücksichtigt den Skalierungsfaktor der Bildschirmdichte, nicht jedoch den Textskalierungsfaktor, den der Benutzer möglicherweise über die Einstellungen festgelegt hat. Ich glaube, dass die Lösung von @ Santosh diesen Faktor berücksichtigen wird, während dieses Snippet dies nicht tut.
Greg7gkb

3
Aber manchmal können Sie die Methode von @Santosh nicht verwenden, wenn Sie beispielsweise eine Farbe in eine Leinwand schreiben. Dann ist diese Methode praktisch und funktioniert ziemlich gut, daher Daumen hoch für diese beiden Antworten!
bis zum

@ greg7gkb nicht wahr, sagt Dokumentation may be adjusted in smaller increments at runtime based on a user preference for the font sizeso die Schriftgröße wird berücksichtigt werden.
Luca Vitucci

32

Sauberer und wiederverwendbarer Ansatz ist

Definieren Sie die Textgröße in der dimens.xmlDatei im res/values/Verzeichnis:

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

und wenden Sie es dann an TextView:

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

20

Basierend auf dem Quellcode von 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()));
}

Ich baue diese Funktion zum Berechnen einer Herabsetzung auf Pixel:

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

Wo Einheit so etwas ist TypedValue.COMPLEX_UNIT_SP.


Die letzte Methode ist ein Lebensretter.
Ajibola

12

Standardmäßig arbeitet setTextSize ohne Einheiten in SP (skaliert Pixel)

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

Danke @John Leehey und @PeterH:

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

Die Sache ist, wenn Sie R.dimen.desired_sp bis 25 in Ihrer dimen.xml definieren

  1. Auf Nicht-HD-Geräten: Gewünschter SP ist immer noch 25, Dichte = 1
  2. Auf einem HD-Gerät (wie dem Nexus 7 der 2. Generation): Gewünschter SP wird 50 ish, Dichte = 2

11

Wenn die akzeptierte Antwort nicht funktioniert (z. B. beim Umgang mit Farbe), können Sie Folgendes verwenden:

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

ok, es funktioniert, das ist was ich will, danke pomber für das teilen!
Park Eun Neul

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

Bitte erläutern Sie, wie hilfreich das Festlegen der Textgröße als Pixelwert (COMPLEX_UNIT_PX) ist. OP will "Textgröße in sp-Wert zuweisen"
Bö macht Blau

Wenn Sie verwenden COMPLEX_UNIT_PX, müssen Sie die Dichte teilen.
William Hu

Ich denke, das liegt daran, dass getDimension 'dp' bereits in 'px' konvertiert hat
Ali Mousavi Kherad

3

Dies ist der Code für die Konvertierung von PX in SP . 100% funktioniert

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);

0

Nachdem ich alle Lösungen ausprobiert hatte und keine akzeptable Ergebnisse lieferte (möglicherweise weil ich an einem Gerät mit standardmäßig sehr großen Schriftarten gearbeitet habe), funktionierte Folgendes für mich (COMPLEX_UNIT_DIP = Geräteunabhängige Pixel):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

0

Ab API-Ebene 1 können Sie die public void setTextSize (float size)Methode verwenden.

Aus der Dokumentation:

Stellen Sie die Standardtextgröße auf den angegebenen Wert ein, interpretiert als "skalierte Pixel" -Einheiten. Diese Größe wird basierend auf der aktuellen Dichte und der bevorzugten Schriftgröße des Benutzers angepasst.

Parameter: size -> float: Die skalierte Pixelgröße.

So können Sie einfach tun:

textView.setTextSize(12); // your size in sp
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.