Если я присваиваю целочисленное значение для изменения определенного размера текста с TextView
использованием кода Java, значение интерпретируется как pixel ( px
).
Теперь кто-нибудь знает, как его назначить sp
?
Если я присваиваю целочисленное значение для изменения определенного размера текста с TextView
использованием кода Java, значение интерпретируется как pixel ( px
).
Теперь кто-нибудь знает, как его назначить sp
?
Ответы:
http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29
Пример:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));
получение размера текста таким образом уже преобразует SP в PX, принимая во внимание как плотность экрана, так и масштабный коэффициент текста.
Вы можете использовать DisplayMetrics
объект, чтобы помочь преобразовать между пикселями и масштабированными пикселями с scaledDensity
атрибутом .
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
что размер шрифта будет учитываться.
Более чистый и многократно используемый подход
определить размер текста в dimens.xml
файле внутри res/values/
каталога:
</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.
Спасибо @Джон Лихи и @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 в вашем измерениях.
Когда принятый ответ не работает (например, при работе с Paint), вы можете использовать:
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
вам нужно разделить плотность.
Это код для преобразования формата PX в SP . 100% работает
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
После того, как были опробованы все решения, но ни одно из них не дало приемлемых результатов (возможно, из-за того, что я работал на устройстве с очень большими шрифтами по умолчанию), у меня сработало следующее (COMPLEX_UNIT_DIP = Независимые от устройства пиксели):
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
С уровня API 1, вы можете использовать public void setTextSize (float size)
метод.
Из документации:
Установите размер текста по умолчанию для данного значения, интерпретируемого как единицы измерения «масштабированный пиксель». Этот размер регулируется на основе текущей плотности и предпочтения размера шрифта пользователя.
Параметры: size -> float: масштабированный размер пикселя.
Так что вы можете просто сделать:
textView.setTextSize(12); // your size in sp