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?

capecrawler
fonte

Respostas:

535

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

Exemplo:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
Santosh
fonte
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; 
Dave Webb
fonte
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));
klimat
fonte
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.

rekire
fonte
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.
Zeus Monolitics
fonte
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
macio.Jun
fonte
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);
pomber
fonte
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))
William Hu
fonte
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);
Kamran Gasimov
fonte
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);
tsig
fonte
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
user2342558
fonte