HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力

这篇具有很好参考价值的文章主要介绍了HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 

一. 样例介绍

本篇Codelab基于自适应布局和响应式布局,实现购物应用在手机、折叠屏、平板不同屏幕尺寸设备上按不同设计显示。通过三层工程结构组织代码,实现一次开发,多端部署 。

手机运行效果如图所示:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

 

折叠屏运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

 

平板运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

相关概念

  • 一次开发,多端部署:一套代码工程,一次开发上架,多端按需部署。支撑开发者快速高效的开发支持多种终端设备形态的应用。
  • 自适应布局:当外部容器大小发生变化时,元素可以根据相对关系自动变化以适应外部容器变化的布局能力。相对关系如占比、固定宽高比、显示优先级等。当前自适应布局能力有7种:拉伸能力、均分能力、占比能力、缩放能力、延伸能力、隐藏能力、折行能力。自适应布局能力可以实现界面显示随外部容器大小连续变化。
  • 响应式布局:当外部容器大小发生变化时,元素可以根据断点、栅格或特定的特征(如屏幕方向、窗口宽高等)自动变化以适应外部容器变化的布局能力。当前响应式布局能力有3种:断点、媒体查询、栅格布局。
  • GridRow:栅格容器组件,仅可以和栅格子组件(GridCol)在栅格布局场景中使用。
  • GridCol:栅格子组件,必须作为栅格容器组件(GridRow)的子组件使用。

完整示例:gitee源码地址

二. 环境搭建

我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。

软件要求

  • DevEco Studio版本:DevEco Studio 3.1 Release及以上版本。
  • HarmonyOS SDK版本:API version 9及以上版本。

硬件要求

  • 设备类型:华为手机或运行在DevEco Studio上的华为手机设备模拟器。
  • HarmonyOS系统:3.1.0 Developer Release及以上版本。

环境搭建

  1. 安装DevEco Studio,详情请参考下载和安装软件
  2. 设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:
  • 如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
  • 如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境
  1. 开发者可以参考以下链接,完成设备调试的相关配置:
  • 使用真机进行调试
  • 使用模拟器进行调试

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

三.代码结构解读

本篇Codelab只对核心代码进行讲解,common为公共能力层,feature为功能模块层,本示例分为六个模块,product则为产品层。对于完整代码,我们会在源码下载或gitee中提供。

