Wenn ich einen ganzzahligen Wert zum Ändern einer bestimmten Textgröße eines TextView
verwendeten Java-Codes zuweise, wird der Wert als pixel ( px
) interpretiert .
Weiß jetzt jemand, wie man es zuweist sp
?
Wenn ich einen ganzzahligen Wert zum Ändern einer bestimmten Textgröße eines TextView
verwendeten Java-Codes zuweise, wird der Wert als pixel ( px
) interpretiert .
Weiß jetzt jemand, wie man es zuweist sp
?
Antworten:
http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29
Beispiel:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
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.
Sie können ein DisplayMetrics
Objekt verwenden, um die Konvertierung zwischen Pixeln und skalierten Pixeln mit dem scaledDensity
Attribut zu unterstützen .
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity;
may be adjusted in smaller increments at runtime based on a user preference for the font size
so die Schriftgröße wird berücksichtigt werden.
Sauberer und wiederverwendbarer Ansatz ist
Definieren Sie die Textgröße in der dimens.xml
Datei 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));
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
.
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.
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
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);
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
context.getResources().getDimension(R.dimen.text_size_in_dp))
COMPLEX_UNIT_PX
, müssen Sie die Dichte teilen.
Dies ist der Code für die Konvertierung von PX in SP . 100% funktioniert
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
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);
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