尺寸规范
关于Android的尺寸是一个老生常谈的话题,尺寸在Android开发中最显著的表现就是对屏幕的适配问题。
关于Android的相关尺寸概念,这里就不一一展开了,贴一个关于设计规范的讲解:
Android UI界面设计规范完整版
这里主要拿出Android所特有的尺寸单位:
- px——像素(不是特有)
- dp——描述间距单位
- sp——描述字号单位
px
px,这个单位是一个通用单位,像素可以理解为像素点个数,是不可分割的最小单位(定义上)。
大家可能都听说过分辨率的概念,比如72像素/英寸
,这就表示将1英寸分为72份,每一份作为一个像素点,所以说像素是没有固定大小的,它是和所承载的分辨率有关系的。
dp
正因为像素和分辨率有关系,Android经过这么多年的发展,不同分辨率的手机屏幕已经五花八门,如果直接使用px进行UI层面的开发,必然会出现很多适配问题,所以Android引入了dp的概念。
dp是px结合了分辨率所得出来的一个普适性的数字,对于碎片化的Android屏幕来说,它较好的给了尺寸一个普适参考。(具体计算方式见上文中的链接哦)
sp
sp的引入和dp的目的是一样的,但是适用的对象不太一样,sp更多地用来描述文字的大小,所达到的效果和dp是一样的。
这和Android系统的一个功能有关,用户可以对字号进行控制,那就意味着我们开发者设置的sp只是一个参考值,它会结合用户的选项共同作用于文字的大小,因此将其和dp进行了区分。
注:很多开发者在开发中将文字大小也设置为dp,这是一种不好的实践,正确的应该去根据用户的选择做好相关的适配工作。
Android中所引入的单位及单位转换
Android中所引入的单位:
- COMPLEX_UNIT_PX
- COMPLEX_UNIT_DIP
- COMPLEX_UNIT_SP
- COMPLEX_UNIT_PT
- COMPLEX_UNIT_IN
- COMPLEX_UNIT_MM
在Android中标记的单位如上,分别对应了:
尺寸单位 | 说明 |
---|---|
dp | 与密度无关的像素-基于屏幕物理密度的抽象单位,为不同设备的UI元素的实际大小提供了一致性 |
sp | 与缩放无关的像素-就像dp单位一样,一般用于字体的单位 |
pt | 点数-基于屏幕的物理尺寸的1/72英寸(假设屏幕密度为72dpi)。 |
px | 像素-对应于屏幕上的实际像素。不建议使用此度量单位,因为实际的表示可能会因设备而异。 |
mm | 毫米-基于屏幕的物理尺寸。 |
in | 英寸-基于屏幕的物理尺寸。 |
由于在Android对尺寸进行处理时使用的都是px,那么就存在一个尺寸转化的问题,Android向我们提供了一个方法:
public static float applyDimension(int unit, float value, DisplayMetrics metrics) {
switch (unit) {
case COMPLEX_UNIT_PX: // px to px
return value;
case COMPLEX_UNIT_DIP: // dp to px
return value * metrics.density;
case COMPLEX_UNIT_SP: // sp to px
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT: // pt to px
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN: // in to px
return value * metrics.xdpi;
case COMPLEX_UNIT_MM: // mm to px
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
这个方法包含在TypedValue
类中。
因此我们可以定义一个工具类来简化单位转化的操作:
/**
* 像素密度工具
*
* 相关概念:
* px: 像素
* dp: 屏幕密度的抽象单位
* sp: 根据用户的字体大小首选项进行缩放
* pt: 磅
* in: 英寸
* mm: 毫米
*/
object DensityUtils {
/**
* dp to px
* @param value dp value
* @return px value
*/
fun dp2px(value: Float): Float {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, value,
Resources.getSystem().displayMetrics
)
}
/**
* sp to px
* @param value sp value
* @return px value
*/
fun sp2px(value: Float): Float {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP, value,
Resources.getSystem().displayMetrics
)
}
/**
* pt to px
* @param value pt value
* @return px value
*/
fun pt2px(value: Float): Float {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_PT, value,
Resources.getSystem().displayMetrics
)
}
/**
* in to px
* @param value in value
* @return px value
*/
fun in2px(value: Float): Float {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_IN, value,
Resources.getSystem().displayMetrics
)
}
/**
* mm to px
* @param value mm value
* @return px value
*/
fun mm2px(value: Float): Float {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_MM, value,
Resources.getSystem().displayMetrics
)
}
}
屏幕尺寸
说到尺寸了,那就把屏幕尺寸相关的内容也一起贴出来。
屏幕宽高
说起屏幕尺寸,首先想到的是屏幕的宽高,在我们的项目中经常会使用到屏幕的宽高来进行一些尺寸的适配。
贴出一个可以直接使用的工具类:
/**
* 屏幕参数工具
*/
object ScreenUtils {
private fun getDisplayMetrics(): DisplayMetrics {
return Resources.getSystem().displayMetrics
}
/**
* 获取屏幕宽度
*/
fun getScreenWidth(): Int {
return getDisplayMetrics().widthPixels
}
/**
* 获取屏幕高度
*/
fun getScreenHeight(): Int {
return getDisplayMetrics().heightPixels
}
}
其实获取屏幕宽高的方式还有很多,但是那些方法大多数不是很直观或者需要上下文不是很方便,就写出来了,感兴趣的同学可以自己查找一下其它方法。
总结
关于Android中尺寸的基础概念就讲到这里,重要的是理清楚各个尺寸单位的概念和尺寸之间的转化,在之后文章不会混淆,如果有什么不理解或是错误之处可以联系我,一起交流解惑。
网友评论