Java kodunu kullanarak sp değerinde metin boyutu atama


205

Bir TextViewjava kodu kullanarak belirli bir metin boyutunu değiştirmek için bir tamsayı değeri atarsam, değer piksel ( px) olarak yorumlanır .

Şimdi nasıl atanacağını bilen var spmı?

Yanıtlar:


535

18
SP ölçeklenmiş pikselleri temsil ettiğinden , boyutu ekran yoğunluğuna göre azaltmanız gerekir. Aşağıdaki gibi kolayca yapılabilir: SCREEN_DENSITY = getResources (). GetDisplayMetrics (). Density; yourView.setTextSize (TypedValue.COMPLEX_UNIT_SP, (wantedTextHeightInSP / SCREEN_DENSITY);
PeteH

4
Kaynaklardan SP toplamaya çalıştığımda çözüm benim için işe yaramadı. PeteH, beni doğru yola soktun! Aşağıdaki benim için hile yaptı: ... float textSize = getResources (). GetDimension (R.dimen.textsize) / getResources (). GetDisplayMetrics (). Density; myTextView.setTextSize (TypedValue.COMPLEX_UNIT_SP, textSize);
P Kuijpers

52
Sp boyutunu kaynaklarınızdan alırsanız, COMPLEX_UNIT_PX kullanmalısınız, şöyle: textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));Metin boyutunuzu bu şekilde almak, hem ekran yoğunluğunu hem de metin ölçeği faktörünü hesaba katarak SP'yi PX'e dönüştürecektir.
Ciske Boekelo

Sağlanan çözüm benim için gösterildiği gibi çalıştı. Teşekkürler!
Martin Erlic

35

ÖznitelikleDisplayMetrics pikseller ve ölçeklenmiş pikseller arasında dönüştürme işlemine yardımcı olması için bir nesne kullanabilirsiniz .scaledDensity

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

1
Bu, ekran yoğunluğu ölçeklendirme faktörünü hesaba katar, ancak kullanıcının ayarlar aracılığıyla belirtmiş olabileceği metin ölçeği faktörünü dikkate almaz. @ Santosh'un çözümünün bu faktörü dikkate alacağına inanıyorum, ancak bu pasaj bunu yapmıyor.
greg7gkb

3
Ancak bazen @Santosh yöntemini kullanamazsınız, örneğin bir tuvale Boya yazarken. Sonra bu yöntem kullanışlı ve oldukça iyi çalışıyor, bu nedenle bu iki cevap için başparmak yukarıya!
byemute

1
@ greg7gkb doğru değil, dokümantasyon diyor may be adjusted in smaller increments at runtime based on a user preference for the font sizeYazı boyutunu böylece edecek hesaba katılmalıdır.
Luca Vitucci

32

Daha temiz ve daha çok yeniden kullanılabilir yaklaşım

dizinin dimens.xmliçindeki dosyadaki metin boyutunu tanımlayın res/values/:

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

ve daha sonra aşağıdakilere uygulayın TextView:

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

20

Kaynak koduna göre 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()));
}

Ben piksel için herhangi bir demans hesaplamak için bu işlevi oluşturmak:

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

Ünite böyle bir şey TypedValue.COMPLEX_UNIT_SP.


son yöntem hayat kurtarıcıdır.
Ajibola

12

Varsayılan olarak setTextSize, birimler SP olmadan çalışır (piksel ölçeği)

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

John Leehey ve @PeterH'a teşekkürler:

desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);

Şey, dimen.xml dosyasında R.dimen.desired_sp öğesini 25 olarak tanımlamanızdır

  1. HD olmayan cihazda: desiredSp hala 25, yoğunluk = 1
  2. HD Cihazda (Nexus 7 2. Nesil gibi): desiredSp 50 ish, yoğunluk = 2 olur

11

Kabul edilen cevap çalışmadığında (örneğin Paint ile çalışırken) şunları kullanabilirsiniz:

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);

Tamam, işe yarıyor, İstediğim bu, paylaştığın için teşekkürler!
Bay Lemon

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

Lütfen metin boyutunu piksel değeri (COMPLEX_UNIT_PX) olarak ayarlamanın nasıl yardımcı olacağını açıklayın. OP "sp değerinde metin boyutu atamak" istiyor
Bö macht Blau

kullanırsanız COMPLEX_UNIT_PXyoğunluğu bölmeniz gerekir.
William Hu

Ben çünkü getDimension zaten 'dp' dönüştürmek 'px' için
Ali Mousavi Kherad

3

Bu dönüştürme için kodudur PX için SP formatında. % 100 İşler

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);

0

Tüm çözümleri denedikten ve kabul edilebilir sonuçlar vermedikten sonra (belki de varsayılan çok büyük yazı tiplerine sahip bir cihaz üzerinde çalıştığım için), aşağıdakiler benim için çalıştı (COMPLEX_UNIT_DIP = Cihazdan Bağımsız Piksel):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

0

Api düzey 1'den public void setTextSize (float size)yöntemi kullanabilirsiniz .

Belgelerden:

Varsayılan metin boyutunu, "ölçeklenmiş piksel" birimleri olarak yorumlanan belirli bir değere ayarlayın. Bu boyut, geçerli yoğunluk ve kullanıcı yazı tipi boyutu tercihine göre ayarlanır.

Parametreler: size -> float: Ölçekli piksel boyutu.

Böylece şunları yapabilirsiniz:

textView.setTextSize(12); // your size in sp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.