ArkUI为开发者提供4种像素单位,鸿蒙ArkUI 框架采用vp为基准数据单位。
px | 屏幕物理像素单位。 |
vp | 屏幕密度相关像素,根据屏幕像素密度转换为屏幕物理像素,当数值不带单位时,默认单位vp。在实际宽度为1440物理像素的屏幕上,1vp约等于3px。 |
fp | 字体像素,与vp类似适用屏幕密度变化,随系统字体大小设置变化。 |
lpx | 视窗逻辑像素单位,lpx单位为实际屏幕宽度与逻辑宽度(通过designWidth 配置)的比值,designWidth默认值为720。当designWidth为720时,在实际宽度为1440物理像素的屏幕上,1lpx为2px大小。 |
这里对这几个单位进行介绍
- px 比较容易理解,跟Android、iOS 平台的是一致的。px:像素的单位,1px代表手机屏幕上的一个像素点。比如常见的手机分辨率有320×480,480×800,1080×1920等,这些数值的单位都是px;由于px在不同手机上的大小不同,差别较大,适配性太差,不建议使用。
- vp 相当于Android 里面的 dp。 由于手机分辨率不同,应用中用到的图片某个固定尺寸大小的图片,或某个固定字号的文本就会因手机分辨力不同而出现失真或变形的情况,为了更好的适配不同的手机,故而就有了不依赖与像素的单位vp(还有fp,这个相当于Android 的 sp)。
使用虚拟像素vp,使元素在不同密度的设备上具有一致的视觉体量。
- fp:上面介绍过了,跟 vp 类似,主要用于字体大小;
- lpx:这是比 Android 多的一个单位,多这个的原因,是因为鸿蒙是跨端的,也就是存在 pc、pad 等,在其他的端存在视窗可以拉长缩小的情况,所以这个主要是应用在需要适配多端的场景。
综上,如果没有特殊诉求,一般都使用vp
,或者调用系统提供的vp2px(10) + 'px'
这种方式。
也就是
// xxx.ets
@Entry
@Component
struct Example {
build() {
Column() {
Flex({ wrap: FlexWrap.Wrap }) {
Column() {
Text("width('220vp')")
.width('220vp')
.height(40)
.backgroundColor(0xF9CF93)
.textAlign(TextAlign.Center)
.fontColor(Color.White)
.fontSize('12vp')
}.margin(5)
Column() {
Text("width(vp2px(220) + 'px')")
.width(vp2px(220) + 'px')
.height(40)
.backgroundColor(0xF9CF93)
.textAlign(TextAlign.Center)
.fontColor(Color.White)
.fontSize('12vp')
}.margin(5)
}
}
}