Как назначить размер текста в значении sp, используя код Java


206

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

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

Ответы:


537

http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29

Пример:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);

19
Поскольку SP обозначает масштабированные пиксели, вам нужно уменьшить размер в зависимости от плотности экрана. Это легко сделать следующим образом: SCREEN_DENSITY = getResources (). GetDisplayMetrics (). Density; yourView.setTextSize (TypedValue.COMPLEX_UNIT_SP, (requiredTextHeightInSP / SCREEN_DENSITY);
PeteH

4
Решение не сработало для меня, когда я попытался собрать SP из ресурсов. PeteH, ты вывел меня на правильный путь! Следующие действия помогли мне: ... float textSize = getResources (). GetDimension (R.dimen.textsize) / getResources (). GetDisplayMetrics (). Density; myTextView.setTextSize (TypedValue.COMPLEX_UNIT_SP, textSize);
P Kuijpers

52
Если вы получаете размер sp из своих ресурсов, вам следует использовать COMPLEX_UNIT_PX, например так: textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));получение размера текста таким образом уже преобразует SP в PX, принимая во внимание как плотность экрана, так и масштабный коэффициент текста.
Ciske Boekelo

Предоставленное решение работает для меня, как показано на рисунке. Спасибо!
Мартин Эрлик

35

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

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

1
При этом будет учитываться коэффициент масштабирования плотности экрана, но не коэффициент масштабирования текста, который пользователь мог указать в настройках. Я полагаю, что решение @ Santosh будет учитывать этот фактор, а этот фрагмент - нет.
greg7gkb

3
Но иногда вы не можете использовать метод @Santosh, например, когда пишете Paint на холсте. Тогда этот метод пригодится и работает довольно хорошо, поэтому спасибо за эти два ответа!
позднее

1
@ greg7gkb не соответствует действительности, в документации сказано, may be adjusted in smaller increments at runtime based on a user preference for the font sizeчто размер шрифта будет учитываться.
Лука Витуччи

32

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

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

20

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


последний метод спасения жизни.
Аджибола

12

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

11

Спасибо @Джон Лихи и @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 в вашем измерениях.

  1. На устройстве без HD: требуемый SP все еще равен 25, плотность = 1
  2. На HD-устройстве (например, Nexus 7 2nd Generation): требуемый SP становится 50 иш, плотность = 2

11

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

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

хорошо, это работает, это то, что я хочу, спасибо pomber за то, что поделился этим!
Мистер Лимон

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

Пожалуйста, объясните, как будет полезна установка размера текста в виде значения в пикселях (COMPLEX_UNIT_PX). ОП хочет «назначить размер текста в значении sp»
Bö macht Blau

если вы используете, COMPLEX_UNIT_PXвам нужно разделить плотность.
Уильям Ху

Я думаю, это потому, что getDimension уже преобразовал 'dp' в 'px'
Али Мусави Херад


0

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

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

0

С уровня API 1, вы можете использовать public void setTextSize (float size)метод.

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

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

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

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

textView.setTextSize(12); // your size in sp
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.