Jak przypisać rozmiar tekstu w wartości sp za pomocą kodu Java


205

Jeśli przypiszę wartość całkowitą, aby zmienić określony rozmiar tekstu TextViewużywającego kodu Java, wartość zostanie zinterpretowana jako pixel ( px).

Czy teraz ktoś wie, jak to przypisać sp?

Odpowiedzi:


535

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

Przykład:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);

18
Ponieważ SP oznacza skalowane piksele , musisz zmniejszyć rozmiar według gęstości ekranu. Można to łatwo zrobić w następujący sposób: SCREEN_DENSITY = getResources (). GetDisplayMetrics (). Gęstość; yourView.setTextSize (TypedValue.COMPLEX_UNIT_SP, (pożądanyTextHeightInSP / SCREEN_DENSITY);
PeteH

4
Rozwiązanie nie działało dla mnie, gdy próbowałem zebrać SP z zasobów. PeteH, doprowadziłeś mnie na właściwy tor! Trik wykonał dla mnie: ... float textSize = getResources (). GetDimension (R.dimen.textsize) / getResources (). GetDisplayMetrics (). Gęstość; myTextView.setTextSize (TypedValue.COMPLEX_UNIT_SP, textSize);
P Kuijpers

52
Jeśli otrzymujesz rozmiar sp ze swoich zasobów, powinieneś użyć COMPLEX_UNIT_PX, w następujący sposób: 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.
Ciske Boekelo,

Dostarczone rozwiązanie działało dla mnie, jak pokazano. Dzięki!
Martin Erlic

35

Za DisplayMetricspomocą tego scaledDensityatrybutu 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; 

1
Spowoduje to uwzględnienie współczynnika skalowania gęstości ekranu, ale nie współczynnika skali tekstu, który użytkownik mógł określić za pomocą ustawień. Wierzę, że rozwiązanie @ Santosha weźmie ten czynnik pod uwagę, podczas gdy ten fragment nie.
greg7gkb

3
Ale czasami nie możesz użyć metody @Santosh, na przykład, gdy piszesz Farbę na płótnie. Wtedy ta metoda jest przydatna i działa całkiem dobrze, dlatego kciuki za te dwie odpowiedzi!
byemute

1
@ greg7gkb nieprawda, dokumentacja mówi, may be adjusted in smaller increments at runtime based on a user preference for the font sizewięc rozmiar czcionki zostanie wzięty pod uwagę.
Luca Vitucci,

32

Czystsze i bardziej uniwersalne podejście jest

zdefiniuj rozmiar tekstu w dimens.xmlpliku 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));

20

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.


ostatnia metoda to ratowanie życia.
Ajibola

12

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.

11

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

  1. Na urządzeniu innym niż HD: pożądana SP wciąż wynosi 25, gęstość = 1
  2. Na urządzeniu HD (jak Nexus 7 2. generacji): pożądana wartość Sp staje się 50 ish, gęstość = 2

11

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);

ok, to działa, właśnie tego chcę, dziękuję pomber za udostępnienie!
Park Eun Neul

8
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))

Wyjaśnij, w jaki sposób pomocne będzie ustawienie rozmiaru tekstu jako wartości w pikselach (COMPLEX_UNIT_PX). OP chce „przypisać rozmiar tekstu w wartości sp”
Bö macht Blau,

jeśli używasz COMPLEX_UNIT_PX, musisz podzielić gęstość.
William Hu

Myślę, że to dlatego, że getDimension już przekonwertował „dp” na „px”
Ali Mousavi Kherad,

3

To jest kod do konwersji formatu PX na SP . 100% działa

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);

0

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);

0

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.