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



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

558   11  

11 ответов:

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

пример:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);

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

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

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

определить размер текста в внутри :

</resources>
   <dimen name="text_medium">14sp</dimen>
</resources>

, а затем применить его к TextView:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));

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

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

спасибо @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 2-го поколения): desiredSp становится 50 иш, плотность = 2

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

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))

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

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);

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

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

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

view.textSize = 12f

Comments

    Ничего не найдено.