2010-01-15 1 views
156

Если я назначу целочисленное значение для изменения определенного текстового размера TextView с использованием java-кода, значение интерпретируется как пиксель (px). Теперь кто-нибудь знает, как назначить его в sp?Как назначить размер текста в значении sp с помощью java-кода

ответ

419

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

Пример:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65); 
+13

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

+3

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

+0

большое спасибо :) \ –

32

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

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

Это потребует масштабного коэффициента плотности экрана во внимание, но не масштабный фактор текста, который пользователь может указали через настройки. Я считаю, что решение Santosh учитывает этот фактор, тогда как в этом фрагменте нет. – greg7gkb

+3

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

+0

@ greg7gkb не соответствует действительности, документация говорит, что '' 'можно настроить меньшими приращениями во время выполнения на основе предпочтений пользователя для размера шрифта''', поэтому размер шрифта ** будет ** учитываться. –

9

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

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

Я строй этой функции для calulating любой Demension к пикселям:

int getPixels(int unit, float size) { 
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); 
    return (int)TypedValue.applyDimension(unit, size, metrics); 
} 

Где блок что-то вроде TypedValue.COMPLEX_UNIT_SP.

+0

Последний способ - спасатель жизни. – Ajibola

6

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

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

Благодаря @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 в вашем dimen.xml

  1. на не-HD устройства: desiredSp еще 25, плотность = 1
  2. на HD устройств (например, Nexus 7 второго поколения): desiredSp становится 50 иш, плотность = 2
20

уборщик и более многоразовый подход

определить размер текста в 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)); 
6
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
         context.getResources().getDimension(R.dimen.text_size_in_dp)) 
+0

Пожалуйста, объясните, как будет полезно настроить размер текста в качестве значения пикселя (COMPLEX_UNIT_PX). OP хочет «назначить размер текста в sp значение» – 0X0nosugar

+0

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

+0

Я думаю, что это потому, что getDimension уже преобразовал 'dp' в 'px' –

2

Это код обращенного PX в SP формат. 100% Работает

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24); 
Смежные вопросы