11 ответов:
http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29
пример:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
можно использовать
DisplayMetricsобъект, который поможет конвертировать между пикселями и масштабированными пикселями с помощьюscaledDensityатрибут.DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); pixelSize = (int)scaledPixelSize * dm.scaledDensity;
более чистый и более многоразовый подход
определить размер текста в внутри :
</resources> <dimen name="text_medium">14sp</dimen> </resources>, а затем применить его к
TextView:textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));
на основе исходного кода
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())); }Я строю эту функцию для вычисления любого разложения на пиксели:
int getPixels(int unit, float size) { DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); return (int)TypedValue.applyDimension(unit, size, metrics); }где единица-это что-то вроде
TypedValue.COMPLEX_UNIT_SP.
по умолчанию setTextSize, без единиц работы в SP (масштабирует пиксель)
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.
спасибо @John Leehey и @PeterH:
desiredSp = getResources().getDimension(R.dimen.desired_sp); density = getResources().getDisplayMetrics().density; textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);дело в том, что вы определяете R. dimen.desired_sp до 25 в вашем dimen.xml
- на устройстве без HD: desiredSp по-прежнему 25, плотность = 1
- на устройстве HD(например, Nexus 7 2-го поколения): desiredSp становится 50 иш, плотность = 2
когда принятый ответ не работает (например при работе с краской) можно использовать:
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))
Это код для преобразования PX до SP. 100% работает
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
после того, как я попробовал все решения и ни один из них не дал приемлемых результатов (возможно, потому, что я работал на устройстве с очень большими шрифтами по умолчанию), для меня сработало следующее (COMPLEX_UNIT_DIP = Device Independent Pixels):
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
Comments