it-swarm.com.de

So weisen Sie die Textgröße mithilfe des Java-Codes in sp-Werten zu

Wenn ich einen ganzzahligen Wert zum Ändern einer bestimmten Textgröße einer TextView mit Java-Code zuweisen, wird der Wert als Pixel (px) interpretiert. Weiß jetzt jemand, wie man es in SP zuweist?

180
capecrawler
475
Santosh

Mit dem DisplayMetrics -Objekt können Sie mit dem scaledDensity-Attribut zwischen Pixeln und skalierten Pixeln konvertieren.

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

Ein sauberer und wiederverwendbarer Ansatz ist

textgröße in dimens.xml-Datei im res/values/-Verzeichnis definieren: 

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

und wende es dann auf die TextView an:

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

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 eines Abstands in Pixel:

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

Wo die Einheit so etwas wie TypedValue.COMPLEX_UNIT_SP ist.

18
rekire

Standardmäßig 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.
12
Zeus Monolitics

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 einem Nicht-HD-Gerät: WishSp ist immer noch 25, Dichte = 1
  2. Auf einem HD-Gerät (wie Nexus 7 2nd Generation): Gewünschte Sp wird 50 ish, Dichte = 2
10
macio.Jun

Wenn die akzeptierte Antwort nicht funktioniert (zum Beispiel beim Umgang mit Paint), können Sie Folgendes verwenden: 

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

Dies ist der Code für das KonvertierungsformatPXinSPformat . 100% Works

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

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

Aus der Dokumentation:

Stellen Sie die Standardtextgröße auf den angegebenen Wert ein, der als "skalierte Pixel" -Einheiten interpretiert wird. 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 Folgendes tun:

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

Nachdem ich alle Lösungen ausprobiert hatte und keine akzeptablen Ergebnisse lieferte (vielleicht weil ich an einem Gerät mit sehr großen Standardschriftarten arbeitete), funktionierte Folgendes für mich (COMPLEX_UNIT_DIP = Device Independent Pixels):

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