ArkUI ArcList:圆形屏列表别按直屏思路硬套

举报
蓝瘦的蜕变 发表于 2026/08/11 09:49:53 2026/08/11
【摘要】 今天我们看一个更特殊的列表:ArcList。它主要面向圆形屏幕,适合穿戴设备这类场景。 这篇只做能力展示。我们不假设你当前设备就是圆形屏,也不讲表冠事件、横滑操作和懒加载,先把最基础的结构看明白。 先引入 ArcList ArcList 在当前 SDK 里通过 @kit.ArkUI 导出,所以页面顶部要写: Lengt

ArkUI ArcList:圆形屏列表别按直屏思路硬套

今天我们看一个更特殊的列表:ArcList。它主要面向圆形屏幕,适合穿戴设备这类场景。

这篇只做能力展示。我们不假设你当前设备就是圆形屏,也不讲表冠事件、横滑操作和懒加载,先把最基础的结构看明白。

先引入 ArcList

ArcList 在当前 SDK 里通过 @kit.ArkUI 导出,所以页面顶部要写:

import { ArcList, ArcListItem, LengthMetrics } from '@kit.ArkUI';

LengthMetrics 用来给 space() 传 vp 单位的间距。这个细节很容易被忽略,直接写数字不一定符合当前声明。

用 ArcListItem 包住每一项

核心结构还是列表,只是子项换成了 ArcListItem

ArcList() {
  ForEach(this.items, (item: ArcMenuItem, index: number) => {
    ArcListItem() {
      this.arcRow(item)
    }
    .autoScale(index !== 2)
  }, (item: ArcMenuItem) => item.title)
}
.space(LengthMetrics.vp(14))
.scrollBar(BarState.Auto)

autoScale 控制项目靠近边缘时是否跟着缩放。圆形屏上这类视觉变化更常见,直屏列表一般不会这么处理。

别把 ArcList 当普通直屏列表硬套

如果你的目标页面就是手机上的长列表,大概率继续用 ListArcList 的价值在于它服务圆形屏阅读方式:边缘、中心、滚动节奏都和直屏不一样。

你见过哪些穿戴设备页面特别适合做成弧形列表?比如运动、健康、设置,还是通知?可以拿一个你熟悉的场景改改这个 Demo。

完整代码

import { ArcList, ArcListItem, LengthMetrics } from '@kit.ArkUI';

class ArcMenuItem {
  title: string = '';
  desc: string = '';
  color: string = '';

  constructor(title: string, desc: string, color: string) {
    this.title = title;
    this.desc = desc;
    this.color = color;
  }
}

@Entry
@Component
struct ArkUIArcListDemo {
  private items: ArcMenuItem[] = [
    new ArcMenuItem('健康', '今日概览', '#2563EB'),
    new ArcMenuItem('运动', '步数记录', '#0F766E'),
    new ArcMenuItem('音乐', '继续播放', '#7C3AED'),
    new ArcMenuItem('天气', '出门看看', '#C2410C'),
    new ArcMenuItem('提醒', '别忘事情', '#1D4ED8'),
    new ArcMenuItem('设置', '快速调整', '#334155')
  ];

  @Builder
  sectionTitle(title: string, desc: string) {
    Column({ space: 4 }) {
      Text(title)
        .width('100%')
        .fontSize(16)
        .fontWeight(700)
        .fontColor('#0F172A')

      Text(desc)
        .width('100%')
        .fontSize(13)
        .fontColor('#64748B')
        .lineHeight(20)
    }
    .width('100%')
    .alignItems(HorizontalAlign.Start)
  }

  @Builder
  arcRow(item: ArcMenuItem) {
    Row({ space: 10 }) {
      Text(item.title.substring(0, 1))
        .width(40)
        .height(40)
        .fontSize(16)
        .fontWeight(700)
        .fontColor('#FFFFFF')
        .textAlign(TextAlign.Center)
        .backgroundColor(item.color)
        .borderRadius(20)

      Column({ space: 4 }) {
        Text(item.title)
          .fontSize(15)
          .fontWeight(700)
          .fontColor('#0F172A')

        Text(item.desc)
          .fontSize(12)
          .fontColor('#64748B')
      }
      .alignItems(HorizontalAlign.Start)
    }
    .width('100%')
    .height(68)
    .padding({ left: 14, right: 14 })
    .backgroundColor('#FFFFFF')
    .border({ width: 1, color: '#E2E8F0' })
    .borderRadius(34)
    .alignItems(VerticalAlign.Center)
  }

  build() {
    Scroll() {
      Column({ space: 18 }) {
        Text('ArkUI ArcList')
          .width('100%')
          .fontSize(24)
          .fontWeight(700)
          .fontColor('#0F172A')

        Text('圆形屏列表别按直屏思路硬套')
          .width('100%')
          .fontSize(22)
          .fontWeight(700)
          .fontColor('#111827')

        Text('ArcList 更适合圆形屏幕上的纵向列表。这里做一个普通展示,重点看 ArcListItem、项目间距、autoScale 和滚动条,不把它写成复杂业务列表。')
          .width('100%')
          .fontSize(14)
          .fontColor('#64748B')
          .lineHeight(22)

        Column({ space: 12 }) {
          this.sectionTitle('圆形屏先留出弧形浏览空间', 'ArcList 的项目依旧用 ArcListItem 包起来。space 用 LengthMetrics.vp 传入,方便表达 vp 单位的间距。')

          ArcList() {
            ForEach(this.items, (item: ArcMenuItem, index: number) => {
              ArcListItem() {
                this.arcRow(item)
              }
              .autoScale(index !== 2)
            }, (item: ArcMenuItem) => item.title)
          }
          .space(LengthMetrics.vp(14))
          .width('100%')
          .height(360)
          .scrollBar(BarState.Auto)
          .padding({ left: 18, right: 18, top: 12, bottom: 12 })
          .backgroundColor('#FFFFFF')
          .border({ width: 1, color: '#CCFBF1' })
          .borderRadius(8)
        }
        .width('100%')
        .padding(16)
        .backgroundColor('#F0FDFA')
        .borderRadius(8)

        Column({ space: 12 }) {
          this.sectionTitle('autoScale 可以控制边缘缩放感', '圆形屏列表靠近上下边缘时会有缩放效果。个别项目可以关闭 autoScale,让它保持原尺寸。')

          Row({ space: 10 }) {
            Text('autoScale: true')
              .layoutWeight(1)
              .height(44)
              .fontSize(13)
              .fontWeight(700)
              .fontColor('#0F766E')
              .textAlign(TextAlign.Center)
              .backgroundColor('#CCFBF1')
              .borderRadius(8)

            Text('autoScale: false')
              .layoutWeight(1)
              .height(44)
              .fontSize(13)
              .fontWeight(700)
              .fontColor('#7C2D12')
              .textAlign(TextAlign.Center)
              .backgroundColor('#FED7AA')
              .borderRadius(8)
          }
        }
        .width('100%')
        .padding(16)
        .backgroundColor('#FFF7ED')
        .borderRadius(8)
      }
      .width('100%')
      .padding(20)
      .alignItems(HorizontalAlign.Start)
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#FFFFFF')
  }
}
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。