Android: преобразование "dp" в "px"?
Я читаю эту статью: http://developer.android.com/guide/practices/screens_support.html
В нем говорится, что формула, которую использует Android для преобразования единицы измерения dp в единицу px, выглядит следующим образом:
px = dp * (dpi / 160)
В статье также приводится пример, когда dpi составляет 240, что дает нам значение px = 1,5 (я рассчитываю для одного пикселя dp)
Однако что именно здесь означает 1,5? Если пиксели на самом деле являются пикселями физического устройства, будет ли Android отображать 1 или 2 пикселя?
4 ответа
Это зависит от контекста.
Если значение dp используется в контексте, который подразумевает размер, такой как android:layout_width
атрибут, будет использоваться логика, описанная для Resources.getDimensionPixelSize(). То есть значение px будет округлено до ближайшего целочисленного значения, при этом в особом случае, если px > 0, то фактическое значение будет не менее 1.
Если значение dp используется в контексте, который подразумевает смещение, например android:insetLeft
атрибут Inset Drawable, будет использоваться логика, описанная для Resources.getDimensionPixelOffset(). То есть значение px будет просто обрезано до целочисленного значения.
Иногда используется неизмененное значение с плавающей запятой, например, для android:dashWidth
атрибут <stroke/>
тег в Shape Drawable, но это довольно редко. Обычно используется логика размера или смещения, даже если можно использовать значение с плавающей запятой.
Если то, что я прочитал, правильно, то 1,5 пикселя означают, что один пиксель "1" является заданным цветом, и 0,5 пикселя, окружающего его, будут сливаться с пикселем "1" и пикселем рядом с ним.
Например
| A | AB | Б |
A составляет 1,5 пикселя, а B 1,5, поэтому промежуточный пиксель представляет собой смесь обоих.
Таким образом, используя это, два пикселя рядом друг с другом будут смешиваться вместе, например, с дисплеем 1px
| X | Y |
Теперь с дисплеем 1.5px:
| XY | YX | Это становится смесью обоих! но пиксель, установленный как X, будет больше X, чем пиксель, установленный как Y
px - один пиксель пиксели, не зависящие от масштаба ( sp) и пиксели, не зависящие от плотности ( dip), которые вы хотите использовать sp для размеров шрифта и dip для всего остального.
падение == дп
отсюда http://developer.android.com/guide/topics/resources/more-resources.html
px
Pixels - corresponds to actual pixels on the screen.
in
Inches - based on the physical size of the screen.
mm
Millimeters - based on the physical size of the screen.
pt
Points - 1/72 of an inch based on the physical size of the screen.
dp
Density-independent Pixels - an abstract unit that is based on the physical density of the screen. These units are relative to a 160 dpi screen, so one dp is one pixel on a 160 dpi screen. The ratio of dp-to-pixel will change with the screen density, but not necessarily in direct proportion. Note: The compiler accepts both "dip" and "dp", though "dp" is more consistent with "sp".
sp
Scale-independent Pixels - this is like the dp unit, but it is also scaled by the user's font size preference. It is recommend you use this unit when specifying font sizes, so they will be adjusted for both the screen density and user's preference.
Я думаю, что это было бы лучшим решением, потому что это стандартный метод:
int valueInPx = (int) TypedValue.applyDimension (TypedValue.COMPLEX_UNIT_PX, valueInDp, getResources (). getDisplayMetrics ());