Получение странного размера шрифта после его установки программно

Я пытаюсь установить TextView Размер шрифта программно.

txtView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);

Но когда я проверяю этот размер через

Toast.makeText(this, "txt: " + txtView.getTextSize(), Toast.LENGTH_SHORT).show();

Toast показывает, что размер равен "24", что на 50% больше, чем тот, который я установил ранее.

Я проверил несколько значений и всегда получаю один и тот же результат:

8 становится 12
10 становится 15
15 становится 22,5
и т.п.

Шрифт, который я пытаюсь установить, всегда становится на 50% больше.

Почему это происходит? Где я делаю ошибку?

4 ответа

Решение

Я считаю, что это потому, что TextView.getTextSize() возвращает размер текста в пикселях, а не sp единиц, независимо от того, какой тип единиц измерения вы использовали для установки размера текста.

Кроме того, другой поток SO обсуждает, как преобразовать это в sp единицы.

getTextSize() метод возвращает размер текста в pixels, Когда вы установите текст в setTextSize() в sp единиц он масштабируется в соответствии с вашим коэффициентом плотности экрана, который 1.5,

Я не нашел определенного ответа относительно этой проблемы setTextSize(). Поэтому я провел несколько собственных экспериментов и обнаружил, что плотность играет здесь ключевую роль. Вам нужно знать плотность вашего устройства, прежде чем пытаться использовать setTextSize(). Если вы не поняли или ошиблись, ваши тексты будут иметь забавный и раздражающий размер. Много раз я пытался увеличить размер текста, добавляя 1 или 2, но на самом деле текст резко уменьшился!

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

    float size = textView.getTextSize();  // get the textsize of the TextView in pixels
    float density = getApplicationContext().getResources().getDisplayMetrics().density; // get the density of your device. Important!!
    textView.setTextSize((size/density)+1); //increase the textsize by 1
    textView.setTextSize((size/density)-1); //decrease the textsize by 1

Попытайся. Я надеюсь, вы не будете разочарованы.

Вы можете определить размер шрифта, используя файл.xml:

<resources>
    <dimen name="test">12dp</dimen>
</resources>

И затем установите это программно:

txtView.setTextSize(getResources().getDimension(R.dimen.test));
Другие вопросы по тегам