Se eu atribuir um valor inteiro para alterar um determinado tamanho de texto de um TextView
código java usando, o valor será interpretado como pixel ( px
).
Agora alguém sabe como atribuí-lo sp
?
Se eu atribuir um valor inteiro para alterar um determinado tamanho de texto de um TextView
código java usando, o valor será interpretado como pixel ( px
).
Agora alguém sabe como atribuí-lo sp
?
Respostas:
http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29
Exemplo:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
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.
Você pode usar um DisplayMetrics
objeto para ajudar a converter entre pixels e pixels em escala com o scaledDensity
atributo .
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity;
may be adjusted in smaller increments at runtime based on a user preference for the font size
que o tamanho da fonte será levado em consideração.
Uma abordagem mais limpa e reutilizável é
defina o tamanho do texto no dimens.xml
arquivo 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));
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
.
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.
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
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);
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
context.getResources().getDimension(R.dimen.text_size_in_dp))
COMPLEX_UNIT_PX
precisará dividir a densidade.
Este é o código para o formato PX para SP convertido . 100% Trabalhos
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
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);
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