Android度量单位有什么区别?
- 像素
- 蘸
- dp
- SP
#1楼
我将详细说明dp如何精确转换为px:
- 如果在mdpi设备上运行,则
150 x 150 px
图像将占用150 * 150 dp
的屏幕空间。 - 如果在hdpi设备上运行,则
150 x 150 px
图像将占用100 * 100 dp
的屏幕空间。 - 如果在xhdpi设备上运行,则
150x150 px
图像将占用75 * 75 dp
的屏幕空间。
另一种方法是:说,您想向应用程序中添加图像,并且需要它来填充100 * 100 dp
控件。 您需要为支持的屏幕尺寸创建不同尺寸的图像:
- 用于mdpi的
100 * 100 px
图像 -
150 * 150 px
的Hdpi图片 - xhdpi的
200 * 200 px
图像
#2楼
基本上,适用px的唯一时间是一个px,也就是说,如果您想要在屏幕上恰好一个像素(例如使用分隔线的情况):
在> 160 dpi时,您可能会获得2-3像素,
在> 120 dpi时,其舍入为0。
#3楼
px像素 -每刻度点数对应于屏幕上的实际像素。
以英寸为单位 -基于屏幕的物理尺寸。
毫米毫米 -基于屏幕的物理尺寸。
pt点 -基于屏幕的物理尺寸的1/72英寸。
dp密度 -独立的像素-基于屏幕物理密度的抽象单位。 这些单位是相对于160 dpi屏幕的,因此1 dp
是160 dpi屏幕上的一个像素。 dp与像素的比率将随屏幕密度而变化,但不一定成正比。 注意:尽管dp
与sp
更一致,但是编译器接受dip
和dp
。
sp-与缩放无关的像素 -类似于dp
单位,但它也通过用户的字体大小首选项进行缩放。 建议您在指定字体大小时使用本机,以便针对屏幕密度和用户喜好进行调整。
以两个尺寸相同但屏幕密度为160 dpi(每英寸点数,即每英寸像素)的屏幕为例,另一个屏幕为240 dpi。
Lower resolution screen Higher resolution, same size
Physical Width 1.5 inches 1.5 inches
Dots Per Inch (“dpi”) 160 240
Pixels (=width*dpi) 240 360
Density (factor of baseline 160) 1.0 1.5
Density-independent Pixels 240 240
(“dip” or “dp” or “dps”)
Scale-independent pixels
(“sip” or “sp”) Depends on user font size settings same
#4楼
像素
像素-对应于屏幕上的实际像素。
dp或dip
密度无关像素-基于屏幕物理密度的抽象单位。 这些单位是相对于160 dpi屏幕的,因此1 dp是160 dpi屏幕上的一个像素。
使用dp:
密度独立性 -当您的应用程序以不同的密度显示在屏幕上时,保留用户界面元素的物理尺寸(从用户的角度来看),您的应用程序将实现“密度独立性”。 (即)在不同类型的屏幕中,图像的尺寸应相同(不能放大或缩小)。
SP
与比例无关的像素-就像dp单位一样,但是它也通过用户的字体大小首选项进行缩放。
http://developer.android.com/guide/topics/resources/more-resources.html#Dimension
#5楼
此外,您应该对以下概念有清楚的了解:
屏幕尺寸:
实际物理尺寸,以屏幕的对角线为单位。 为简单起见,Android将所有实际屏幕尺寸分为四个通用尺寸:小,普通,大和特大。
屏幕密度:
屏幕物理区域内的像素数量; 通常称为dpi(每英寸点数)。 例如,与“正常”或“高”密度屏幕相比,“低”密度屏幕在给定的物理区域内具有较少的像素。 为简单起见,Android将所有实际屏幕密度分为四个广义密度:低,中,高和超高。
取向:
从用户的角度看屏幕的方向。 这可以是横向或纵向,这意味着屏幕的宽高比分别为宽或高。 请注意,默认情况下,不同的设备不仅会以不同的方向运行,而且在用户旋转设备时,其方向可能会在运行时发生变化。
解析度:
屏幕上的物理像素总数。 添加对多屏幕的支持时,应用程序无法直接使用分辨率工作; 应用程序应仅关注屏幕尺寸和密度,这由广义尺寸和密度组指定。
密度无关像素(dp):
在定义UI布局时应使用的虚拟像素单位,以密度独立的方式表示布局尺寸或位置。 与密度无关的像素等效于160 dpi屏幕上的一个物理像素,这是系统为“中”密度屏幕假定的基线密度。 在运行时,系统会根据使用中屏幕的实际密度,根据需要透明地处理dp单位的任何缩放比例。 dp单位到屏幕像素的转换很简单:px = dp *(dpi / 160)。 例如,在240 dpi屏幕上,1 dp等于1.5物理像素。 定义应用程序的UI时,应始终使用dp单位,以确保在具有不同密度的屏幕上正确显示UI。
参考: Android开发人员网站
#6楼
任何与文本大小和外观有关的内容都必须使用sp
或pt
。 而与控件大小,布局等有关的任何内容都必须与dp
一起使用。
您可以在其位置同时使用dp
和dip
。
#7楼
从官方文档复制的答案称为“ 用户字体大小首选项 ”的dp
和sp
单位之间的差异可以在运行时通过更改Settings->Accessibility->Large Text
选项看到。
Large Text
选项将强制文本变大1.3
倍。
private static final float LARGE_FONT_SCALE = 1.3f;
当然,这可能取决于供应商,因为它位于package / apps / Settings中 。
#8楼
#9楼
来自Android开发者文档 :
-
像素
像素 -对应于屏幕上的实际像素。 -
在
英寸 -基于屏幕的物理尺寸。
1英寸= 2.54厘米 -
毫米
毫米 -基于屏幕的物理尺寸。 -
pt
点数 -基于屏幕的物理尺寸的1/72英寸。 -
dp或dip
密度无关像素-基于屏幕物理密度的抽象单位。 这些单位是相对于160 dpi屏幕的,因此1 dp是160 dpi屏幕上的一个像素。 dp与像素的比率将随屏幕密度而变化,但不一定成正比。 注意:尽管“ dp”与“ sp”更一致,但编译器接受“ dip”和“ dp”。 -
SP
与缩放无关的像素-就像dp单位一样,但是它也通过用户的字体大小首选项进行缩放。 建议您在指定字体大小时使用本机,以便针对屏幕密度和用户喜好进行调整。
+----------------+----------------+---------------+-------------------------------+
| Density Bucket | Screen Density | Physical Size | Pixel Size |
+----------------+----------------+---------------+-------------------------------+
| ldpi | 120 dpi | 0.5 x 0.5 in | 0.5 in * 120 dpi = 60x60 px |
+----------------+----------------+---------------+-------------------------------+
| mdpi | 160 dpi | 0.5 x 0.5 in | 0.5 in * 160 dpi = 80x80 px |
+----------------+----------------+---------------+-------------------------------+
| hdpi | 240 dpi | 0.5 x 0.5 in | 0.5 in * 240 dpi = 120x120 px |
+----------------+----------------+---------------+-------------------------------+
| xhdpi | 320 dpi | 0.5 x 0.5 in | 0.5 in * 320 dpi = 160x160 px |
+----------------+----------------+---------------+-------------------------------+
| xxhdpi | 480 dpi | 0.5 x 0.5 in | 0.5 in * 480 dpi = 240x240 px |
+----------------+----------------+---------------+-------------------------------+
| xxxhdpi | 640 dpi | 0.5 x 0.5 in | 0.5 in * 640 dpi = 320x320 px |
+----------------+----------------+---------------+-------------------------------+
+---------+-------------+---------------+-------------+--------------------+
| Unit | Description | Units Per | Density | Same Physical Size |
| | | Physical Inch | Independent | On Every Screen |
+---------+-------------+---------------+-------------+--------------------+
| px | Pixels | Varies | No | No |
+---------+-------------+---------------+-------------+--------------------+
| in | Inches | 1 | Yes | Yes |
+---------+-------------+---------------+-------------+--------------------+
| mm | Millimeters | 25.4 | Yes | Yes |
+---------+-------------+---------------+-------------+--------------------+
| pt | Points | 72 | Yes | Yes |
+---------+-------------+---------------+-------------+--------------------+
| dp | Density | ~160 | Yes | No |
| | Independent | | | |
| | Pixels | | | |
+---------+-------------+---------------+-------------+--------------------+
| sp | Scale | ~160 | Yes | No |
| | Independent | | | |
| | Pixels | | | |
+---------+-------------+---------------+-------------+--------------------+
更多信息也可以在Google设计文档中找到 。
#10楼
来源3 :(来自来源3的数据如下)
这些是用XML定义的尺寸值。 用数字后跟度量单位指定维。 例如:10px,2in,5sp。 Android支持以下度量单位:
dp
与密度无关的像素-基于屏幕物理密度的抽象单位。 这些单位相对于160 dpi(每英寸的点数)屏幕,在该屏幕上1dp大致等于1px。 在更高密度的屏幕上运行时,用于绘制1dp的像素数量会按适合屏幕dpi的系数放大。 同样,在较低密度的屏幕上,用于1dp的像素数会按比例缩小。 dp与像素的比率将随屏幕密度而变化,但不一定成正比。 使用dp单位(而不是px单位)是一种简单的解决方案,可以针对不同的屏幕密度正确调整布局中的视图尺寸。 换句话说,它为跨不同设备的UI元素的实际大小提供了一致性。
SP
与缩放无关的像素-就像dp单位一样,但是它也通过用户的字体大小首选项进行缩放。 建议您在指定字体大小时使用本机,以便针对屏幕密度和用户的喜好进行调整。
pt
点数-基于屏幕的物理尺寸的1/72英寸。
像素
像素-对应于屏幕上的实际像素。 不建议使用此度量单位,因为实际的表示可能会因设备而异。 每个设备每英寸可能具有不同数量的像素,并且屏幕上可用的总像素可能更多或更少。
毫米
毫米-基于屏幕的物理尺寸。
在
英寸-基于屏幕的物理尺寸。
注意:维度是一种简单的资源,它使用name属性中提供的值(而不是XML文件的名称)进行引用。 这样,您可以在一个元素下的一个XML文件中将维度资源与其他简单资源结合在一起。
#11楼
哪里使用px和dp之间的关系?
密度无关像素(dp)
在定义UI布局时应使用的虚拟像素单位,以密度独立的方式表示布局尺寸或位置。 如上所述,与密度无关的像素等效于160 dpi屏幕上的一个物理像素,这是系统为“中”密度屏幕假定的基线密度。 在运行时,系统会根据使用中屏幕的实际密度,根据需要透明地处理dp单位的任何缩放比例。 dp单位到屏幕像素的转换很简单:
px = dp *(dpi / 160)。
例如,在240 dpi屏幕上,1 dp等于1.5物理像素。 定义应用程序的UI时,应始终使用dp单位,以确保在具有不同密度的屏幕上正确显示UI。
了解像素与dp之间的关系非常重要(尤其是要向创意团队提供准确的dp值)
dp = px * 160 / dpi
MDPI = 160 dpi || Therefore, on MDPI 1 px = 1 dp
For example, if you want to convert 20 pixel to dp, use the above formula,
dp = 20 * 160 / 160 = 20.
So, 20 pixel = 20 dp.
HDPI = 240 dpi - So, on HDPI 1.5 px = 1 dp
XHDPI = 320 dpi - So, on XHDPI 2 px = 1 dp
XXHDPI = 480 dpi - So, on XXHDPI 3 px = 1 dp
For example, let us consider Nexus 4.
If 24 pixels to be converted to dp and if it is a Nexus 4 screen, developers can
convert it to dp easily by the following calculation :
dp = 24 * 160 / 320 = 12 dp
Screen dimension:
768 x 1280 pixel resolution (320 ppi or 320dpi)
Optional (screen size):
4.7" diagonal
- 尝试从广告素材团队获取偶数个像素值。 否则,乘以0.5会导致精度损失。
像素
上面已经解释了。 尽量避免在布局文件中。 但是在某些情况下,需要px。 例如,ListView分隔线。 px在这里更好,因为它提供了一个像素行作为所有屏幕分辨率的分隔线。
SP
使用sp表示字体大小。 然后,随着设备字体大小的变化(即,显示->设备上的字体),只有应用程序内部的字体才会变化。 如果要在应用程序中保留静态大小的字体,可以在dp中指定字体尺寸。 在这种情况下,它将永远不会改变。 开发人员可能对某些特定屏幕有这样的要求,为此,开发人员可以使用dp代替sp。 在所有其他情况下,建议使用sp。
#12楼
dp
是dip
。 将其用于所有内容(边距,填充等)。
仅将sp
用于{text-size}。
为了在不同的屏幕密度下获得相同的尺寸,Android在运行时将这些单位转换为像素,因此您无需进行任何复杂的数学运算。
在不同的屏幕尺寸上查看px
, dp
和sp
之间的区别。
资料来源: Android程式设计:The Big Nerd Ranch Guide
#13楼
- px-一个像素,与CSS,JavaScript等中使用的像素相同。
- sp-与比例无关的像素
- dip-与密度无关的像素
通常sp用于字体大小,而dip用于其他字体(也称为dp)。
#14楼
我只会用dp。
有很多关于使用“ sp”作为字体大小的讨论,尽管我很欣赏这一点,但从设计的角度来看,我认为这样做是不正确的。 如果用户选择了一些不稳定的字体大小,最终可能会破坏您的设计,而最终用户将责备该应用程序 ,而不是自己的生活选择。
另外,如果您在160 dpi的平板电脑上使用sp-font应用,您会发现一切都在扩大……但是您的字体相比之下显得很小。 不好看。
尽管“ sp”字体的想法很不错,但这是一个糟糕的想法。 坚持使用dp进行所有操作。
#15楼
dpi-
- 每英寸点数
- 测量屏幕的像素密度。
px-像素
- 用于映射屏幕像素
pt-点
- 相对于物理屏幕尺寸,大约为1/72英寸。
英寸-相对于物理屏幕尺寸(1英寸= 2.54厘米)。
毫米-相对于物理屏幕尺寸。
sp-与比例无关的像素。
- 根据用户的字体大小首选项。
- 字体应为“ sp”。
浸-
- 蘸== dp
- 密度无关像素。
- 它随屏幕密度而变化。
- 在160 dpi屏幕中,1 dp = 1像素。
- 除文本字体大小外,请使用dp。
在标准情况下,使用dp和sp。 sp表示字体大小,dp表示其他所有内容。
单位换算公式:
px = dp *(dpi / 160);
Density Bucket -> Screen Display => Physical Size => Pixel Size
ldpi -> 120 dpi => 0.5 x 0.5 in => 0.5 in * 120 dpi = 60x60 px
mdpi -> 160 dpi => 0.5 x 0.5 in => 0.5 in * 160 dpi = 80x80 px
hdpi -> 240 dpi => 0.5 x 0.5 in => 0.5 in * 240 dpi = 120x120 px
xhdpi -> 320 dpi => 0.5 x 0.5 in => 0.5 in * 320 dpi = 160x160 px
xxhdpi -> 480 dpi => 0.5 x 0.5 in => 0.5 in * 480 dpi = 240x240 px
xxxhdpi -> 640 dpi => 0.5 x 0.5 in => 0.5 in * 640 dpi = 320x320 px
#16楼
您可以从下图看到px
和dp
之间的差异,并且还可以发现px
和dp
无法保证在不同屏幕上的相同物理尺寸。
#17楼
sp =比例无关像素
dp =倾斜=密度无关像素
dpi =每英寸点数
我们应该避免使用sp 。
我们应该使用dp支持多个屏幕。
Android支持不同的屏幕分辨率
- ldpi(低)〜120 dpi
- mdpi(中)〜160 dpi
- hdpi(高)〜240 dpi
- xhdpi(超高)〜320 dpi
- xxhdpi(超高)〜480 dpi
- xxxhdpi(超高)〜640 dpi
120 dp ldpi设备具有1英寸大小的120像素。
其他密度也一样...
我们作为软件工程师应使用以下转换公式:
像素= dp *(密度/ 160)
因此,240 dpi设备的1 dp将具有= 1 *(240/160)= 3/2 = 1.5像素。
而480 dpi设备的1 dp将具有= 1 *(480/160)= 3像素。
使用此1.5和3像素的知识,软件工程师可以设计不同密度的布局。
要检查任何设备的屏幕参数:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Toast.makeText(
this,
"4:" + metrics.heightPixels + "," + metrics.density + ","
+ metrics.densityDpi, Toast.LENGTH_LONG).show();
#18楼
这是Android使用的公式:
px = dp *(dpi / 160)
dpi是以下屏幕密度之一。 有关所有可能密度的列表, 请点击此处
它定义了“ DENSITY_ *”常量。
- ldpi(低)〜120dpi
- mdpi(中)〜160dpi
- hdpi(高)〜240dpi
- xhdpi(超高)〜320dpi
- xxhdpi(超高)〜480dpi
- xxxhdpi(超高)〜640dpi
取自这里 。
如果您知道屏幕的dpi,则在px和dp之间转换时,这会消除很多困惑。
因此,假设您要为一个hdpi屏幕获取60 dp的图像,那么60 dp的物理像素大小为:
px = 60 * (240 / 160)
#19楼
1) dp: (density independent pixels)
随着屏幕分辨率的提高(当每英寸有更多点/像素时),以dp单位表示的像素数将增加。 相反,在分辨率较低的设备上,以dp为单位表示的像素数将减少。 由于这是一个相对单位,因此需要有一个基准进行比较。 此基准是160 dpi的屏幕。 这是等式: px = dp * (dpi / 160).
2) sp: (scale independent pixels)
该单位根据屏幕dpi(类似于dp)以及用户的字体大小首选项进行缩放。
3) px: (pixels)
屏幕上的实际像素或点。
有关更多详细信息,您可以访问
#20楼
Android中的屏幕大小分为ldpi
, mdpi
, hdpi
, xhdpi
, xxhdpi
和xxxhdpi
。 屏幕密度是屏幕区域(如英寸)内的像素数量。 通常,它以每英寸点数( dpi
)为单位进行测量。
PX(Pixels):
- 我们通常映射到屏幕像素的标准像素。
px
用于绝对像素。 如果要给出宽度或高度的绝对像素,则使用此选项。 不建议。
DP/DIP(Density pixels / Density independent pixels):
dip == dp
。 在较早的Android版本中,使用dip,后来更改为dp
。 这是px
替代方法。通常,我们永远不要使用
px
因为它是绝对值。 如果使用px
设置宽度或高度,并且该应用程序正在下载到不同屏幕尺寸的设备中,则该视图将不会按照屏幕原始尺寸拉伸。强烈建议使用
dp
代替px
。 如果要提及宽度和高度以根据屏幕尺寸动态增大和缩小,请使用dp
。如果我们提供
dp/dip
,则android将基于160像素大小的屏幕自动计算像素大小。
SP(Scale independent pixels):
根据用户的字体大小首选项进行缩放。 字体应使用
sp
。当提到适合各种屏幕尺寸的字体大小时,请使用
sp
。 这类似于dp
。用sp
特别是对字体大小增长和收缩动态地根据屏幕尺寸
Android文档说:
指定尺寸时,请始终使用
dp
或sp
单位。dp
是与密度无关的像素,它对应于160dpi
像素的物理尺寸。sp
是相同的基本单位,但会根据用户的首选文本大小进行缩放(这是与缩放无关的像素),因此在定义文本大小时应使用此度量单位
#21楼
定义
px或点是物理屏幕上的像素 。
dpi是物理屏幕上的每英寸像素,代表显示的密度。
- ldpi(低)〜120dpi
- mdpi(中)〜160dpi
- hdpi(高)〜240dpi
- 2015年大多数设备都在这里
- xhdpi(超高)〜320dpi
- 苹果iPhone 4/5/6,Nexus 4
- xxhdpi(超高)〜480dpi
- Nexus 5
- xxxhdpi(超高)〜640dpi
dip或dp是非密度像素 ,即取决于物理密度,它们对应于更多或更少的像素。
- 1dpi = 1像素(在mdpi上)
sp或sip是与比例无关的像素 。 在“设置” >“ 辅助功能”中打开“ 大字体”选项时,它们会缩放
- 1sp = 1dp
- 1sp = 1.2dp,具有可访问性大文本
使用什么?
使用sp作为文本大小。
将dp用于其他所有内容。
#22楼
Android
屏幕尺寸分为small
, medium
, large
, extra large
, double-extra
和triple-extra
。 屏幕密度是屏幕区域(如英寸)内的像素数量。 通常,它以每英寸点数(dpi)为单位进行测量。 屏幕密度分为低,中,高和超高。 分辨率是屏幕中的像素总数。
- dp:密度独立像素,它根据屏幕密度而变化。 在160 dpi屏幕中,1 dp = 1像素。 除字体大小外,请始终使用dp。
- 倾角:倾角== dp。 在较早的Android版本中,使用了dip,后来更改为dp。
- sp:缩放独立像素,根据用户的字体大小首选项进行缩放。 字体应使用sp。
- px:我们通常的标准像素,它映射到屏幕像素。
- in:英寸,相对于物理屏幕尺寸。
- mm:相对于物理屏幕尺寸的毫米。
- pt:相对于物理屏幕尺寸的1/72英寸。
单位换算公式
px = dp * (dpi / 160)
设备中的dp至px
以下示例可能有助于更好地理解。 基于120(ldpi),160(mdpi),240(hdpi),320(xhdpi),480(xxhdpi)和640(xxxhdpi)的存储桶大小进行缩放。 Google建议的ldpi:mdpi:hdpi:xhdpi:xxhdpi设计比率为3:4:6:8:12
一个150px X 150px的图片将占据,
- 150 dp X 150 dp屏幕空间(mdpi)
- 100 dx X 100 dp屏幕空间(hdpi)
- 75 dp X 75 dp屏幕空间,单位为xhdpi
如果希望在所有Android设备上使用统一的UI设计,可以使用以下DPI计算器来修复图像尺寸和其他尺寸。
Java中的DPI计算器
/*
Program output
LDPI: 165.0 X 60.0
MDPI: 220.0 X 80.0
HDPI: 330.0 X 120.0
XHDPI: 440.0 X 160.0
XXHDPI: 660.0 X 240.0
XXXHDPI: 880.0 X 320.0
*/
public class DPICalculator {
private final float LDPI = 120;
private final float MDPI = 160;
private final float HDPI = 240;
private final float XHDPI = 320;
private final float XXHDPI = 480;
private final float XXXHDPI = 640;
private float forDeviceDensity;
private float width;
private float height;
public DPICalculator(float forDeviceDensity, float width, float height){
this.forDeviceDensity = forDeviceDensity;
this.width = width;
this.height = height;
}
public static void main(String... args) {
DPICalculator dpiCalculator = new DPICalculator(240,330,120);
dpiCalculator.calculateDPI();
}
private float getPx(float dp, float value) {
float px = dp * (value / forDeviceDensity );
return px;
}
private void calculateDPI() {
float ldpiW = getPx(LDPI,width);
float ldpiH = getPx(LDPI,height);
float mdpiW = getPx(MDPI,width);
float mdpiH = getPx(MDPI,height);
float hdpiW = getPx(HDPI,width);
float hdpiH = getPx(HDPI,height);
float xdpiW = getPx(XHDPI,width);
float xdpiH = getPx(XHDPI,height);
float xxdpiW = getPx(XXHDPI,width);
float xxdpiH = getPx(XXHDPI,height);
float xxxdpiW = getPx(XXXHDPI,width);
float xxxdpiH = getPx(XXXHDPI,height);
System.out.println("LDPI: " + ldpiW + " X " + ldpiH);
System.out.println("MDPI: " + mdpiW + " X " + mdpiH);
System.out.println("HDPI: " + hdpiW + " X " + hdpiH);
System.out.println("XHDPI: " + xdpiW + " X " + xdpiH);
System.out.println("XXHDPI: " + xxdpiW + " X " + xxdpiH);
System.out.println("XXXHDPI: " + xxxdpiW + " X " + xxxdpiH);
}
}
更多信息请参考以下链接。
http://javapapers.com/android/difference-between-dp-dip-sp-px-in-mm-pt-in-android/
#23楼
我想提供一种简单的方法来了解dp
。 实际上,我认为dp
是最容易理解的。 dp
只是一个物理长度单位。 它的尺寸与mm
或inch
相同。 对于我们来说,写50dp
, 60dp
而不是50/160 inch
或60/160 inch
,因为无论屏幕大小或分辨率如何,一个dp
仅为1/160 inch
。
唯一的问题是,某些屏幕的android dpi不准确。 例如,分类为160dpi的屏幕可能确实具有170dpi。 因此, dp
的计算结果是模糊的。 它应大约等于1/160 inch
。
#24楼
我见过一篇不错的文章,关于为不同的屏幕分辨率设计Android应用程序UI,我想把它留在这里仅供那些在该领域搜索的人使用。 是的,我知道它在Google文档中有所描述(并在上面的帖子中提到),我读过,但这对我不利(是的,我可能太傻了))。 我仍然不清楚如何设计能够处理不同屏幕尺寸的布局。 当我需要为不同的屏幕实现“灵活的” UI布局时,我讨厌DP概念。 (嘿,iOS开发人员-是的,您说对了,这就是Storyboard的概念)。
Android的UI概念不错,但不幸的是缺少iOS Storyboard功能。 在Android中设计灵活的UI绝非易事(最好)。
这里有一篇文章,它帮助我了解了如何在Android中为不同的屏幕尺寸制作布局:
JMSTUDIO博客:-确定Android应用程序的屏幕大小
如何为不同屏幕尺寸的Android应用程序设计UI
为了设计用于不同屏幕尺寸的应用程序用户界面,我们的初始设计必须满足每种屏幕尺寸所需的最小空间。 Android为每种广义屏幕类型定义了最小尺寸(以dp为单位)。 这是Android屏幕尺寸指南。 当我们获得以dp为单位的屏幕尺寸时,仅设计Android应用程序用户界面还不够。 对于每种屏幕尺寸,我们需要为每种密度准备图形和位图图像。 这是Android屏幕密度指南。
为了便于计算,我们可以遵循四个广义密度之间的3:4:6:8缩放比例。 如果我们为ldpi设备创建36×36像素的图片,则其他密度的图片尺寸对于mdpi为48×48,对于hdpi为72×72,对于xhdpi为96×96。
如何在Photoshop中设计Android Apps UI
由于密度独立单位dp,许多设计师在用photoshop或其他基于像素的图形设计工具中设计Android应用程序UI时遇到问题。 设计人员不知道如何将dp映射到像素。 Google也没有为他们提供清晰的Android UI设计指南,尽管它们提供了dp和像素转换的基本公式。
按照Android的定义,在160 dpi设备(mdpi)下1pd等于1px。 因此,我们要为密度为mdpi的xlarge Android设备设计一个Android应用,我们可以将像素的UI尺寸定义为宽度960像素和高度720px; 遵循相同的映射规则,我们可以获得以下Android App屏幕尺寸UI设计指南:
添加 :如果您也对“灵活的” UI感兴趣,请查看以下库: 一个提供新大小单位sdp(可缩放dp)的Android SDK。 这个大小单位与屏幕大小成比例 (在有关SDP
库的答案中也提到了这一点)
ADDED2 Google终于了解了iOS Storeboard UI概念的实用性,下面是适用于Android世界的ConstraintLayout
: 使用ConstraintLayout构建响应式UI
#25楼
请阅读社区维基的答案。 除了上述答案外,下面提到的还有一些要考虑的信息。 大多数Android开发人员在开发应用程序时都会错过这一点,因此我补充了这些观点。
sp =比例无关像素
dp =密度无关像素
dpi =密度像素
我已经通过以上答案...找不到完全正确的答案。 sp表示文本大小,dp表示布局范围-标准。 但是,如果在大多数设备中使用不当 , 则sp的文本大小会破坏布局 。
sp使用设备的文本大小,而dp使用设备密度标准的文本大小(在设备中永不更改)说100sp文本可以占用屏幕的80%或屏幕的100%,具体取决于设备中设置的字体大小
您也可以将sp用作布局范围,它将起作用:) 没有标准应用程序将sp用作整个文本
考虑到UX,请将sp和dp用于文本大小。
- 不要在工具栏中的文本中使用sp(可以使用dp来为不同屏幕尺寸使用android变暗)
- 不要在有界的小按钮,非常小的文本等中使用sp表示文本
某些人在手机中使用巨大的FONT字体以提高可读性,因此给他们小的硬编码尺寸的文本将是UX问题。 在必要时将sp用作文本,但请确保在用户更改其设置时它不会破坏布局。
同样,如果您有一个支持所有尺寸的应用程序,则添加xxxhdpi资产会大大增加应用程序的大小。 但是现在xxxhdpi电话很常见,因此我们必须至少在侧栏,工具栏和底部栏中包含xxxhdpi资产。 最好转移到矢量图像,以在所有屏幕尺寸上获得统一且质量更好的图像。
另请注意,人们在手机中使用自定义字体。 因此,缺少字体会导致间距和全部问题。 说自定义字体的文本大小12sp可能比默认字体多花一些像素。
请参阅google开发者网站,了解有关Android的屏幕密度和基于强度的详细信息。 https://developer.android.com/training/multiscreen/screendensities
#26楼
sp:独立于比例的像素
您应该将其与文本一起使用,因为它会根据用户在其设备中使用的字体大小自动缩放。
px:像素或图片元素是屏幕上的单点
#27楼
SDP-可缩放的尺寸单位-基本上不是单位,而是不同屏幕尺寸的尺寸资源。
试试Intuit的sdp库。 解决单位问题非常方便,您可以快速支持多个屏幕 。
用法
android:paddingBottom="@dimen/_15sdp"
表示肯定,而android:layout_marginTop="@dimen/_minus10sdp"
表示否定sdp sdp
对于values-sw<N>dp
文件夹中的每个大小,它在dp中具有等效的值(sw = minimumWidth)。
注意
小心使用! 在大多数情况下,您仍然需要为平板电脑设计不同的布局。
例
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_minus10sdp"
android:paddingBottom="@dimen/_15sdp"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:includeFontPadding="false"
android:text="♡"
android:textColor="#ED6C27"
android:textSize="@dimen/_70sdp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:includeFontPadding="false"
android:text="U"
android:textColor="@android:color/black"
android:textSize="@dimen/_70sdp" />
</LinearLayout>
您可以将db用于文本大小,但我更喜欢ssp作为文本大小。
有关更多详细信息,请查看库GitHub页面 。
#28楼
手机的屏幕由数千个称为像素(px)的小点组成。 像素是制作图片的最小元素。 用来制作图片或文字的像素数量越多,它变得越清晰,并使智能手机的屏幕更易于阅读。
屏幕分辨率是根据屏幕上的像素数来衡量的。 屏幕分辨率是购买设备时常用的规格,但实际上在设计Android时并没有多大用处,因为以像素为单位来考虑屏幕会忽略物理尺寸的概念,这对于触摸设备而言确实非常重要。
与密度无关的像素(dp或dip)使设计人员可以创建以预期方式显示的资产,无论目标设备的分辨率或密度如何。
与密度无关的像素(dp或dip)等于基线密度或160 dpi(每英寸点数)下的一个像素。
1 px / 1dp = 160 dpi / 160 dpi
2 px / 1dp = 320 dpi(2x)/ 160 dpi
哪里,
dpi是每英寸点数
因此,在320 dpi时,1 dp等于2 px。
式
px / dp = dpi / 160dpi
每英寸点数(dpi)是显示屏上清晰度(即照明点的密度)的度量。 给定图片分辨率的每英寸点数将基于整个屏幕尺寸而有所不同,因为相同数量的像素分布在不同的空间上。
使用与密度无关的像素可以帮助我们处理这样的情况,例如您拥有两个具有相同像素分辨率但空间量不同的设备。 假设在某种情况下,平板电脑和手机的像素分辨率分别为1280 x 800像素(160 dpi)和800 x 1280像素(320 dpi)。
现在,由于平板电脑处于基准密度(160 dpi),因此其物理和与密度无关的像素大小相同,为1280 x800。另一方面,手机具有更高的像素密度,因此其与密度无关的像素数量是物理像素的一半。像素。 因此,一部电话具有400 x 640密度独立像素。 因此,使用与密度无关的像素,可以使人更容易想到平板电脑比手机具有更多的空间。
同样,如果您有两台设备的屏幕尺寸相似,但像素密度不同,例如,一台设备为800 x 1280像素(320 dpi),另一台设备为400 x 640像素(160 dpi),则无需完全定义这两种设备的布局不同,因为我们可以根据密度独立像素来衡量资产,这对于两种设备而言都是相同的。
800 x 1280像素(320dpi)= 400 x 640密度独立像素(dp)
400 x 640像素(160 dpi)= 400 x 640密度独立像素(dp)
与比例无关的像素(sp)是字体大小的首选单位。 出于可访问性目的,Android允许用户自定义设备的字体大小。 阅读文本时遇到问题的用户可以增加其设备的字体大小。 通常,您可以在手机或平板电脑的显示设置中的字体大小下找到此选项。 通常也可以通过辅助功能设置来使用它。
使用与比例无关的像素,当设备的字体大小为正常或100%时,16 sp与16 dp完全相同。 但是,当设备的字体大小较大时(例如125%),16 sp将转换为20 dp或1.25乘以16。
如果使用dp作为字体大小单位,则无论用户是否自定义设备的字体大小,该文本都具有特定的物理大小。 使用sp单位将为视力障碍的人带来更好的体验。
参考 : Udacity ,谷歌
#29楼
在回答这个问题之前,让我先减少单位数量。 因此,在这里您可以使用: dp或dip都相同,并且被称为与密度无关的像素 。
1. px-代表像素。 像素是屏幕上的一个点。 通常,在移动行业中,以ppi(每英寸像素)为单位进行测量。 屏幕分辨率与ppi成正比,每英寸的像素数越大,屏幕分辨率越高。
例如,如果绘制大小为200 px * 200 px的图像,则高分辨率设备与低分辨率设备上的外观必须有所不同。 原因是低分辨率手机上的200像素图像看起来比高分辨率设备上的图像大。
下图显示了不同手机上相同图像的分辨率-
2. dip或dp-基于屏幕物理密度的抽象单位。 这些单位是相对于160 dpi屏幕的,因此1 dp是160 dpi屏幕上的一个像素。 dp与像素的比率将随屏幕密度而变化,但不一定成正比。 “密度独立性”是指UI元素在具有不同密度的屏幕上的均匀显示。
- 显示80px(左侧图像)和80 dp(右侧图像)的图像 。 结帐差异。
dp等于屏幕上密度为160的一个物理像素。 要计算dp:
dp =(像素宽度* 160)/屏幕密度
3. sp-代表可缩放像素。 通常, sp用于UI上的文本,并且sp保留字体设置。 例如,如果用户选择的字体大于30 sp ,它将根据用户的喜好自动缩放以显示较大的字体。
#30楼
关于此的几乎所有内容,以及如何为不同尺寸和密度的多个屏幕提供最佳支持,在此处都有很好的记录:
屏幕尺寸
实际物理尺寸,以屏幕的对角线为单位。 为简单起见,Android将所有实际屏幕尺寸分为四个通用尺寸:小,普通,大和特大。屏幕密度
屏幕物理区域内的像素数; 通常称为dpi(每英寸点数)。 例如,与“正常”或“高”密度屏幕相比,“低”密度屏幕在给定的物理区域内具有较少的像素。 为简单起见,Android将所有实际屏幕密度分为六种广义密度:低,中,高,超高,超高和超高。取向
从用户的角度看屏幕的方向。 这可以是横向或纵向,这意味着屏幕的宽高比分别为宽或高。 请注意,默认情况下,不同的设备不仅会以不同的方向运行,而且在用户旋转设备时,其方向可能会在运行时发生变化。解析度
屏幕上的物理像素总数。 添加对多屏幕的支持时,应用程序无法直接使用分辨率工作; 应用程序应仅关注屏幕尺寸和密度,这由广义尺寸和密度组指定。密度无关像素(dp)
在定义UI布局时应使用的虚拟像素单位,以密度独立的方式表示布局尺寸或位置。 与密度无关的像素等效于160 dpi屏幕上的一个物理像素,这是系统为“中”密度屏幕假定的基线密度。 在运行时,系统会根据使用中屏幕的实际密度,根据需要透明地处理dp单位的任何缩放比例。 dp单位到屏幕像素的转换很简单:px = dp * (dpi / 160)
。 例如,在240 dpi屏幕上,1 dp等于1.5物理像素。 定义应用程序的UI时,应始终使用dp单位,以确保在具有不同密度的屏幕上正确显示UI。
如果您打算针对一种以上类型的设备开发Android应用程序,则应至少阅读一次屏幕支持开发文档。 除此之外,了解具有特定屏幕配置的活动设备的实际数量总是一件好事。