Как назначить размер текста в sp значение с помощью java-кода

Если я присваиваю целочисленное значение для изменения определенного размера текста TextView с использованием кода Java, это значение интерпретируется как пиксель (px).

Теперь кто-нибудь знает, как назначить его в sp?

Ответ 2

Вы можете использовать объект DisplayMetrics для преобразования между пикселями и масштабированными пикселями с помощью scaledDensity.

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity; 

Ответ 3

Более чистый и многоразовый подход

определить размер текста в 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));

Ответ 4

На основе исходного кода 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.

Ответ 5

По умолчанию 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.

Ответ 6

Если принятый ответ не работает (например, при работе с Paint), вы можете использовать:

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);

Ответ 7

Спасибо @Джон Лэйхи и @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: wishSp все еще 25, плотность = 1
  • На устройстве HD (например, Nexus 7 2nd Generation): желаемый Sp становится равным 50 иш, плотность = 2

Ответ 8

semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))

Ответ 9

Это код для преобразования PX в SP. 100% работает

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);

Ответ 10

После того, как были опробованы все решения, но ни одно из них не дало приемлемых результатов (возможно, из-за того, что я работал на устройстве с очень большими шрифтами по умолчанию), у меня сработало следующее (COMPLEX_UNIT_DIP = Независимые от устройства пиксели):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

Ответ 11

На уровне Api 1 вы можете использовать public void setTextSize (float size).

Из документации:

Установите размер текста по умолчанию для данного значения, интерпретируемого как единицы измерения "масштабированный пиксель". Этот размер настраивается на основе текущей плотности и предпочтения размера шрифта пользователя.

Параметры: size → float: масштабированный размер пикселя.

Так что вы можете просто сделать:

textView.setTextSize(12); // your size in sp

Ответ 12

В случае, если кто-то ищет путь Kotlin, вы можете сделать

view.textSize = 12f