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

206

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

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

capecrawler
источник

Ответы:

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));
Klimat
источник
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.

rekire
источник
последний метод спасения жизни.
Аджибола
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
macio.Jun
источник
11

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

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);
pomber
источник
хорошо, это работает, это то, что я хочу, спасибо 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'
Али Мусави Херад
3

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

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
Камран Гасымов
источник
0

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

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
TSIG
источник
0

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

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

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

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

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

textView.setTextSize(12); // your size in sp
user2342558
источник