├──common/src/main/ets               // 公共能力层
│  ├──bean
│  │  ├──CommodityModel.ets          // 商品数据实体类
│  │  ├──OrderModel.ets              // 订单数据实体类
│  │  └──ProductModel.ets            // 购物车商品数据实体类
│  ├──components
│  │  ├──CommodityList.ets           // 商品列表组件
│  │  ├──CounterProduct.ets          // 数量加减组件
│  │  └──EmptyComponent.ets          // 无数据显示组件
│  ├──constants
│  │  ├──BreakpointConstants.ets     // 断点常量类
│  │  ├──GridConstants.ets           // 栅格常量类
│  │  └──StyleConstants.ets          // 样式常量类
│  ├──utils
│  │  ├──BreakpointSystem.ets        // 断点工具类
│  │  ├──CommonDataSource.ets        // 数据封装类
│  │  ├──LocalDataManager.ets        // 数据操作管理类
│  │  ├──Logger.ets.ets              // 日志工具类
│  │  └──Utils.ets                   // 方法工具类
│  └──viewmodel
│     └──ShopData.ets                // 商品应用数据
├──features                          // 功能模块层
│  ├──commoditydetail/src/main/ets   // 商品详情内容区
│  │  ├──bean
│  │  │  └──TypeModel.ets            // 实体类
│  │  ├──components
│  │  │  ├──CapsuleGroupButton.ets   // 自定义按钮组件
│  │  │  ├──CommodityDetail.ets      // 商品详情组件
│  │  │  └──SpecificationDialog.ets  // 商品规格弹框
│  │  ├──constants
│  │  │  └──CommodityConstants.ets   // 商品详情区常量类
│  │  └──viewmodel
│  │     └──CommodityDetailData.ets  // 商品详情数据类
│  ├──home/src/main/ets              // 首页内容区
│  │  ├──components
│  │  │  └──Home.ets                 // 首页内容组件
│  │  └──viewmodel
│  │     └──HomeData.ets             // 首页数据
│  ├──newproduct/src/main/ets        // 新品内容区
│  │  ├──components
│  │  │  └──NewProduct.ets           // 新品内容组件
│  │  └──viewmodel
│  │     └──NewProductData.ets       // 新品数据
│  ├──orderdetail/src/main/ets       // 订单相关内容区
│  │  ├──components
│  │  │  ├──AddressInfo.ets          // 收件人信息组件
│  │  │  ├──CommodityOrderItem.ets   // 商品订单信息组件
│  │  │  ├──CommodityOrderList.ets   // 商品订单列表组件
│  │  │  ├──ConfirmOrder.ets         // 确认订单组件
│  │  │  ├──HeaderBar.ets            // 标题组件
│  │  │  ├──OrderDetailList.ets      // 订单分类列表组件
│  │  │  ├──OrderListContent.ets     // 订单分类列表内容组件
│  │  │  └──PayOrder.ets             // 支付订单组件
│  │  ├──constants
│  │  │  └──OrderDetailConstants.ets // 订单区常量类
│  │  └──viewmodel
│  │     └──OrderData.ets            // 订单数据
│  ├──personal/src/main/ets          // 我的内容区
│  │  ├──bean
│  │  │  └──IconButtonModel.ets      // 按钮图标实体类
│  │  ├──components
│  │  │  ├──IconButton.ets           // 图片按钮组件
│  │  │  ├──LiveList.ets             // 直播列表组件
│  │  │  └──Personal.ets             // 我的内容组件
│  │  ├──constants
│  │  │  └──PersonalConstants.ets    // 我的常量类
│  │  └──viewmodel
│  │     └──PersonalData.ets         // 我的数据
│  └──shopcart/src/main/ets          // 购物车内容区
│     ├──components
│     │  └──ShopCart.ets             // 购物车内容组件
│     └──constants
│        └──ShopCartConstants.ets    // 购物车常量类
└──products                          // 产品层
   └──phone/src/main/ets             // 支持手机、平板
      ├──constants
      │  └──PageConstants.ets        // 页面常量类
      ├──entryability
      │  └──EntryAbility.ets          // 程序入口类
      ├──pages
      │  ├──CommodityDetailPage.ets  // 订单详情页
      │  ├──ConfirmOrderPage.ets     // 确认订单页
      │  ├──MainPage.ets             // 主页
      │  ├──OrderDetailListPage.ets  // 订单分类列表页
      │  ├──PayOrderPage.ets         // 支付订单页
      │  └──SplashPage.ets           // 启动过渡页
      └──viewmodel
         └──MainPageData.ets         // 主页数据

四. 应用主框架

4.1 启动页

在工程pages目录中,选中Index.ets,点击鼠标右键 > Refactor > Rename,改名为SplashPage.ets。改名后,修改工程entryability目录下EntryAbility.ets文件中windowStage.loadContent方法第一个参数为pages/SplashPage。在该页面的周期函数aboutToAppear里添加一个2秒的定时任务跳转到主页实现。

// EntryAbility.ets
windowStage.loadContent('pages/SplashPage', (err, data) => {
  if (err.code) {
    ...
  }
});

// SplashPage.ets
build() {
  Column() {
    ...
  }
  .height(StyleConstants.FULL_HEIGHT)
  .width(StyleConstants.FULL_WIDTH)
  .backgroundColor($r('app.color.page_background'))
}

aboutToAppear() {
  this.breakpointSystem.register();
  this.timeOutId = setTimeout(() => {
    router.replaceUrl({ url: PageConstants.MAIN_PAGE_URL })
      .catch(err => {
        Logger.error(JSON.stringify(err));
      })
  }, PageConstants.DELAY_TIME);
}

aboutToDisappear() {
  this.breakpointSystem.unregister();
  clearTimeout(this.timeOutId);
}

手机运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

折叠屏运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

平板运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

4.2 主页

