概述

本指南将介绍如何使用HarmonyOS 5的CodeGenie工具快速开发一个模拟装修的应用程序。该应用将允许用户选择房间类型、添加家具、调整布局并可视化装修效果。

开发步骤

1. 项目创建与初始化

  1. 在DevEco Studio中创建新项目
  2. 选择"Application" -> "Empty Ability"
  3. 确保勾选"Enable CodeGenie"选项
  4. 项目命名为"HomeDecorSimulator"

2. 主界面设计

// resources/base/profile/main_page.xml
{
  "data": {
    "selectedRoom": "livingRoom",
    "furnitureItems": [],
    "showRoomTypes": false
  },
  "ui": {
    "type": "page",
    "children": [
      {
        "type": "column",
        "padding": 20,
        "children": [
          {
            "type": "row",
            "justifyContent": "space-between",
            "children": [
              {
                "type": "text",
                "text": "模拟装修",
                "fontSize": 24,
                "fontWeight": "bold"
              },
              {
                "type": "button",
                "text": "选择房间",
                "onclick": "toggleRoomTypes"
              }
            ]
          },
          {
            "type": "stack",
            "if": "showRoomTypes",
            "children": [
              {
                "type": "column",
                "padding": 10,
                "background": "#FFFFFF",
                "border": { "radius": 8 },
                "children": [
                  {
                    "type": "button",
                    "text": "客厅",
                    "margin": { "bottom": 5 },
                    "onclick": "selectRoomType('livingRoom')"
                  },
                  {
                    "type": "button",
                    "text": "卧室",
                    "margin": { "bottom": 5 },
                    "onclick": "selectRoomType('bedroom')"
                  },
                  {
                    "type": "button",
                    "text": "厨房",
                    "onclick": "selectRoomType('kitchen')"
                  }
                ]
              }
            ]
          },
          {
            "type": "image",
            "src": "$selectedRoom + '_base.png'",
            "height": 300,
            "margin": { "top": 20 }
          },
          {
            "type": "text",
            "text": "家具列表",
            "fontSize": 18,
            "margin": { "top": 20, "bottom": 10 }
          },
          {
            "type": "scroll",
            "orientation": "horizontal",
            "height": 120,
            "children": [
              {
                "type": "row",
                "children": [
                  {
                    "type": "image",
                    "for": "item in furnitureItems",
                    "src": "$item.icon",
                    "width": 100,
                    "height": 100,
                    "margin": { "right": 10 },
                    "onclick": "addFurniture($item)"
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
}

3. 添加业务逻辑

// resources/base/profile/main_page.js
export default {
  data: {
    selectedRoom: 'livingRoom',
    furnitureItems: [
      { id: 1, name: '沙发', icon: 'common/icons/sofa.png', type: 'livingRoom' },
      { id: 2, name: '电视', icon: 'common/icons/tv.png', type: 'livingRoom' },
      { id: 3, name: '床', icon: 'common/icons/bed.png', type: 'bedroom' },
      { id: 4, name: '衣柜', icon: 'common/icons/wardrobe.png', type: 'bedroom' },
      { id: 5, name: '炉灶', icon: 'common/icons/stove.png', type: 'kitchen' },
      { id: 6, name: '冰箱', icon: 'common/icons/fridge.png', type: 'kitchen' }
    ],
    showRoomTypes: false,
    placedFurniture: []
  },
  
  onInit() {
    this.updateFurnitureList();
  },
  
  toggleRoomTypes() {
    this.showRoomTypes = !this.showRoomTypes;
  },
  
  selectRoomType(roomType) {
    this.selectedRoom = roomType;
    this.showRoomTypes = false;
    this.updateFurnitureList();
  },
  
  updateFurnitureList() {
    // 在实际应用中,这里可以根据selectedRoom从服务器获取对应的家具列表
    // 这里我们只是简单过滤示例数据
    this.furnitureItems = this.furnitureItems.filter(
      item => item.type === this.selectedRoom
    );
  },
  
  addFurniture(item) {
    // 在实际应用中,这里会添加家具到画布上
    this.placedFurniture.push({
      ...item,
      x: Math.random() * 200,
      y: Math.random() * 200
    });
    this.$page.showToast(`已添加 ${item.name}`);
  },
  
  // 添加更多方法...
}

4. 添加装修画布功能

// 在main_page.xml中添加画布区域
{
  "type": "stack",
  "width": "100%",
  "height": 300,
  "margin": { "top": 20 },
  "children": [
    {
      "type": "image",
      "src": "$selectedRoom + '_base.png'",
      "width": "100%",
      "height": "100%"
    },
    {
      "type": "div",
      "for": "furniture in placedFurniture",
      "children": [
        {
          "type": "image",
          "src": "$furniture.icon",
          "width": 80,
          "height": 80,
          "position": "absolute",
          "left": "$furniture.x",
          "top": "$furniture.y",
          "onclick": "selectFurniture($furniture)"
        }
      ]
    }
  ]
}

5. 添加家具操作功能

// 在main_page.js中添加
export default {
  // ...之前的数据和方法
  
  data: {
    // ...之前的数据
    selectedFurniture: null
  },
  
  selectFurniture(furniture) {
    this.selectedFurniture = furniture;
    this.showFurnitureOptions = true;
  },
  
  moveFurniture(dx, dy) {
    if (this.selectedFurniture) {
      this.selectedFurniture.x += dx;
      this.selectedFurniture.y += dy;
    }
  },
  
  rotateFurniture() {
    if (this.selectedFurniture) {
      this.selectedFurniture.rotation = (this.selectedFurniture.rotation || 0) + 90;
    }
  },
  
  deleteFurniture() {
    if (this.selectedFurniture) {
      const index = this.placedFurniture.indexOf(this.selectedFurniture);
      if (index !== -1) {
        this.placedFurniture.splice(index, 1);
        this.selectedFurniture = null;
        this.showFurnitureOptions = false;
      }
    }
  }
}

6. 添加材质选择功能

// 在main_page.xml中添加
{
  "type": "scroll",
  "orientation": "horizontal",
  "height": 80,
  "margin": { "top": 20 },
  "children": [
    {
      "type": "row",
      "children": [
        {
          "type": "image",
          "for": "texture in wallTextures",
          "src": "$texture.thumbnail",
          "width": 60,
          "height": 60,
          "margin": { "right": 10 },
          "onclick": "applyWallTexture($texture)"
        }
      ]
    }
  ]
}

7. 完整业务逻辑

// resources/base/profile/main_page.js
export default {
  data: {
    selectedRoom: 'livingRoom',
    furnitureItems: [],
    showRoomTypes: false,
    placedFurniture: [],
    selectedFurniture: null,
    showFurnitureOptions: false,
    wallTextures: [
      { id: 1, name: '白色涂料', thumbnail: 'common/textures/wall_white.png', image: 'common/textures/wall_white_large.png' },
      { id: 2, name: '木质墙板', thumbnail: 'common/textures/wall_wood.png', image: 'common/textures/wall_wood_large.png' },
      { id: 3, name: '砖墙', thumbnail: 'common/textures/wall_brick.png', image: 'common/textures/wall_brick_large.png' }
    ],
    floorTextures: [
      // 类似wallTextures
    ],
    currentWallTexture: null,
    currentFloorTexture: null
  },
  
  onInit() {
    this.loadInitialData();
  },
  
  loadInitialData() {
    // 模拟从服务器加载数据
    this.furnitureItems = [
      { id: 1, name: '沙发', icon: 'common/icons/sofa.png', type: 'livingRoom' },
      // 更多家具...
    ];
    this.currentWallTexture = this.wallTextures[0];
    this.updateFurnitureList();
  },
  
  // ...之前的方法
  
  applyWallTexture(texture) {
    this.currentWallTexture = texture;
    this.$page.showToast(`已应用 ${texture.name} 墙面`);
  },
  
  applyFloorTexture(texture) {
    this.currentFloorTexture = texture;
    this.$page.showToast(`已应用 ${texture.name} 地板`);
  },
  
  saveDesign() {
    const design = {
      roomType: this.selectedRoom,
      furniture: this.placedFurniture,
      wallTexture: this.currentWallTexture,
      floorTexture: this.currentFloorTexture
    };
    
    // 在实际应用中,这里可以保存到本地或上传到服务器
    this.$page.showToast('设计已保存');
  },
  
  shareDesign() {
    // 实现分享功能
    this.$page.showToast('分享功能即将推出');
  }
}

高级功能扩展

1. 3D预览功能

// 在main_page.xml中添加3D预览按钮和区域
{
  "type": "button",
  "text": "3D预览",
  "margin": { "top": 20 },
  "onclick": "show3DPreview"
}

2. AR实景预览

// 调用HarmonyOS的AR引擎
showARPreview() {
  const arConfig = {
    designData: {
      roomType: this.selectedRoom,
      furniture: this.placedFurniture
    }
  };
  
  // 调用AR能力
  this.$app.callAREngine(arConfig);
}

3. 成本估算

calculateCost() {
  let totalCost = 0;
  
  // 墙面和地板成本
  if (this.currentWallTexture) {
    totalCost += this.currentWallTexture.pricePerSquareMeter * this.getWallArea();
  }
  
  if (this.currentFloorTexture) {
    totalCost += this.currentFloorTexture.pricePerSquareMeter * this.getFloorArea();
  }
  
  // 家具成本
  this.placedFurniture.forEach(item => {
    totalCost += item.price || 0;
  });
  
  this.$page.showToast(`预估总成本: ${totalCost.toFixed(2)}元`);
}

注意事项

  1. ​资源准备​​:确保所有图片资源(房间背景、家具图标、材质贴图)都已添加到项目中
  2. ​性能优化​​:当放置大量家具时,考虑使用虚拟滚动或分页加载
  3. ​数据持久化​​:使用HarmonyOS的DataAbility或Preferences保存用户设计
  4. ​设备适配​​:考虑不同屏幕尺寸的适配问题
  5. ​权限申请​​:如果使用AR功能,需要申请相机权限

通过以上步骤,你可以在HarmonyOS 5中利用CodeGenie快速开发出一个功能完善的模拟装修App。实际开发中可以根据需求进一步扩展功能,如更多房间类型、家具库、颜色选择器等。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