Como atribuir tamanho de texto no valor sp usando código java


205

Se eu atribuir um valor inteiro para alterar um determinado tamanho de texto de um TextViewcódigo java usando, o valor será interpretado como pixel ( px).

Agora alguém sabe como atribuí-lo sp?

Respostas:


535

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

Exemplo:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);

19
Como SP significa pixels em escala, você precisará reduzir o tamanho pela densidade da tela. É fácil fazer o seguinte: SCREEN_DENSITY = getResources (). GetDisplayMetrics (). Density; yourView.setTextSize (TypedValue.COMPLEX_UNIT_SP, (desiredTextHeightInSP / SCREEN_DENSITY);
Peteh

4
A solução não funcionou para mim quando tentei coletar o SP dos recursos. PeteH, você me colocou no caminho certo! O seguinte foi o truque para mim: ... float textSize = getResources (). GetDimension (R.dimen.textsize) / getResources (). GetDisplayMetrics (). Density; myTextView.setTextSize (TypedValue.COMPLEX_UNIT_SP, textSize);
precisa

52
Se você obtiver o tamanho sp de seus recursos, deverá usar o COMPLEX_UNIT_PX, assim: textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));Obter o tamanho do texto dessa maneira já converterá SP em PX, levando em consideração a densidade da tela e o fator de escala do texto.
Ciske Boekelo

A solução fornecida funcionou para mim, como mostrado. Obrigado!
Martin Erlic 23/01

35

Você pode usar um DisplayMetricsobjeto para ajudar a converter entre pixels e pixels em escala com o scaledDensityatributo .

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

1
Isso levará em consideração o fator de escala da densidade da tela, mas não o fator de escala do texto que o usuário pode ter especificado através das configurações. Acredito que a solução da @ Santosh levará esse fator em consideração, enquanto esse snippet não.
Greg7gkb

3
Mas, às vezes, você não pode usar o método @Santosh, por exemplo, quando escreve um Paint em uma tela. Então, esse método é útil e funciona muito bem, portanto, você gostei dessas duas respostas!
Byemute

1
@ greg7gkb não é verdade, a documentação diz may be adjusted in smaller increments at runtime based on a user preference for the font sizeque o tamanho da fonte será levado em consideração.
Luca Vitucci

32

Uma abordagem mais limpa e reutilizável é

defina o tamanho do texto no dimens.xmlarquivo dentro do res/values/diretório:

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

e aplique-o ao TextView:

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

20

Com base no código fonte de 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()));
}

Eu construo esta função para calcular qualquer demension para pixels:

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

Onde a unidade é algo parecido TypedValue.COMPLEX_UNIT_SP.


o último método é um salva-vidas.
Ajibola

12

Por padrão, setTextSize, sem unidades, trabalha em SP (dimensiona o 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.

11

Obrigado, @John Leehey e @PeterH:

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

O problema é que se você definir R.dimen.desired_sp como 25 no seu dimen.xml

  1. Em dispositivos que não sejam HD: SPS desejado ainda é 25, densidade = 1
  2. No dispositivo HD (como o Nexus 7 2ª geração): SPS desejado torna-se 50 ish, densidade = 2

11

Quando a resposta aceita não funcionar (por exemplo, ao lidar com o Paint), você pode usar:

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

ok, funciona, é isso que eu quero, obrigado pomber por compartilhá-lo!
Sr. Lemon

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

Explique como a configuração do tamanho do texto como valor de pixel (COMPLEX_UNIT_PX) será útil. OP quer "tamanho do texto de atribuição de valor sp"
Bö Macht Blau

se você usar, COMPLEX_UNIT_PXprecisará dividir a densidade.
William Hu

Eu acho que é porque getDimension já converteu 'dp' em 'px'
Ali Mousavi Kherad 13/10

3

Este é o código para o formato PX para SP convertido . 100% Trabalhos

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);

0

Depois de tentar todas as soluções e nenhuma fornecer resultados aceitáveis ​​(talvez porque eu estivesse trabalhando em um dispositivo com fontes muito grandes padrão), o seguinte funcionou para mim (COMPLEX_UNIT_DIP = Pixels independentes do dispositivo):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

0

No Api nível 1, você pode usar o public void setTextSize (float size)método

A partir da documentação:

Defina o tamanho do texto padrão para o valor fornecido, interpretado como unidades de "pixel dimensionado". Esse tamanho é ajustado com base na densidade atual e na preferência do tamanho da fonte do usuário.

Parâmetros: size -> float: o tamanho do pixel em escala.

Então você pode simplesmente fazer:

textView.setTextSize(12); // your size in sp
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.