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?

capecrawler
źródło

Odpowiedzi:

535

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

Przykład:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
Santosh
źródło
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; 
Dave Webb
źródło
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));
klimat
źródło
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.

rekire
źródło
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.
Zeus Monolitics
źródło
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
macio.Jun
źródło
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);
pomber
źródło
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))
William Hu
źródło
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);
Kamran Gasimov
źródło
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);
tsig
źródło
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
użytkownik2342558
źródło