Получение странного размера шрифта после его установки программно
Я пытаюсь установить 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));