Я пытаюсь вычислить переменное количество пикселей для плотности независимых пикселей и наоборот.
Эта формула (px to dp): dp = (int)(px / (displayMetrics.densityDpi / 160));
не работает на небольших устройствах, потому что она делится на ноль.
Это моя формула dp to px:
px = (int)(dp * (displayMetrics.densityDpi / 160));
Может ли кто-нибудь дать мне несколько советов?
Ответы:
Примечание: широко используемое решение выше основано на
displayMetrics.density
. Тем не менее, документы объясняют, что это значение является округленным значением, используемым с экраном «корзины». Например. на моем Nexus 10 он возвращает 2, где реальное значение будет 298dpi (реальное) / 160dpi (по умолчанию) = 1,8625.В зависимости от ваших требований вам может потребоваться точное преобразование, которое может быть достигнуто следующим образом:
[Edit] Это не предназначено для смешивания с внутренним модулем dp Android, так как это, конечно, все еще основано на экранах. Используйте это там, где вы хотите, чтобы блок отображал один и тот же реальный размер на разных устройствах.
Преобразовать дп в пиксель:
Преобразовать пиксель в дп:
Обратите внимание, что есть свойства xdpi и ydpi, которые вы, возможно, захотите различить, но я не могу представить нормальное отображение, где эти значения сильно различаются.
источник
Я решил свою проблему, используя следующие формулы. Пусть другие люди выиграют от этого.
dp to px:
px до dp:
источник
px до dp:
источник
typedValue.applyDimension( TypedValue.COMPLEX_UNIT_PX, valueInDp , getResources() .getDisplayMetrics());
от PX до DP, также это лучший ответapplyDimension
только дает пикселей. См. Android.googlesource.com/platform/frameworks/base/+/refs/heads/…, где преобразование не выполняетсяCOMPLEX_UNIT_PX
.dp
. Если вы посмотрите на исходный код, для случаяTypedValue.COMPLEX_UNIT_DIP
,value * metrics.density
возвращается, где вам действительно нужноvalue * metrics.density
. Так что вы getting` valueInDp` НЕ вdp
течениеvalueInPx
вpx
.value / metrics.density
"Эффективный способ когда-либо
DP to Pixel:
Пиксель в DP:
Надеюсь, что это поможет вам.
источник
displayMetrics.xdpi
который отличается на любом устройстве. К сожалению, этот неправильный ответ также имеет больше голосов.private fun dpToPx(dp: Int) = (dp * Resources.getSystem().displayMetrics.density).toInt()
Просто позвоните,
getResources().getDimensionPixelSize(R.dimen.your_dimension)
чтобы преобразовать изdp
единиц в пикселиисточник
Используйте эту функцию
источник
источник
(displayMetrics.densityDpi / 160)
- эта часть может получить 0 на небольших устройствах, там она вычисляет, например120/160
, оба значения являются целыми числами, что приводит к 0. Что заканчивается как(int) (px/0)
.В большинстве случаев функции преобразования вызываются часто. Мы можем оптимизировать его, добавив памятку. Таким образом, он не вычисляет каждый раз, когда вызывается функция.
Давайте объявим HashMap, в котором будут храниться вычисленные значения.
Функция, которая вычисляет значения пикселей:
Функция запоминания, которая возвращает значение из HashMap и поддерживает запись предыдущих значений.
Мемоизация может быть реализована по-разному в Java. Для Java 7 :
Java 8 поддерживает функцию Lambda :
Спасибо.
источник
попробуйте это http://labs.skinkers.com/content/android_dp_px_calculator/
источник
Ниже функции хорошо работали для меня на всех устройствах.
Это взято от https://gist.github.com/laaptu/7867851
источник
Вы можете использовать
[DisplayMatrics][1]
и определить плотность экрана. Что-то вроде этого:Насколько я помню, лучше использовать настил для смещений и округление для ширины.
источник
Если вам нужен онлайн-калькулятор для преобразования DP, SP, дюймов, миллиметров, точек или пикселей друг в друга при разной плотности экрана, это наиболее полный из известных мне инструментов .
источник
// для получения в виде десятичного числа / числа с плавающей запятой
________________________________________________________________________________
источник
Используйте эти расширения Kotlin:
источник
Не стесняйтесь использовать этот метод, который я написал:
источник
Ответ, принятый выше, не является полностью точным. Согласно информации, полученной при проверке исходного кода Android:
Resources.getDimension()
иgetDimensionPixelOffset()
/getDimensionPixelSize()
отличаются только тем, что первые возвращаются, вfloat
то время как последние два возвращают одинаковое значение, округленное доint
подходящего. Для всех них возвращаемое значение в необработанных пикселях.Все три функции implementedy путем вызова
Resources.getValue()
и преобразования полученного таким образомTypedValue
, вызвавTypedValue.complexToDimension()
,TypedValue.complexToDimensionPixelOffset()
иTypedValue.complexToDimensionPixelSize()
, соответственно.Поэтому, если вы хотите получить «необработанное» значение вместе с единицей, указанной в источнике XML, вызовите
Resources.getValue()
и используйте методыTypedValue
класса.источник
с помощью других ответов я написал эту функцию.
источник
Вот другой способ сделать это с помощью расширений kotlin:
и тогда его можно использовать как угодно из любого места
источник
источник
Вариант ct_robs ответ выше, если вы используете целые числа, это не только позволяет избежать деления на 0, но также дает полезный результат на небольших устройствах:
в целочисленных вычислениях, включающих деление для наибольшей точности, сначала умножьте перед делением, чтобы уменьшить эффекты усечения.
вместо того
если вы хотите округленный результат, сделайте это
источник