Як призначити розмір тексту у значенні sp за допомогою коду Java


205

Якщо я призначу ціле значення, щоб змінити певний розмір тексту a TextView використовуючого коду Java, значення інтерпретується як піксель ( px).

Тепер хтось знає, як це призначити sp?

Відповіді:


535

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

Приклад:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);

18
Оскільки SP означає масштаб пікселів, вам потрібно зменшити розмір на щільність екрана. Це легко зробити так: SCREEN_DENSITY = getResources (). GetDisplayMetrics (). Щільність; yourView.setTextSize (TypedValue.COMPLEX_UNIT_SP, (бажанийTextHeightInSP / SCREEN_DENSITY);
PeteH

4
Для мене рішення не спрацювало, коли я намагався зібрати ІП з ресурсів. PeteH, ти мене на правильному шляху! Наступне зробило для мене хитрість: ... float textSize = getResources (). GetDimension (R.dimen.textsize) / getResources (). GetDisplayMetrics (). Щільність; 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
Це враховує коефіцієнт масштабування екрану, але не коефіцієнт текстової шкали, який користувач, можливо, вказав через налаштування. Я вважаю, що рішення Сантоша врахує цей фактор, тоді як цей фрагмент цього не робить.
greg7gkb

3
Але іноді ви не в змозі використовувати метод @Santosh, наприклад, коли ви пишете фарбу на полотно. Тоді цей метод стає корисним і працює досить добре, тому великі пальці за ці дві відповіді!
byemute

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

Дякую @John Leehey та @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 у вашій мірі.xml

  1. На пристрої, що не підтримує HD: бажанийSp все ще 25, щільність = 1
  2. На HD-пристрої (наприклад, Nexus 7 2-го покоління): бажанийSp стає 50 іш, щільність = 2

11

Якщо прийнята відповідь не працює (наприклад, при роботі з Paint), ви можете використовувати:

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

Ок, це працює, Ось що я хочу, дякую помбер за те, що поділився ним!
Park Eun Neul

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.