Если я присваиваю целочисленное значение для изменения определенного размера текста TextView
с использованием кода Java, это значение интерпретируется как пиксель (px
).
Теперь кто-нибудь знает, как назначить его в sp
?
Если я присваиваю целочисленное значение для изменения определенного размера текста TextView
с использованием кода Java, это значение интерпретируется как пиксель (px
).
Теперь кто-нибудь знает, как назначить его в sp
?
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;
Более чистый и многоразовый подход
определить размер текста в 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.
Если принятый ответ не работает (например, при работе с Paint), вы можете использовать:
float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);
Спасибо @Джон Лэйхи и @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
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 = Независимые от устройства пиксели):
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
На уровне Api 1 вы можете использовать public void setTextSize (float size)
.
Из документации:
Установите размер текста по умолчанию для данного значения, интерпретируемого как единицы измерения "масштабированный пиксель". Этот размер настраивается на основе текущей плотности и предпочтения размера шрифта пользователя.
Параметры: size → float: масштабированный размер пикселя.
Так что вы можете просто сделать:
textView.setTextSize(12); // your size in sp
В случае, если кто-то ищет путь Kotlin, вы можете сделать
view.textSize = 12f