鸿蒙应用开发-UI尺寸与单位与应用场景

335 阅读4分钟

前端我们通常使用 px % rem 来设置元素的尺寸与位置,在 ArkUI 中提供了4种像素单位,即:px、vp、fp、lpx。并且框架采用vp为基准数据单位。

单位

px (Pixels)  :

  • 定义:px代表屏幕上的像素点,是手机屏幕分辨率的单位,即屏幕物理像素单位。
  • 特点:由于不同手机的屏幕大小和分辨率存在差异,px单位在不同手机上的实际大小也会有所不同,这导致了其适配性相对较差。
  • 适用场景当设计需要与具体像素尺寸相关,或者在不同设备和屏幕分辨率上需要一致的表现时使用。在视网膜或高清屏幕上可能需要额外的考虑。

vp (Viewport Percentage)  :

  • 定义:vp是视口百分比单位,基于视口(即浏览器窗口)的宽度或高度,屏幕密度相关像素,根据屏幕像素密度转换为屏幕物理像素,当数值不带单位时,默认单位vp。在实际宽度为1440物理像素的屏幕上,1vp约等于3px。
  • 特点:它允许组件的大小根据视口的大小动态调整。
  • 适用场景常用于响应式设计,确保组件在不同屏幕尺寸上保持相对大小。
  • 温馨提示:vp是默认像素单位。

fp (Font Size Percentage)  :

  • 定义:字体像素,是字体大小百分比单位,基于父元素的字体大小,与vp类似适用屏幕密度变化,随系统字体大小设置变化。
  • 特点:它允许组件的大小相对于父元素的字体大小进行调整。
  • 适用场景在响应式设计中特别有用,可以确保组件与文本内容保持适当的比例。

lpx (Logical Pixels)  :

  • 定义:lpx是逻辑像素单位,用于解决不同设备分辨率和像素密度的问题,lpx单位为实际屏幕宽度与逻辑宽度(通过designWidth配置)的比值,designWidth默认值为720。当designWidth为720时,在实际宽度为1440物理像素的屏幕上,1lpx为2px大小。
  • 特点:它基于设备的像素密度进行转换,以提供一致的视觉尺寸。
  • 适用场景当需要确保组件在不同设备(如桌面、平板、手机等)上看起来一致时使用。

单位转换

接口描述
vp2px(value : number) : number将vp单位的数值转换为以px为单位的数值。**说明:**默认使用当前UI实例所在屏幕的虚拟像素比进行转换,UI实例未创建时,使用默认屏幕的虚拟像素比进行转换。
px2vp(value : number) : number将px单位的数值转换为以vp为单位的数值。**说明:**默认使用当前UI实例所在屏幕的虚拟像素比进行转换,UI实例未创建时,使用默认屏幕的虚拟像素比进行转换。
fp2px(value : number) : number将fp单位的数值转换为以px为单位的数值。
px2fp(value : number) : number将px单位的数值转换为以fp为单位的数值。
lpx2px(value : number) : number将lpx单位的数值转换为以px为单位的数值。
px2lpx(value : number) : number将px单位的数值转换为以lpx为单位的数值。

实例

@Entry
@Component
struct Example {
  build() {
    Column() {
      Flex({ wrap: FlexWrap.Wrap }) {
        Column() {
          Text("width(220)")
            .width(220)
            .height(40)
            .backgroundColor(0x000000)
            .textAlign(TextAlign.Center)
            .fontColor(Color.White)
            .fontSize('12vp')
        }.margin(5)

        Column() {
          Text("width('220px')")
            .width('220px')
            .height(40)
            .backgroundColor(0x000000)
            .textAlign(TextAlign.Center)
            .fontColor(Color.White)
        }.margin(5)

        Column() {
          Text("width('220vp')")
            .width('220vp')
            .height(40)
            .backgroundColor(0x000000)
            .textAlign(TextAlign.Center)
            .fontColor(Color.White)
            .fontSize('12vp')
        }.margin(5)

        Column() {
          Text("width('220lpx') designWidth:720")
            .width('220lpx')
            .height(40)
            .backgroundColor(0x000000)
            .textAlign(TextAlign.Center)
            .fontColor(Color.White)
            .fontSize('12vp')
        }.margin(5)

        Column() {
          Text("width(vp2px(220) + 'px')")
            .width(vp2px(220) + 'px')
            .height(40)
            .backgroundColor(0x000000)
            .textAlign(TextAlign.Center)
            .fontColor(Color.White)
            .fontSize('12vp')
        }.margin(5)

        Column() {
          Text("fontSize('12fp')")
            .width(220)
            .height(40)
            .backgroundColor(0x000000)
            .textAlign(TextAlign.Center)
            .fontColor(Color.White)
            .fontSize('12fp')
        }.margin(5)

        Column() {
          Text("width(px2vp(220))")
            .width(px2vp(220))
            .height(40)
            .backgroundColor(0x000000)
            .textAlign(TextAlign.Center)
            .fontColor(Color.White)
            .fontSize('12fp')
        }.margin(5)
      }.width('100%')
    }
  }
}复制

cke_27995.png