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?

Capecrawler
quelle

Antworten:

535

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

Beispiel:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
Santosh
quelle
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; 
Dave Webb
quelle
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));
klimat
quelle
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.

rekire
quelle
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.
Zeus-Monolitik
quelle
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
macio.Jun
quelle
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);
pomber
quelle
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))
William Hu
quelle
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);
Kamran Gasimov
quelle
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);
tsig
quelle
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
user2342558
quelle