Jeśli przypiszę wartość całkowitą, aby zmienić określony rozmiar tekstu TextView
używającego kodu Java, wartość zostanie zinterpretowana jako pixel ( px
).
Czy teraz ktoś wie, jak to przypisać sp
?
Jeśli przypiszę wartość całkowitą, aby zmienić określony rozmiar tekstu TextView
używającego kodu Java, wartość zostanie zinterpretowana jako pixel ( px
).
Czy teraz ktoś wie, jak to przypisać sp
?
Odpowiedzi:
http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29
Przykład:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));
Uzyskanie tego rozmiaru tekstu już spowoduje konwersję SP do PX, biorąc pod uwagę zarówno gęstość ekranu, jak i współczynnik skali tekstu.
Za DisplayMetrics
pomocą tego scaledDensity
atrybutu można użyć obiektu do konwersji między pikselami a pikselami skalowanymi .
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
więc rozmiar czcionki zostanie wzięty pod uwagę.
Czystsze i bardziej uniwersalne podejście jest
zdefiniuj rozmiar tekstu w dimens.xml
pliku w res/values/
katalogu:
</resources>
<dimen name="text_medium">14sp</dimen>
</resources>
a następnie zastosuj go do TextView
:
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));
Na podstawie kodu źródłowego 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()));
}
Buduję tę funkcję do obliczania dowolnego wymiaru na piksele:
int getPixels(int unit, float size) {
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
return (int)TypedValue.applyDimension(unit, size, metrics);
}
Gdzie jednostka jest podobna TypedValue.COMPLEX_UNIT_SP
.
Domyślnie setTextSize, bez jednostek działa w SP (skaluje piksele)
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.
Dzięki @John Leehey i @PeterH:
desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);
Chodzi o to, jeśli zdefiniujesz R.dimen.desired_sp do 25 w pliku dimen.xml
Gdy zaakceptowana odpowiedź nie działa (na przykład w przypadku programu Paint), możesz użyć:
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
, musisz podzielić gęstość.
To jest kod do konwersji formatu PX na SP . 100% działa
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
Po wypróbowaniu wszystkich rozwiązań i braku dających akceptowalne wyniki (być może dlatego, że pracowałem na urządzeniu z domyślnymi bardzo dużymi czcionkami), następujące rozwiązanie działało dla mnie (COMPLEX_UNIT_DIP = piksele niezależne od urządzenia):
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
Od poziomu 1 interfejsu API można użyć tej public void setTextSize (float size)
metody.
Z dokumentacji:
Ustaw domyślny rozmiar tekstu na podaną wartość, interpretowaną jako jednostki „skalowanego piksela”. Rozmiar ten jest dostosowywany na podstawie bieżącej gęstości i preferencji rozmiaru czcionki użytkownika.
Parametry: size -> float: Skalowany rozmiar piksela.
Możesz więc po prostu zrobić:
textView.setTextSize(12); // your size in sp