在这里插入图片描述

每日一句正能量

我们总被催促着要不停运转、要热爱世界、要解开所有难题。
悄悄告诉你:
可以暂停,可以保留困惑,可以优先照顾自己的心灵花园。
“允许自己偶尔断电,与世界失联一会儿。”
有意识地暂停——不是逃避,而是为自己创造一段精神呼吸的空间。

摘要

摘要:本文记录了一个真实电商App从2D平面界面向3D空间界面改造的完整过程。从首页的Z轴分层到详情页的3D商品展示,从代码实现到性能优化,从数据验证到用户反馈,提供了一份可复制的空间化改造实战指南。


一、项目缘起:为什么必须改造?

2025年秋天,我接到一个校企合作项目:为某电商平台的鸿蒙版App进行空间化改造。这个App已经上线了3年,日活用户约50万,但在用户调研中反复出现一个痛点——“页面太乱了,找不到重点”。

打开App首页,问题一目了然:Banner、金刚区、信息流、悬浮按钮、底部导航,所有元素挤在同一个Z=0的平面上。用户的眼球在十几个信息模块之间来回跳跃,注意力被无限分散。转化率数据显示:首页到详情页的点击率仅有3.2%,远低于行业平均的5.8%。

团队最初的想法是"优化一下排版"——把按钮调大、把颜色调亮、把间距拉开。但试了3版方案后,数据没有任何变化。我意识到:这不是排版问题,而是空间问题。在2D平面上,所有元素都在争夺用户的注意力,无论怎么排,都是零和博弈。

HarmonyOS 7(API 26)的空间计算能力给了我们一个全新思路:与其在平面内优化,不如跳出平面,在三维空间中重新组织信息


二、改造前的"2D铺大饼"现状分析

2.1 首页布局诊断

改造前的首页是典型的"2D铺大饼"式布局:

在这里插入图片描述

图1:改造前首页——所有元素Z=0,缺乏层次,信息拥挤,用户注意力被无限分散

结构性问题

  • 信息层级缺失:Banner、商品卡片、导航栏都在同一平面,用户只能靠大小和颜色判断重要性
  • 视觉动线混乱:用户的视线在十几个模块之间无规则跳跃,没有清晰的"阅读路径"
  • 交互反馈扁平:点击商品卡片时,没有任何空间反馈,用户感知不到"被选中"
  • 转化路径模糊:购买按钮淹没在信息海洋中,用户需要主动寻找

2.2 详情页布局诊断

详情页的问题更严重:商品图片是2D的,用户无法从多个角度查看;规格选择是列表式的,缺乏空间感知;购买按钮固定在底部,无论用户看到哪里都需要回到底部操作。

核心痛点:用户在详情页的停留时间平均只有12秒,但完成一次购买决策需要的信息(多角度查看、规格对比、价格确认)远超这个时间窗口。


三、改造目标:从"平面陈列"到"立体沉浸"

基于HarmonyOS 7(API 26)的空间计算能力,我们制定了三个改造目标:

目标2D现状3D目标衡量指标
信息层级所有元素Z=0按重要性分配Z轴深度首页点击率提升
视觉动线无规则跳跃有节奏的空间叙事停留时长增加
转化路径购买按钮固定底部购买按钮随场景浮现转化率提升

四、首页空间化改造:Z轴分层与动态光感

4.1 Z轴分层设计

改造后的首页采用了五层空间架构:

在这里插入图片描述

图2:改造后首页——按Z轴深度分层,阴影联动,信息有主次节奏

层级Z值元素设计意图
氛围层Z=10动态渐变背景营造品牌氛围,不抢夺注意力
导航层Z=20~30搜索栏、底部导航提供方向感,始终可见但不突出
内容层Z=40~50商品卡片、信息流承载主要信息,视觉中心
焦点层Z=60~70Banner、促销标签关键信息,吸引注意力
干预层Z=80~90悬浮购买按钮、Toast紧急操作,推到眼前

4.2 ArkUI代码实现

// Homepage.ets —— 空间化首页
@Entry
@Component
struct SpatialHomepage {
  @State bannerZ: number = 70;
  @State cardZ: number = 50;
  @State fabZ: number = 90;

  build() {
    Stack({ alignContent: Alignment.TopStart }) {
      // 氛围层 Z=10
      AmbientLayer()
        .zIndex(10)

      // 导航层 Z=20~30
      NavigationBar()
        .zIndex(30)
        .shadow(this.calculateShadow(30))

      // 内容层 Z=40~50
      Scroll() {
        Column() {
          // Banner 焦点层 Z=70
          BannerCarousel()
            .zIndex(70)
            .shadow(this.calculateShadow(70))
            .onClick(() => {
              animateTo({ duration: 300, curve: Curve.Spring }, () => {
                this.bannerZ = 85;  // 点击后推近
              });
            })

          // 商品卡片 内容层 Z=50
          Grid() {
            ForEach(products, (product: Product) => {
              GridItem() {
                ProductCard({ product: product })
                  .zIndex(50)
                  .shadow(this.calculateShadow(50))
                  .onHover((isHover: boolean) => {
                    animateTo({ duration: 200 }, () => {
                      this.cardZ = isHover ? 65 : 50;  // 悬停时浮起
                    });
                  })
              }
            })
          }
        }
      }
      .zIndex(50)

      // 悬浮购买按钮 干预层 Z=90
      FloatingActionButton()
        .zIndex(90)
        .shadow(this.calculateShadow(90))
        .position({ x: '80%', y: '75%' })
    }
    .width('100%')
    .height('100%')
  }

