自定义样式与响应式布局技巧(Flex/Grid/MediaQuery) HarmonyOS 5.0.0 或以上

适配版本:HarmonyOS 5.0.0 或以上
阅读目标:掌握 ArkUI 中的布局系统与样式定制方法,实现多设备响应式适配


🎯 一、ArkUI 布局系统核心概念

概念作用描述
Row横向布局容器,子组件水平排列
Column纵向布局容器,子组件垂直排列
Flex弹性布局,支持主轴方向自动换行、伸缩等
Grid网格布局,指定行列数、列宽行高
Stack层叠布局,适合悬浮按钮、气泡等 UI

🧪 二、使用 Flex 实现响应式换行布局

@Entry
@Component
struct FlexDemo {
  build() {
    Flex({ direction: FlexDirection.Row, wrap: FlexWrap.Wrap }) {
      ForEach(Array.from({ length: 8 }, (_, i) => i + 1), item => {
        Text(`卡片 ${item}`)
          .fontSize(16)
          .backgroundColor('#eee')
          .padding(10)
          .margin(5)
          .borderRadius(6)
      }, item => item)
    }
    .padding(10)
  }
}

✅ 效果说明:

  • 超出主轴宽度自动换行

  • 每个元素间有 margin,视觉舒适

  • 适合标签流式展示、按钮宫格等布局


📐 三、使用 Grid 构建规则网格布局

@Entry
@Component
struct GridDemo {
  build() {
    Grid({ columns: 3 }) {
      ForEach(Array.from({ length: 9 }, (_, i) => i + 1), item => {
        Text(`单元 ${item}`)
          .height(50)
          .backgroundColor('#ddd')
          .textAlign(TextAlign.Center)
          .margin(5)
          .borderRadius(4)
      }, item => item)
    }
    .padding(10)
  }
}

✅ 使用场景:

  • 商品卡片展示

  • 快捷入口菜单

  • 设置页分类网格


📱 四、通过 MediaQuery 实现自适应布局

HarmonyOS 提供 @ohos.devicegetDeviceType() 以及 Display API 可用于设备判断:

import device from '@ohos.device'
import display from '@ohos.display'

@Entry
@Component
struct ResponsiveCard {
  @State screenWidth: number = 0
  @State isTablet: boolean = false

  aboutToAppear() {
    this.isTablet = device.getDeviceType() === 'tablet'

    display.getDefaultDisplay().then(d => {
      this.screenWidth = d.width
    })
  }

  build() {
    Column() {
      Text(`当前设备:${this.isTablet ? '平板' : '手机'}`)
        .fontSize(18)

      Text(`屏幕宽度:${this.screenWidth}px`)
        .fontSize(16)
    }
    .padding(20)
  }
}

🎨 五、自定义样式技巧

1. 圆角 + 阴影卡片样式

Column()
  .padding(20)
  .borderRadius(16)
  .backgroundColor('#fff')
  .shadow({ radius: 8, color: '#00000022', offsetX: 0, offsetY: 2 })

2. 多主题色配置(黑夜模式)

可通过系统设置或手动定义 @State isDarkMode 切换主题色:

.backgroundColor(this.isDarkMode ? '#000' : '#fff')
.fontColor(this.isDarkMode ? '#fff' : '#000')

✅ 六、小结

技术点掌握内容
Flex 布局实现自适应换行排列
Grid 网格构建规则宫格布局
响应式适配使用设备信息控制 UI 呈现,适配手机/平板
自定义样式阴影、圆角、颜色切换,增强视觉风格

📘 下一篇预告

第9篇|页面状态管理与组件通信:@State、@Prop、@Provide 使用实战

将深入讲解 ArkTS 中三种状态装饰器的使用场景,及父子组件的数据联动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值