本篇Codelab主页由Tabs容器组件和四个TabContent子组件组成,四个TabContent页签的内容视图分别为首页(Home)、新品(NewProduct)、购物车(ShopCart)、我的(Personal)。根据用户使用场景,通过响应式布局的媒体查询,监听应用窗口宽度变化,获取当前应用所处的断点值,设置Tabs的页签位置,lg断点如平板则显示侧边栏,其他断点的则显示底部栏。

/// MainPage.ets
build() {
  Column() {
    Tabs({
      barPosition: this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG ?
        BarPosition.Start : BarPosition.End,
      index: this.currentPageIndex
    }) {       
    ...  
    .barWidth(this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG ?
      $r('app.float.bar_width') : StyleConstants.FULL_WIDTH)
    .barHeight(this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG ?
      StyleConstants.SIXTY_HEIGHT : $r('app.float.vp_fifty_six'))
    .vertical(this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG)
  }
  .backgroundColor($r('app.color.page_background'))
}

主页页面展示:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

五. 页面介绍

5.1 首页标签页

首页标签页通过自适应布局的均分、拉伸等能力实现搜索框、分类等布局,通过响应式布局的媒体查询、断点能力设置轮播图数、商品列表数。

通过响应式布局的媒体查询,监听应用窗口宽度变化,获取当前应用所处的断点值,设置商品列表列数和轮播图数,lg断点显示4列3张轮播图,md断点显示3列2张轮播图,sm断点显示2列1张轮播图。

// Home.ets
@Builder CustomSwiper() {
  Swiper() {
    ForEach(swiperImage, (item: Resource) => {
      Image(item)
        .width(StyleConstants.FULL_WIDTH)
        .aspectRatio(StyleConstants.IMAGE_ASPECT_RATIO)
    }, item => JSON.stringify(item))
  }
  .itemSpace(this.currentBreakpoint === BreakpointConstants.BREAKPOINT_SM ? 0 :
    StyleConstants.ITEM_SPACE)
  .indicator(this.currentBreakpoint === BreakpointConstants.BREAKPOINT_SM)
  .displayCount(this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG ?
    StyleConstants.DISPLAY_THREE :
    (this.currentBreakpoint === BreakpointConstants.BREAKPOINT_MD ? StyleConstants.DISPLAY_TWO :
    StyleConstants.DISPLAY_ONE))
}

// Home.ets
CommodityList({
  commodityList: $commodityList,
  column: this.currentBreakpoint === BreakpointConstants.BREAKPOINT_LG ? StyleConstants.DISPLAY_FOUR :
    (this.currentBreakpoint === BreakpointConstants.BREAKPOINT_MD ?
    StyleConstants.DISPLAY_THREE : StyleConstants.DISPLAY_TWO),
  onClickItem: (data: Commodity) => this.onClickItem(data)
})

// CommodityList.ets
build() {
  if (this.commodityList.length > 0) {
    List({ space: StyleConstants.TWELVE_SPACE }) {
      LazyForEach(new CommonDataSource(this.commodityList), (item: Commodity) => {
        ...
      }, item => JSON.stringify(item))
    }
    ...
    .lanes(this.column)
  } else {
    EmptyComponent({ outerHeight: StyleConstants.FIFTY_HEIGHT })
  }
}

使用自适应布局的均分能力,在Flex布局中设置主轴上的对齐方式为FlexAlign.SpaceAround,使循环渲染的组件之间距离相同,第一个元素到行首的距离和最后一个元素到行尾的距离是相邻元素之间距离的一半。

// Home.ets
@Builder ActivityTitle() {
  Flex({ justifyContent: FlexAlign.SpaceAround }) {
    ForEach(activityTitle, (item: ActivityTitleModel, index: number) => {
      Flex({
        direction: FlexDirection.Column,
        justifyContent: FlexAlign.Center,
        alignItems: ItemAlign.Center
      }) {
        ...
      }
    }, item => JSON.stringify(item))
  }
  ...
}

手机运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

折叠屏运行效果图

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

平板运行效果图

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

5.2 新品标签页

新品标签页由轮播图、分类、新品列表组成,通过响应式布局的媒体查询、断点能力和自适应布局的均分能力,实现不同设备类型显示不同效果,实现逻辑同主页。

通过响应式布局的媒体查询,监听应用窗口宽度变化,获取当前应用所处的断点值设置新品列表,sm断点显示2列,md、lg断点显示3列。

// NewProduct.ets
@Builder ProductList() {
  List({ space: StyleConstants.TWELVE_SPACE }) {
    LazyForEach(new CommonDataSource(productData), (item: ProductDataModel) => {
      ListItem() {
        ...
    }, item => JSON.stringify(item))
  }
  .lanes(this.currentBreakpoint === BreakpointConstants.BREAKPOINT_SM ?
    StyleConstants.DISPLAY_TWO : StyleConstants.DISPLAY_THREE)
  .padding({ left: $r('app.float.vp_twelve'), right: $r('app.float.vp_twelve') })
}

手机运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

折叠屏运行效果图

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

平板运行效果图

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

5.3 购物车标签页

购物车标签页,由购物车列表和商品列表组成,商品列表实现逻辑同主页的商品列表,购物车列表使用自适应布局的均分能力实现。

// ShopCart.ets
@Builder CartItem(item: Product, index: number) {
  Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
    ...
    Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.SpaceAround }) {
      Text($r('app.string.commodity_piece_description', item.name, item.description))
        ...
      Text(`${Object.values(item.specifications).join(',')}`)
        ...
      Flex({ justifyContent: FlexAlign.SpaceBetween }) {
        Text() {
          ...
        }

        CounterProduct({
          count: item.count,
          onNumberChange: (num: number) => {
            this.onChangeCount(num, item);
          }
        })
      }
    }
    ...
  }
}

