Я пытаюсь понять модуль sp в Android, но я не могу понять, как это работает. В документации говорится:
sp
Масштабируемые пиксели - это похоже на блок dp, но это также масштабируется по предпочтению размера шрифта пользователя. Рекомендуется использовать этот блок при задании размеров шрифта, поэтому они будут скорректированы для как плотность экрана, так и пользовательские предпочтения.
Используя DisplayMetrics, можно получить scaledDensity, который:
Коэффициент масштабирования для шрифтов, отображаемых на дисплее. Это тоже самое как плотность, за исключением того, что ее можно регулировать с меньшими приращениями при время выполнения основано на предпочтении пользователя для размера шрифта.
Поэтому, учитывая эту информацию, я предполагаю, что scaledDensity изменится при изменении размера шрифта системы и что я могу использовать эту информацию, чтобы узнать соотношение между 1dp и 1sp (scaledDensity / density
).
Однако, когда я тестирую это на своем телефоне (Nexus 4), я не получаю ожидаемых результатов. DisplayMetrics.scaledDensity всегда возвращает то же значение (равное DisplayMetrics.density) независимо от того, какой размер шрифта я установил для моего телефона (через settings -> accessibility -> use large font
или settings -> display -> font size
).
Когда я меняю настройки шрифта, мои sp заданные шрифты меняют размер, поэтому sp-устройство работает так, как ожидалось, но значение scaledDensity не изменяется вообще.
Код, который я использую для получения scaledDensity:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity
Я делаю что-то неправильно или я неправильно понял, что на самом деле делает DisplayMetrics.scaledDensity?
Обновление
Вот три скриншота, которые иллюстрируют, что я имею в виду:
И это код для приложения:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
String result = "\n"
+ "density : " + metrics.density + " (24 dp = " + 24 * metrics.density + " px)\n"
+ "scaledDensity: " + metrics.scaledDensity + " (24 sp = " + 24 * metrics.scaledDensity + " px)\n";
((TextView) this.findViewById(R.id. label)).setText(result);
((TextView) this.findViewById(R.id. sp)).setTextSize(android.util.TypedValue. COMPLEX_UNIT_SP , 24);
((TextView) this.findViewById(R.id.dp )).setTextSize(android.util.TypedValue. COMPLEX_UNIT_DIP, 24);
Я хочу, чтобы вычислить количество пикселей, необходимых y-мудному, чтобы нарисовать определенную строку. Если я укажу размер строки с помощью dp, я могу легко вычислить требуемые пиксели с помощью displayMetrics.density
. Но когда я использую sp и пытаюсь вычислить количество пикселей, используя displayMetrics.scaledDensity
, я не получаю правильные значения.