Как установить единицу измерения для Paint.setTextSize ()

Можно ли поменять блок на Paint.setTextSize()? Насколько я знаю, это пиксель, но мне нравится устанавливать размер текста в DIP для поддержки нескольких экранов.


person Yverman    schedule 17.06.2010    source источник


Ответы (5)


Преобразуйте это так

// The gesture threshold expressed in dip
private static final float GESTURE_THRESHOLD_DIP = 16.0f;

// Convert the dips to pixels
final float scale = getContext().getResources().getDisplayMetrics().density;
mGestureThreshold = (int) (GESTURE_THRESHOLD_DIP * scale + 0.5f);

// Use mGestureThreshold as a distance in pixels

отсюда http://developer.android.com/guide/practices/screens_support.html#dips-pels

person Alex Volovoy    schedule 17.06.2010
comment
другой подход simalar, который использует файл ресурсов stackoverflow.com/a/5369766/1815624 - person CrandellWS; 31.01.2016

Я знаю, что эта тема старая, и на нее уже дан ответ, но я также хотел бы предложить этот фрагмент кода:

int MY_DIP_VALUE = 5; //5dp

int pixel= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                              MY_DIP_VALUE, getResources().getDisplayMetrics());
person Felipe Caldas    schedule 13.06.2012

Принятый ответ - для жестов, а не для установки размера текста. Ответ с наибольшим количеством голосов (на момент написания этой статьи) близок, но в документации рекомендуется использовать sp, а не dp, потому что помимо масштабирования для плотности экрана (как и значения dp), sp также масштабируется в соответствии с предпочтительными размерами шрифта пользователя. .

Из кода int

int spSize = 17;
float scaledSizeInPixels = spSize * getResources().getDisplayMetrics().scaledDensity;
mTextPaint.setTextSize(scaledSizeInPixels);

Или альтернативно

int spSize = 17;
float scaledSizeInPixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
        spSize, getResources().getDisplayMetrics());
mTextPaint.setTextSize(scaledSizeInPixels);

Из ресурсов

Или, если у вас есть значение sp или dp в ресурсах:

<resources>
    <dimen name="fontSize">17sp</dimen>
</resources>

с участием

float scaledSizeInPixels = getResources().getDimensionPixelSize(R.dimen.fontSize);
mTextPaint.setTextSize(scaledSizeInPixels);

Другие ссылки

person Suragch    schedule 06.02.2017
comment
Я проверил ваши предложения, но со всеми ними одна и та же проблема: например, размер шрифта 22 отлично смотрится на Pixel XL (1440x2560, 560dpi), но на Nexus One (480x800, hdpi = 240dpi) он крошечный / нечитаемый. Кто-то другой предложил это, но это вызывает то же самое. Возможно, лучше всего просто использовать жестко заданный размер пикселя (например, myPaint.setTextSize(80)), потому что в этом случае текст будет иметь одинаковую реальную ширину (например, 0,5) на всех устройствах (холст масштабирует его!) - даже если он, очевидно, не будет масштабирование с настройкой размера шрифта Android. - person Neph; 14.05.2020
comment
@Neph, я давно не работал над этим. Дает ли установка dp значения 80 тот же результат, что и использование myPaint.setTextSize(80)? - person Suragch; 15.05.2020
comment
Честно говоря, я не ожидал получить ответ по прошествии всего этого времени, так что спасибо за это! Вы имеете в виду, использовать `‹ dimen name = fontSize ›17sp ‹/dimen›` с dp вместо sp? Я только что протестировал это с dp, но я получил тот же результат для обоих: _4 _ / _ 5_ дайте мне ок. тот же результат, что и myPaint.setTextSize(80) - по крайней мере, с более крупным Pixel XL. На меньшем Nexus One текст слишком мелкий, чтобы его можно было прочитать. - person Neph; 15.05.2020
comment
Хорошо, я не уверен, что происходит тогда, но спасибо за комментарий. - person Suragch; 15.05.2020

А вот еще более короткий метод преобразования dp-s в px-els с учетом показателей отображения.

https://developer.android.com/reference/android/content/res/Resources.html#getDimensionPixelSize(int)

person pelotasplus    schedule 17.02.2014

Если ваш объект Paint используется для рисования текста на холсте, вы можете позволить холсту обрабатывать масштабирование за вас.

При вызове _ 1_ размер текста сначала определяется переданным в Paint объектом, который можно установить с помощью _ 3_. Размер текста автоматически масштабируется на Canvas в зависимости от плотности холста, которую можно найти с помощью _ 5_.

При установке размера текста на объекте рисования, который будет рисоваться на холсте, работайте со значением единицы измерения dp или sp, и пусть Canvas выполнит масштабирование за вас.

person Tanner Perrien    schedule 11.02.2016
comment
В Paint.setTextSize(float textSize) textSize - значение пикселя. Мне не кажется очевидным, что это автоматически масштабируется. Если бы это было так, я бы подумал, что в документации сказано, что единицы измерения - это sp или dp, а не пиксели. - person Suragch; 06.02.2017
comment
Мое приложение устанавливает маркер карты с помощью Canvas.drawText(). Я тестировал разные решения, но предложения вроде getDimensionPixelSize(R.dimen.fontSize) не работают должным образом: <dimen name="fontSize">22sp</dimen> отлично смотрится на Pixel XL (1440x2560, 560dpi), на Nexus 4 (768x1280, xhdpi = 320dpi) он заметно меньше, но на Nexus One (480x800, hdpi) = 240 точек на дюйм) он крошечный / больше не читается. TextViews масштабируются автоматически, но холст также обрабатывает определенное масштабирование: он не будет реагировать на изменения в настройках шрифта Android, но гарантирует, что размер текста будет одинаковым на всех устройствах (например, шириной 0,5). - person Neph; 14.05.2020