手机运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

折叠屏运行效果图

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

平板运行效果图

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

5.4 我的标签页

我的标签页主要由个人信息、我的订单、文字图片按钮、直播列表组成,直播列表实现方案同主页商品列表,其他则使用自适应布局的均分能力,Flex布局设置主轴上的对齐方式为FlexAlign.SpaceAround。

// Personal.ets
@Builder Order() {
  Flex({direction: FlexDirection.Column}) {
    Flex({
      justifyContent: FlexAlign.SpaceBetween,
      alignItems: ItemAlign.Center
    }) {
      Text($r('app.string.order_mine'))
        .fontSize($r('app.float.middle_font_size'))
      Row() {
        ...
      }
      ...
      })
    }
  Flex({
    justifyContent: FlexAlign.SpaceAround,
    alignItems: ItemAlign.Center
  }) {
    ForEach(this.orderIconButton, (iconButton: IconButtonModel) => {
      IconButton({
        props: iconButton,
        click: this.onOrderButtonClick.bind(this, iconButton.key)
      })
    }, (iconButton) => JSON.stringify(iconButton))
  }
  .width(StyleConstants.FULL_WIDTH)
}

@Builder IconDock(buttons: IconButtonModel[]) {
  Flex({
    justifyContent: FlexAlign.SpaceAround,
    alignItems: ItemAlign.Center
  }) {
    ForEach(buttons, (iconButton: IconButtonModel) => {
      IconButton({
        props: iconButton
      })
    }, (iconButton) => JSON.stringify(iconButton))
  }
  .height($r('app.float.icon_dock_height'))
  .padding($r('app.float.vp_twelve'))
  .cardStyle()
}

手机运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

折叠屏运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

平板运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

5.5 商品详情页

商品详情页整体由轮播图、商品信息、底部按钮栏组成,通过响应式布局能力的栅格布局,实现不同设备类型显示不同的效果,并通过自适应布局的拉伸能力,设置flexGrow属性使按钮位于底部。

  • 在sm断点下,轮播图占4个栅格,商品信息占4个栅格,底部按钮栏占4个栅格。
  • 在md断点下,轮播图占8个栅格,商品信息占8个栅格,底部按钮栏占8个栅格。
  • 在lg断点下,轮播图占12个栅格,商品信息占8个栅格偏移2个栅格,底部按钮栏占8个栅格偏移2个栅格。
