Я создал свое приложение с высотой и шириной в пикселях для устройства Pantech с разрешением 480x800
.
Мне нужно конвертировать высоту и ширину для устройства G1.
Я думал, что преобразование его в dp решит проблему и предоставит одинаковое решение для обоих устройств.
Есть ли простой способ конвертировать пиксели в dp?
Какие-либо предложения?
android
pixel
resolution
dpi
Indhu
источник
источник
px
,dp
,sp
Формулы преобразованияОтветы:
источник
applyDimension
? Могу ли я просто сделатьgetResource().getDisplayMetrics()
, или есть что-то еще?Context
объектамResources.getSystem().getDisplayMetrics()
источник
Resource.getSystem()
(выделено мной): "Возвращать глобальный объект общих ресурсов, который обеспечивает доступ только к системным ресурсам (без ресурсов приложения) и не настроен для текущего экрана ( не может использовать единицы измерения , не изменяется на основе ориентации и т. д.)DisplayMetrics.DENSITY_DEFAULT
вместо160f
developer.android.com/reference/android/util/…Предпочтительно помещать в класс Util.java
источник
density
равно.75
наldpi
(120
точек на дюйм)1.0
наmdpi
(160
т / д; базовый уровень)1.5
наhdpi
(240
точек на дюйм)2.0
наxhdpi
(320
точек на дюйм)3.0
наxxhdpi
(480
точек на дюйм)4.0
наxxxhdpi
(640
точек на дюйм)Используйте этот онлайн-конвертер, чтобы поиграться со значениями точек на дюйм.
РЕДАКТИРОВАТЬ: Кажется, нет никакого отношения 1: 1 между
dpi
ведром иdensity
. Похоже, чтоNexus 5X
существоxxhdpi
имеетdensity
значение2.625
(а не3
). Убедитесь сами в метриках устройства .источник
Вы можете использовать это .. без контекста
Как упомянул @Stan .. использование этого подхода может вызвать проблемы, если система изменит плотность. Так что знайте об этом!
Лично я использую контекст, чтобы сделать это. Это просто еще один подход, которым я хотел бы поделиться с вами
источник
Если вы можете использовать измерения XML, это очень просто!
В вашем
res/values/dimens.xml
:Тогда в вашей Java:
источник
Согласно Руководству по разработке Android:
Но часто вам захочется выполнить это наоборот, когда вы получите дизайн, который указан в пикселях. Так:
Если вы используете устройство с разрешением 240 точек на дюйм, это соотношение равно 1,5 (как указано выше), поэтому это означает, что значок 60px в приложении равен 40dp.
источник
Без
Context
элегантных статических методов:источник
Resources.getSystem()
В javadoc говорится: «Возвращать глобальный объект общих ресурсов, который обеспечивает доступ только к системным ресурсам (без ресурсов приложения) и не настроен для текущего экрана (не может использовать единицы измерения, не изменяется в зависимости от ориентации и т. д.)». Это в значительной степени говорит о том, что вы не должны делать это, даже если это как-то работает.За
DP to Pixel
Создать значение в
dimens.xml
Получите это значение
pixel
как:источник
Поэтому вы можете использовать следующий составитель для вычисления правильного количества пикселей по измерению, указанному в dp
источник
convertToDp
.Для тех, кто использует Kotlin:
Применение:
источник
В Android SDK есть утилита по умолчанию: http://developer.android.com/reference/android/util/TypedValue.html
источник
resultPix
должен иметь тип int.int resultPix = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics())
использование kotlin-extension делает его лучше
ОБНОВИТЬ:
Поскольку
displayMetrics
это часть глобальных общих ресурсов , мы можем использоватьResources.getSystem()
источник
Это должно дать вам преобразование дп в пиксели:
Это должно дать вам преобразование пикселей в dp:
источник
Котлин
Ява
источник
Вероятно, лучший способ, если у вас есть измерение внутри values / измерение, это получить измерение непосредственно из метода getDimension (), он вернет вам измерение, уже преобразованное в значение в пикселях.
Просто чтобы лучше объяснить это,
вернет размер, уже преобразованный в пиксель как плавающий элемент.
вернет то же самое, но усеченное до int, так что как INTEGER.
См. Справочник по Android
источник
где ресурс это context.getResources ().
источник
нравится:
зависит от контекста, возвращаемого значения с плавающей запятой, статического метода
от: https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ScreenUtils.java#L15
источник
Более элегантный подход с использованием функции расширения Kotlin
Применение:
источник
function name
», что, как я понимаю, в данном случае является обратным. Чтобы прояснить намерение каждой функции, имена функций могут быть обновлены для чтения dpToPx и pxToDp соответственно.источник
Если вы разрабатываете приложение, критичное к производительности, рассмотрите следующий оптимизированный класс:
источник
чтобы конвертировать пиксели в dp, используйте TypedValue .
Как указано в документации: Контейнер для динамически типизированного значения данных.
и используйте метод applyDimension :
который преобразует распакованное комплексное значение данных, содержащее измерение, в его окончательное значение с плавающей запятой, как показано ниже:
Надеюсь, это поможет .
источник
Вот как это работает для меня:
Вы можете сделать то же самое для ширины.
источник
Много отличных решений выше. Тем не менее, лучшее решение, которое я нашел, это дизайн Google:
https://design.google.com/devices/
источник
Вы должны использовать dp так же, как и пиксели. Это все, что они есть; отображать независимые пиксели. Используйте те же цифры, что и на экране средней плотности, и размер будет магически правильным на экране высокой плотности.
Однако, похоже, вам нужна опция fill_parent в вашем макете. Используйте fill_parent, когда вы хотите, чтобы ваше представление или элемент управления расширились до всех оставшихся размеров в родительском контейнере.
источник
PX
иDP
разные, но похожие.DP
разрешение, когда вы учитываете только физический размер экрана. Когда вы используетеDP
его, вы масштабируете свой макет на другие похожие по размеру экраны с различнойpixel
плотностью.Иногда вы действительно хотите,
pixels
хотя, и когда вы имеете дело с измерениями в коде, вы всегда имеете дело с реальнымиpixels
, если вы не конвертируете их.Так на андроид устройстве нормальный размер
hdpi
экрана,800x480 is 533x320
вDP
(я считаю). Чтобы преобразоватьDP
вpixels /1.5
, чтобы преобразовать обратно*1.5
. Это только для одного размера экрана, иdpi
он будет меняться в зависимости от дизайна. Наши художники дают мне,pixels
хотя и я обращаюсь кDP
вышеупомянутому1.5
уравнению.источник
Если вы хотите целочисленные значения, то использование Math.round () округляет число с плавающей точкой до ближайшего целого числа.
источник
Лучший ответ исходит от самой платформы Android: просто используйте это равенство ...
(конвертирует dp в px)
источник
Это работает для меня (C #):
источник
Котлин
Ява
источник