  private calculateShadow(zDepth: number): ShadowOptions {
    const ratio = zDepth / 100;
    return {
      radius: 4 + ratio * 16,
      offsetX: 0,
      offsetY: 2 + ratio * 10,
      color: `rgba(0, 0, 0, ${0.08 + ratio * 0.22})`,
      type: ShadowType.COLOR
    };
  }
}

4.3 动态光感配置

// 首页光感配置
const HomepageLightConfig: AmbientLightConfig = {
  theme: LightTheme.WARM,
  intensity: 0.85,
  colorTint: '#FDF2E9',
  adaptive: true,
  adaptiveSensitivity: 0.4,
  materialPreset: 'glass',
  dynamicLighting: true,
  transitionDuration: 300
};

设计要点

  • 暖色基调:电商场景需要传递"温暖、亲切、促购买"的情绪
  • 玻璃材质:商品卡片使用玻璃质感,传递现代感和通透感
  • 动态响应:用户滑动时,卡片的光影随Z值变化,产生"呼吸感"

五、详情页空间化改造:3D商品展示

5.1 3D商品展示区

改造后的详情页核心是3D商品展示区:

在这里插入图片描述

图3:详情页3D商品展示——3D模型悬浮展示,购买按钮推到眼前,转化路径清晰

// ProductDetail.ets —— 空间化详情页
@Entry
@Component
struct SpatialProductDetail {
  @State productRotation: number = 0;
  @State is3DView: boolean = true;

  build() {
    Stack({ alignContent: Alignment.TopStart }) {
      // 背景氛围层 Z=10
      AmbientLayer()
        .zIndex(10)

      Scroll() {
        Column() {
          // 3D商品展示区 Z=80
          Stack() {
            if (this.is3DView) {
              ArkGraphics3D({
                model: $rawfile('models/headphone.glb'),
                autoRotate: true,
                rotationSpeed: 0.5,
                onTouch: (event: TouchEvent) => {
                  // 用户触摸旋转3D模型
                  this.productRotation += event.deltaX * 0.5;
                }
              })
              .width('100%')
              .height(300)
              .zIndex(80)
              .shadow(this.calculateShadow(80))
            } else {
              Image($r('app.media.product_image'))
                .width('100%')
                .height(300)
                .zIndex(80)
            }
          }

          // 商品信息 Z=50
          ProductInfo()
            .zIndex(50)
            .shadow(this.calculateShadow(50))

          // 规格选择 Z=40
          SpecSelector()
            .zIndex(40)

          // 用户评价 Z=30
          UserReviews()
            .zIndex(30)
        }
      }
      .zIndex(50)

      // 购买按钮 固定悬浮 Z=90
      BuyButton()
        .zIndex(90)
        .shadow(this.calculateShadow(90))
        .position({ x: '5%', y: '88%' })
        .width('90%')
    }
    .width('100%')
    .height('100%')
  }
}

5.2 3D模型的光影材质

// 3D模型材质配置
const ProductMaterial: PBRMaterial = {
  roughness: 0.3,      // 低粗糙度 = 光滑、精致
  metallic: 0.8,      // 高金属度 = 高端、科技感
  opacity: 1.0,        // 不透明
  baseColor: '#C0C0C0', // 银色基底
  envMap: $rawfile('env/studio.hdr'),  // 环境光贴图
  normalMap: $rawfile('textures/headphone_normal.png')
};

// 动态光照配置
const ProductLighting: LightingConfig = {
  mainLight: {
    direction: { x: 0.5, y: -1, z: 0.5 },
    color: '#FFF5E6',  // 暖白光
    intensity: 1.2
  },
  fillLight: {
    direction: { x: -0.5, y: 0, z: -0.5 },
    color: '#E6F0FF',  // 冷补光
    intensity: 0.4
  },
  ambientLight: {
    color: '#FFFFFF',
    intensity: 0.3
  }
};

5.3 空间交互设计

// 3D模型交互
@State scale: number = 1.0;
@State rotationY: number = 0;

GestureGroup() {
  // 捏合缩放
  PinchGesture()
    .onAction((event: GestureEvent) => {
      this.scale = Math.max(0.5, Math.min(2.0, this.scale * event.scale));
    })

  // 旋转
  RotationGesture()
    .onAction((event: GestureEvent) => {
      this.rotationY += event.angle;
    })

  // 平移
  PanGesture()
    .onAction((event: GestureEvent) => {
      this.offsetX += event.offsetX;
      this.offsetY += event.offsetY;
    })
}

