# 适配规范

Vela OS 支持一系列适配多种屏幕的技术能力。

# 自适应布局

系统提供的容器组件均默认遵循 Flex 弹性布局规则,使用弹性布局可以实现屏幕自适应布局。

比如以下代码可以实现行内多个 item 平均分布。

<div>
  <text style="flex-grow: 1; background-color:aqua;">1</text>
  <text style="flex-grow: 1; background-color:yellow;">2</text>
  <text style="flex-grow: 1; background-color:red;">3</text>
</div>

更多说明请参考Flex 布局示例

# 自适应单位

在编写 UI 样式时,可以采用系统提供的自适应长度单位,包括:

  • px
  • %

# px

px 在 Vela 应用中不表示屏幕的物理像素,而是相对于项目配置基准宽度的单位,其原理类似于rem。

开发者在 manifest 文件中将 designWidth 字段配置为设计基准宽度(设计稿宽度),然后在样式描述中使用该长度单位,数值直接使用设计稿中的像素值,系统将自动计算使 Vela 应用 UI 在不同屏幕上进行等比缩放。

{
  "config": {
    "designWidth": 336
  }
}
<template>
  <div class="demo-page">
    <div class="container"></div>
  </div>
</template>

<style>
.demo-page {
  justify-content: center;
  align-items: center;
}
.container {
  width: 168px;
  height: 168px;
  background-color: aquamarine;
}
</style>

如上示例中将 designWidth 配置为 336px,那么所有的 px 值使用都会按照 336px 的基准宽度换算。 假设设备屏幕实际宽度为 336 像素,则 container 元素的实际宽度也为 168 像素;如果设备屏幕实际宽度为 192 像素,则 container 元素的实际宽度为 96 像素。

336*480 屏幕 / 192*490 屏幕

更多说明请参考长度单位

# 百分比%

% 表示百分比,许多样式属性可以取百分比值,经常用以根据父对象来确定大小。

比如以下代码可以实现行内多个 item 按百分比占据父容器宽度,

<div>
  <text style="width: 20%; background-color:aqua;">1</text>
  <text style="width: 40%; background-color:yellow;">2</text>
  <text style="width: 40%; background-color:red;">3</text>
</div>

更多说明请参考CSS 百分比单位 (opens new window)

# 固定长度单位3+

在有的布局场景下,需要使用固定长度单位,系统支持的 dp 长度单位可满足这个需求。

DP 长度单位表示设备独立像素(device-independent pixel),也叫密度无关像素,可以认为是计算机坐标系统中的一个点,这个点代表一个可以由程序使用的逻辑像素,是一个近似物理尺寸的单位,其计算公式为:

屏幕宽度的 DP 值 = 屏幕分辨率的宽度 / DPR
元素宽/高度的 DP 值 = 元素宽/高度的物理像素数 / DPR

DPR 表示设备像素比(device pixel ratio),是设备物理像素和逻辑像素(DP)的比值,其计算公式为:

DPR = 设备 PPI / 160

PPI(pixels per inch)表示每英寸的像素数,表征屏幕的物理密度,因此 DPR 又被称为逻辑密度。 设备屏幕的逻辑密度值(DPR)可以通过 device 接口获取。

比如以下代码可以实现元素在不同尺寸屏幕上保持近似的物理尺寸,从而在大屏幕上呈现更多的元素。

<template>
  <div class="container">
    <div class="text-box">
      <text style="background-color: aquamarine;">
        A
      </text>
      <text style="background-color: #ff0000;">
        B
      </text>
      <text style="background-color: #00ff00;">
        C
      </text>
      <text style="background-color: #0000ff;">
        D
      </text>
    </div>
  </div>
</template>

<style>
  .container {
    justify-content: center;
    align-items: center;
  }
  .text-box {
    justify-content: center;
    flex-wrap: wrap;
  }
  text {
    width:116dp;
    height: 30dp;
    font-size: 15dp;
    text-align: center;
  }
</style>

466*466 屏幕 / 192*490 屏幕

# 媒体查询

媒体查询是 CSS3 引入的一个功能,用于根据不同的屏幕尺寸和设备类型,为网页应用不同的样式。

在 Vela JS 应用中,也可以使用类似的媒体查询规范来针对不同屏幕和设备编写样式,详细介绍请参考媒体查询

比如以下代码可以实现根据屏幕形状来应用不同的样式。

注意: 以下示例代码的designWidth466

<template>
  <div class="container">
    <text>10:30</text>
    <text>我的待办</text>
  </div>
</template>

<style>
  /* 当屏幕为圆形屏幕时 */
  @media screen and (shape: circle) {
    .container {
      padding-left: 80px;
      padding-right: 80px;
      padding-top: 40px;
      flex-direction: row;
      align-items: flex-start;
      justify-content: space-between;
    }
    text {
      font-size: 40px;
    }
  }
  /* 当屏幕为胶囊形屏幕时 */
  @media screen and (shape: pill-shaped) {
    .container {
      padding-top: 50px;
      flex-direction: column;
      align-items: center;
    }
    text {
      margin-top: 10px;
    }
  }
</style>

466*466 屏幕 / 192*490 屏幕

# 获取屏幕信息

在 Vela JS 应用中,可以通过 device feature 接口获取屏幕信息,包括屏幕形状、屏幕分辨率等。根据获取到的结果可以进行相应的样式适配。

比如以下代码可以实现根据屏幕形状决定 progress 组件的类型(是否是弧形)。

<template>
  <div class="container">
    <progress percent="80" type="{{progressType}}"></progress>
  </div>
</template>

<script>
  import device from '@system.device'

  export default {
    data: {
      progressType: "horizontal"
    },
    onInit() {
      const that = this
      device.getInfo({
        success: function(ret) {
          that.progressType = ret.screenShape === "circle" ? "arc" : "horizontal"
        }
      })
    }
  }
</script>

<style>
  .container {
    padding: 20px;
  }
</style>

圆形屏幕 / 矩形屏幕

详细介绍请参考 设备信息 device