// CommodityDetail.ets
build() {
  Stack({ alignContent: Alignment.TopStart }) {
    Flex({ direction: FlexDirection.Column }) {
      Scroll() {
        GridRow({
          columns: {
            sm: GridConstants.COLUMN_FOUR,
            md: GridConstants.COLUMN_EIGHT,
            lg: GridConstants.COLUMN_TWELVE
          },
          gutter: GridConstants.GUTTER_TWELVE
        }) {
          GridCol({
            span: {
              sm: GridConstants.SPAN_FOUR,
              md: GridConstants.SPAN_EIGHT,
              lg: GridConstants.SPAN_TWELVE }
          }) {
            this.CustomSwiper(this.info.images)
          }
          GridCol({
            span: {
              sm: GridConstants.SPAN_FOUR,
              md: GridConstants.SPAN_EIGHT,
              lg: GridConstants.SPAN_EIGHT
            },
            offset: { lg: GridConstants.OFFSET_TWO }
          }) {
            Column() {
              ...
            }
          }
        }
      }
      .flexGrow(StyleConstants.FLEX_GROW)
      GridRow({
        columns: {
          sm: GridConstants.COLUMN_FOUR,
          md: GridConstants.COLUMN_EIGHT,
          lg: GridConstants.COLUMN_TWELVE
        },
        gutter: GridConstants.GUTTER_TWELVE
      }) {
        GridCol({
          span: {
            sm: GridConstants.SPAN_FOUR,
            md: GridConstants.SPAN_EIGHT,
            lg: GridConstants.SPAN_EIGHT
          },
          offset: { lg: GridConstants.OFFSET_TWO } }) {
          this.BottomMenu()
        }
      }
    }
    ...
  }
}

手机运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

折叠屏运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

平板运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

5.6 订单确认页

订单确认页由上方收件信息、订单信息、底部的总价和提交订单按钮组成,通过响应式布局的栅格布局,实现不同设备类型显示不同的效果,并通过自适应布局的拉伸能力,设置flexGrow属性使总价和提交订单按钮位于底部。

  • 在sm断点下,上方收件信息和订单信息占4个栅格,底部总价占2个栅格,底部提交订单按钮占2个栅格。
  • 在md断点下,上方收件信息和订单信息占8个栅格,底部总价占2个栅格,底部按钮占3个栅格偏移3个栅格。
  • 在lg断点下,上方收件信息和订单信息占8个栅格偏移2个栅格,底部总价占2个栅格偏移2个栅格,底部按钮占3个栅格偏移3个栅格。
// ConfirmOrder.ets
build() {
  Flex({ direction: FlexDirection.Column }) {
    HeaderBar({
      ...
    })
    Column(){
      Scroll() {
        GridRow({
          columns: {
            sm: GridConstants.COLUMN_FOUR,
            md: GridConstants.COLUMN_EIGHT,
            lg: GridConstants.COLUMN_TWELVE
            }
          }) {
          GridCol({
            span: {
              sm: GridConstants.SPAN_FOUR,
              md: GridConstants.SPAN_EIGHT,
              lg: GridConstants.SPAN_EIGHT
            },
            offset: { lg: GridConstants.OFFSET_TWO }
          }) {
            Column() {
              AddressInfo()
              CommodityOrderList()
            }
          }
        }
      }
      .scrollBar(BarState.Off)
    }
    .flexGrow(StyleConstants.FLEX_GROW)
    .padding({ left: $r('app.float.vp_twelve'), right: $r('app.float.vp_twelve') })
    GridRow({
      columns: {
        sm: GridConstants.COLUMN_FOUR,
        md: GridConstants.COLUMN_EIGHT,
        lg: GridConstants.COLUMN_TWELVE
      },
      gutter: GridConstants.GUTTER_TWELVE
    }) {
      GridCol({
        span: {
          sm: GridConstants.SPAN_TWO,
          md: GridConstants.SPAN_TWO,
          lg: GridConstants.SPAN_TWO
        },
        offset: { lg: GridConstants.OFFSET_TWO }
      }) {
        Text($r('app.string.bottom_bar_amount', this.amount))
        ...
      }
      GridCol({
        span: {
          sm: GridConstants.SPAN_TWO,
          md: GridConstants.SPAN_THREE,
          lg: GridConstants.SPAN_THREE
        },
        offset: {
          md: GridConstants.OFFSET_THREE,
          lg: GridConstants.OFFSET_THREE
        }
      }) {
        Button($r('app.string.bottom_bar_button'))
          ...
      }
    }
    ...
  }
  ...
}