六、性能优化:空间化带来的挑战与解决方案

空间化改造不可避免地带来了性能开销。以下是我们在项目中遇到的挑战和解决方案:

在这里插入图片描述

图4:改造前后性能对比——空间化带来了约10-20%的性能开销,但通过优化控制在可接受范围内

6.1 渲染帧率优化

挑战:3D模型渲染和动态光影计算导致帧率从58fps下降到52fps。

解决方案

// 性能优化配置
const PerformanceConfig = {
  // LOD(细节层次):远距离使用简化模型
  lodDistance: [0, 10, 30],  // 0-10米用高精度,10-30米用中精度,>30米用低精度

  // 阴影质量分级
  shadowQuality: 'medium',  // 可选:low / medium / high

  // 动态批处理
  dynamicBatching: true,

  // GPU实例化
  gpuInstancing: true,

  // 帧率限制
  targetFrameRate: 60
};

6.2 内存占用优化

挑战:3D模型和纹理导致内存占用从120MB增加到145MB。

解决方案

// 纹理压缩
const TextureConfig = {
  format: 'ASTC_6x6',  // 使用ASTC压缩格式
  maxSize: 2048,        // 最大纹理尺寸
  mipmap: true          // 生成mipmap
};

// 模型压缩
const ModelConfig = {
  format: 'glTF-Draco',  // 使用Draco压缩
  compressionLevel: 7,   // 压缩级别
  quantizePosition: true, // 量化顶点位置
  quantizeNormal: true    // 量化法线
};

6.3 启动时间优化

挑战:3D模型加载导致启动时间从800ms增加到950ms。

解决方案

// 异步加载3D模型
@State isModelLoaded: boolean = false;

aboutToAppear() {
  // 先显示2D占位图
  this.isModelLoaded = false;

  // 异步加载3D模型
  setTimeout(() => {
    this.load3DModel().then(() => {
      this.isModelLoaded = true;
    });
  }, 100);
}

// 模型缓存
const ModelCache = new Map<string, Promise<Model>>();

function load3DModel(url: string): Promise<Model> {
  if (!ModelCache.has(url)) {
    ModelCache.set(url, fetchModel(url));
  }
  return ModelCache.get(url)!;
}

七、数据验证与用户反馈

7.1 A/B测试数据

改造后进行了为期2周的A/B测试(实验组30%用户,对照组70%用户):

指标改造前改造后变化
首页点击率3.2%4.8%+50%
详情页停留时长12s18s+50%
购买转化率1.8%2.5%+39%
用户满意度3.6/54.2/5+17%

7.2 用户反馈摘录

  • 正面反馈:“3D看商品很直观,旋转一下就能看到细节”、“页面看起来更有层次感了,不像以前那么乱”
  • 负面反馈:“3D模型加载有点慢”、“老手机有点卡”、“希望增加2D/3D切换”

7.3 迭代方向

基于数据反馈,我们制定了后续迭代计划:

  • 性能优化:针对低端设备降低3D模型精度
  • 功能增强:增加2D/3D切换按钮
  • 场景扩展:将3D展示推广到更多品类(服装、家具)

八、改造实施路线图

在这里插入图片描述

图5:改造实施路线图——从评估到上线的四阶段渐进式迁移

8.1 第一阶段:评估与规划(1周)

  • 梳理现有UI结构,识别空间化改造的关键页面
  • 确定Z轴层级规范(参考五层模型)
  • 制定改造范围和优先级

8.2 第二阶段:首页改造(2周)

  • 实现Z轴分层和阴影联动
  • 配置动态光感组件
  • 进行内部测试和调优

8.3 第三阶段:详情页改造(2周)

  • 集成3D商品展示
  • 实现空间交互(旋转、缩放)
  • 优化性能和加载速度

8.4 第四阶段:全量上线(1周)

  • A/B测试和数据验证
  • 性能优化和Bug修复
  • 灰度发布和全量上线

九、结语:空间化不是终点,而是起点

这个电商App的改造让我深刻体会到:空间化不是给界面"加个3D效果",而是重新思考信息在三维空间中的组织方式

改造前的首页是一个"平面目录",用户需要主动寻找信息;改造后的首页是一个"立体橱窗",信息按重要性分层呈现,用户只需跟随视觉动线。

改造前的详情页是一张"平面海报",用户只能被动接受;改造后的详情页是一个"立体展台",用户可以主动探索,从多个角度了解商品。

数据验证了这种转变的价值:点击率提升50%,停留时长增加50%,转化率提升39%。这些数字背后,是用户体验的本质提升——从"被动浏览"到"主动探索",从"信息过载"到"沉浸体验"。

HarmonyOS 7(API 26)的空间计算能力,为开发者提供了前所未有的工具。但工具本身不等于解决方案,关键在于如何用空间思维重新设计信息架构。希望这个改造手记能为正在探索空间化转型的开发者提供一些参考。


转载自:https://blog.csdn.net/u014727709/article/details/164304580
欢迎 👍点赞✍评论⭐收藏,欢迎指正

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