Wie Textgröße in SP-Wert unter Verwendung von Java-Code zuweisen
Frage
Wenn I einen ganzzahligen Wert zuweisen, einen bestimmten Textgröße eines TextView
unter Verwendung von Java-Code zu ändern, wird der Wert als Pixel (px
) interpretiert.
Jetzt Wer weiß, wie es in sp
zuweisen?
Lösung
Beispiel:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
Andere Tipps
Sie können mit einem DisplayMetrics
Objekt, um Hilfe zu konvertieren zwischen den Pixeln und skalierten Pixel mit dem scaledDensity
Attribute .
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity;
Reiniger und wieder verwendbarer Ansatz ist
Textgröße in dimens.xml
Datei in res/values/
Verzeichnis definieren:
</resources>
<dimen name="text_medium">14sp</dimen>
</resources>
und dann gilt es auf die TextView
:
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));
Auf der Grundlage der der Quellcode 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 diese Funktion bauen für calulating jede demension zu Pixel:
int getPixels(int unit, float size) {
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
return (int)TypedValue.applyDimension(unit, size, metrics);
}
Wo Einheit ist so etwas wie TypedValue.COMPLEX_UNIT_SP
.
Standardmäßig SetTextSize, ohne Einheiten arbeiten in SP (Skalen 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.
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 Ihrem dimen.xml
definieren- Ein Nicht-HD-Gerät: desiredSp ist nach wie vor 25, Dichte = 1
- Ein HD-Gerät (wie Nexus 7 2. Generation): desiredSp wird 50 ish, Dichte = 2
Wenn die akzeptierte Antwort nicht funktioniert (zum Beispiel, wenn sie mit Farbe zu tun) Sie können verwendet werden:
float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
context.getResources().getDimension(R.dimen.text_size_in_dp))
Dies ist der Code für die convert PX SP Format. 100% Arbeiten
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
Nachdem alle Lösungen versucht und keine akzeptable Ergebnisse geben (vielleicht, weil ich auf einem Gerät mit Standard sehr großen Schriften arbeiten wurde), wird die folgende arbeitete für mich (COMPLEX_UNIT_DIP = Device Independent Pixel):
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
Von Api Stufe 1, können Sie die public void setTextSize (float size)
Verfahren.
Aus der Dokumentation:
Stellen Sie die Standardtextgröße auf den angegebenen Wert, interpretiert als „skaliert Pixel“Einheiten. Diese Größe eingestellt wird, basierend auf der Stromdichte und Benutzerschriftgröße bevorzugt.
Parameter: . Größe -> float: Die skalierte Pixelgröße
So können Sie einfach do:
textView.setTextSize(12); // your size in sp
Im Fall, wenn jemand für Kotlin Weg suchen, können Sie
view.textSize = 12f