手机运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

折叠屏运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

平板运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

5.7 订单支付页

订单支付页整体由上方订单信息和底部的去支付按钮组成,通过使用响应式布局的栅格布局实现不同设备类型显示不同效果,并通过自适应布局的拉伸能力,设置flexGrow属性使去支付按钮位于底部。

  • 在sm断点下,上方订单信息占4个栅格,底部去支付按钮占2个栅格偏移2个栅格。
  • 在md断点下,上方订单信息占8个栅格,底部去支付按钮占2个栅格偏移6个栅格。
  • 在lg断点下,上方订单信息占8个栅格偏移2个栅格,底部去支付按钮占2个栅格偏移8个栅格。
// PayOrder.ets
build() {
  Flex({ direction: FlexDirection.Column }) {
    HeaderBar({
      ...
    })
    Stack({ alignContent: Alignment.TopStart }) {
      ...
      Column() {
        Scroll() {
          GridRow({
            columns: {
              sm: GridConstants.COLUMN_FOUR,
              md: GridConstants.COLUMN_EIGHT,
              lg: GridConstants.COLUMN_TWELVE
            }
          }) {
            GridCol({
              span: {
                sm: GridConstants.SPAN_FOUR,
                md: GridConstants.SPAN_EIGHT,
                lg: GridConstants.SPAN_EIGHT
              },
              offset: { lg: GridConstants.OFFSET_TWO }
            }) {
              Column() {
                this.OrderStatus()
                ...
              }
            }
          }
        }
        .scrollBar(BarState.Off)
      }
      .padding({ left: $r('app.float.vp_twelve'), right: $r('app.float.vp_twelve') })
    }
    .flexGrow(StyleConstants.FLEX_GROW)

    GridRow({
      columns: {
        sm: GridConstants.COLUMN_FOUR,
        md: GridConstants.COLUMN_EIGHT,
        lg: GridConstants.COLUMN_TWELVE
      }
    }) {
      GridCol({
        span: {
          sm: GridConstants.SPAN_TWO,
          md: GridConstants.SPAN_TWO,
          lg: GridConstants.SPAN_TWO
        },
        offset: {
          sm: GridConstants.OFFSET_TWO,
          md: GridConstants.OFFSET_SIX,
          lg: GridConstants.OFFSET_EIGHT
        }
      }) {
        this.BottomBar()
      }
    }
  }
  ...
}

手机运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

折叠屏运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

平板运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

5.8 订单列表页

订单列表页整体布局通过响应式布局的栅格布局,实现不同设备类型显示不同的效果。

  • 在sm断点下,整体UX占4个栅格。
  • 在md断点下,整体UX占8个栅格。
  • 在lg断点下,整体UX占8个栅格偏移2个栅格。
// OrderListContent.ets
build() {
  Column() {
    Scroll() {
      GridRow({
        columns: {
          sm: GridConstants.COLUMN_FOUR,
          md: GridConstants.COLUMN_EIGHT,
          lg: GridConstants.COLUMN_TWELVE
        }
      }) {
        GridCol({
          span: {
            sm: GridConstants.SPAN_FOUR,
            md: GridConstants.SPAN_EIGHT,
            lg: GridConstants.SPAN_EIGHT
          },
          offset: { lg: GridConstants.OFFSET_TWO }
        }) {
          Column() {
            ...
          }
        }
      }
    }
    .scrollBar(BarState.Off)
  }
  ...
}

手机运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

折叠屏运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

平板运行效果图:

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力,华为,HarmonyOS

六.  总结

您已经完成了本次Codelab的学习,并了解到以下知识点:文章来源地址https://www.toymoban.com/news/detail-681212.html

  1. 针对不同屏幕尺寸的设备完成一次开发,多端部署页面设计。
  2. 按照三层工程结构划分模块、组织代码。
  3. 通过自适应布局、响应式布局、栅格布局实现一次开发,多端部署。

到了这里,关于HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【HarmonyOS】掌握布局组件,提升应用体验

           从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是什么?鸿蒙仅仅是一个手机操作系统吗?

    2024年01月20日
    浏览(28)
  • 记一次rax应用用户体验性能优化

    对于前端开发攻城狮们来说,性能优化是一个永恒的话题。随着前端需求复杂度的不断升高,在项目中想始终保持着良好的性能也逐渐成为了一个有挑战的事情。本次分享简述我们在 Rax 项目中常用的一些性能优化方式,并将从近期的一个实际业务需求出发,讲述我在 Rax C端

    2024年02月21日
    浏览(41)
  • HarmonyOS SDK开放能力,服务鸿蒙生态建设,打造优质应用体验

    华为开发者大会2023(HDC.Together)于8月4日至6日在东莞松山湖举行,在HarmonyOS端云开放能力技术分论坛上,华为为广大开发者们介绍了HarmonyOS SDK开放能力在基础开发架构、功能特性等方面的变化之处,通过将常见的通用能力全局化,关键技术底层化,为开发者提供更加低成本

    2024年02月13日
    浏览(54)
  • HarmonyOS鸿蒙开发指南:基于ArkTS开发 轻量级智能穿戴 体验应用、构建布局、绘制样式​​​​​​​和交互事件

    目录 体验应用 构建布局 绘制样式​​​​​​​ 交互事件 HelloWorld工程目录如下图所示: 图1  目录结构 pages/index/index.hml

    2024年02月01日
    浏览(52)
  • HarmonyOS开发案例:【购物APP】

    本篇Codelab使用常用组件、页面路由router实现购物应用,包含以下功能: 使用toolbar、toolbar-item组件实现“首页”,“新品”,“购物车”,“我的”页面切换。 使用list组件,展示购物车里的商品。 使用swiper组件,实现图片自动轮播。 使用panel组件,展示商品规格。 使用自定

    2024年04月29日
    浏览(32)
  • 发现最优秀的人工智能对话体验

    Tomchat:点击传送 支持gpt4 / gpt-3.5 / claude 支持 AI绘画 每天十次免费使用机会 无需魔法 wuguokai 这个网站是设计模式老师推荐的,不强制用户。并且满足毫秒级响应。 https://chat.wuguokai.cn AIDuTu 无需登录,直接使用,挺好的 https://chat.jubianxingqiu.com/

    2024年02月15日
    浏览(39)
  • 发现最优秀的类似chatgpt的人工智能对话体验

    Tomchat:点击传送 支持gpt4 / gpt-3.5 / claude 支持 AI绘画 每天十次免费使用机会 无需魔法 wuguokai 这个网站是设计模式老师推荐的,不强制用户。并且满足毫秒级响应。 https://chat.wuguokai.cn AIDuTu 无需登录,直接使用,挺好的 https://chat.jubianxingqiu.com/

    2024年02月14日
    浏览(44)
  • 如此优秀的低代码平台,佬们一起来体验一把!

    前言:低代码平台是一种新兴的应用开发技术,将可视化建模、自动生成代码和开发者编写的代码结合在一起, 使应用程序的开发变得更加快速、简单且高效 。低代码平台的基本思想是通过消除繁琐的手动编码工作,来让开发者更好地专注于业务逻辑和用户体验。 本篇文章

    2024年02月06日
    浏览(40)
  • 优秀案例 | 数字人+文化浪漫,开启城市数字文化沉浸式体验

    数字人 作为城市宣传的新载体、新介质, 可带来多元化、数字化的 城市文旅发展模式 , 通过打破虚实次元空间, 展现出 传统文化与现代生活 的相碰撞的魅力。 南京首个以文化元宇宙主题体验中心及高校、文博场观、文旅及文化科技企业战略性共建合作平台,以“元启金

    2024年02月10日
    浏览(40)
  • 双十一“静悄悄”?VR购物拉满沉浸式购物体验

    以往每年的双十一,都会因为电商购物狂欢而变得热闹非凡,而各大电商平台也会在这天推出各种促销活动。但是,近几年来,双十一正在变得“静悄悄”。一个原因是消费群体越发理性消费,更加重视商品本身的质量和体验;而另一个则是直播带货,这种购物方式也可以让

    2024年02月03日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包