鸿蒙原生开发手记:04-一个完整元服务案例

田楷
• 阅读 136

影院热映

分享一个完整的元服务案例,这个案例高仿了豆瓣的小程序。

简介

整个元服务分为 4-5 个页面,首页为列表页,展示了当前影院热门的电影,点开是一个详情介绍页,里面有影片详情,演职表,相关影片推荐等,热门海报。打开海报是一个完整的海报展示页,点开可以产看大图。 另外,还有一个关于我们的介绍页。

设计

元服务没有使用底部页签,而是把关于我们放置在了页面底部,以较为委婉的方式进行展示。

代码

  1. 查看 entry/src/main/etc/pages/ 目录,整个应用分为了四个页面。 其路由在 entry/src/main/resources/base/profile/main_pages.json 中配置,路由名与文件名一一对应。 在 main_pages.json 所在地目录中,可以看到一个 form_config.json文件,这个用来配置服务卡片,在此按下不表。

页面中多使用行列布局,各种间距优先使用 Blank() 来指定。

在 Album 页面中,使用了网格布局,点击其中一张图片时,会播放幻灯片,这里使用了 @lyb/media-preview 三方库,以下是核心代码:

Grid() {
    ForEach(this.items, (item: Photo, index: number) => {
      GridItem() {
        Image(item.image.normal.url)
          .width('100%')
          .height(140)
          .objectFit(ImageFit.Cover)
          .clickEffect({ level: ClickEffectLevel.MIDDLE, scale: 1.1 })
          .visibility(index == this.index ? Visibility.Hidden : Visibility.Visible)
          .onClick((event) => {
            this.options
              .setInitIndex(index)
              .setMedias(this.getPreviewResources())
              .setIndicator(false)
            MediaPreview.open(this.getUIContext(), this.options)
          })
      }
    })
  }
  .columnsTemplate('1fr 1fr 1fr')
  .columnsGap(2)
  .rowsGap(2)
  .scrollBar(BarState.Off)

  1. common 目录存放一些全局变量,如 Constants.ets 文件,这里使用静态变量。另外还有请求类的简单封装,同样使用静态类作为单例。

为了让导入代码更简洁,同时也 “高内聚低耦合”,使用了 index 文件来导出这个目录下得类和方法。

Request 中的方法使用了泛型,这样可以根据传人类型自动反序列化,减少了样板代码量。 3. components 组件目录。这里存放各封装的小组件。本案例中包含了演职表、版权声明,海报列表,以及相关推荐共 4 个小组件。

Copyright 是一个简单的小组件,显示在页脚。

@Component
export struct Copyright {
  build() {
    Row() {
      Image($r('app.media.nutpi')).width(32)
      Blank().width(8)
      Text('坚果派出品').fontWeight(FontWeight.Bold).fontColor(Color.Gray)
    }.justifyContent(FlexAlign.Center)
    .width('100%')
    .onClick((event) => {
      router.pushUrl({ url: 'pages/About' })
    })
  }
}```

  1. quickactions/pages/QuickActionCard.ets 为服务卡片的页面,这里描述了卡片的 UI,通过 Formlink 监听和触发点击事件
 FormLink({
      action: this.ACTION_TYPE,
      abilityName: this.ABILITY_NAME,
      params: {
        action: this.MESSAGE
      }
    }) {
      Row() {
        Text('影院热映').fontSize(14)
          .fontColor($r('app.color.card_label'))
        Image($r('app.media.icon'))
          .width(32)
      }
      .justifyContent(FlexAlign.SpaceBetween)
      .height(this.FULL_HEIGHT_PERCENT)
      .width('100%')
      .padding({
        top: 10,
        left: 12,
        right: 12,
        bottom: 10
      })
      .backgroundColor($r('app.color.background_color'))
    }

在上面的代码中,描述了一个行布局,左侧为图标,右侧为应用名称。

5.viewmodels 为视图数据模型。本案例共 5 个模型,分别是 AppInfoCelebrities, Movie, Photos, Relative.

export class AppInfo {
  logo: string = '';
  appName: string = '';
  appLinking: string = '';
  appId: string = '';
  desc: string = '';
  type: string = '';
}

AppInfo 是一个简单的应用信息类,包含 logo,应用名称,applink,描述和应用类型等信息。

应用截图

首页 我的 帮助
鸿蒙原生开发手记:04-一个完整元服务案例 鸿蒙原生开发手记:04-一个完整元服务案例 鸿蒙原生开发手记:04-一个完整元服务案例
鸿蒙原生开发手记:04-一个完整元服务案例 鸿蒙原生开发手记:04-一个完整元服务案例

注意事项

  1. 打开元服务豁免管控:系统-开发者选项-开发中元服务豁免管控

其他

关于应用创建、服务卡片、打包签名、上架审核等,可以查看往期文章,或下方的参考资料。

完整代码

完整的代码见代码仓库 https://gitee.com/zacks/arkts-ohos-demo

参考资料

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
Vue CLI 3搭建vue+vuex 最全分析
一、介绍VueCLI是一个基于Vue.js进行快速开发的完整系统。有三个组件:CLI:@vue/cli 全局安装的npm包,提供了终端里的vue命令(如:vuecreate、vueserve、vueui等命令)CLI服务:@vue/cliservice是一个开发环境依赖。构建于 we
编程范儿 编程范儿
3年前
Vue刷新页面有哪几种方式
在Vue项目中,刷新当前页除了window.reload(),你还能想到什么办法?而且这种办法会重新加载资源出现短暂的空白页面。体验不是很好。在某个详情页面的时候,我们经常需要通过路由中的详情id去获取内容,当我们在不同的详情页来回切换的时候,打开的页面是同一个,只是需要通过监听路由中的参数id的变化去重新请求详情接口。如果这个详情页只需要一个接口
Wesley13 Wesley13
3年前
UCKeFu 3.0.0 发布,增加呼叫中心平台功能
  UCKeFuv3.0.0发布,UCKeFu基于JAVA语言开发,是一个全渠道融合的客户支持服务平台,聚合企业内部多个客服渠道,帮助各种行业各种规模的企业建立完整客服体系。  通过将邮件、短信、电话语音、WebIM在线客服、微信、微博、H5页面、APP接口等多个渠道来源的客户服务请求与对话汇聚在一个管理平台,用统一的方式来响应和支
Stella981 Stella981
3年前
React Native 开发豆瓣评分(七)首页组件开发
首页内容拆分看效果图,首页由热门影院、豆瓣热门、热门影视等列表组成,每个列表又由头加横向滑动的电影海报列表构成。所以可以先把页面的电影海报、评分、列表头做成组件,然后在使用ScrollView将内容包裹即可构成首页。<divaligncenter<imgsrc"https://img2018.cnblogs.co
Wesley13 Wesley13
3年前
Java架构师,大数据架构师,高并发设计模式,机器学习课程大全百度云分享
以下所有课程现在只需100元,需要的联系Q(2929608935)第一章:java精品课程目录大全1、亿级流量电商详情页系统的大型高并发与高可用缓存架构实战       1课程介绍以及高并发高可用复杂系统中的缓存架构有哪些东西?32分钟      2基于大型电商网站中的商品详情页系统
田楷 田楷
1个月前
鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
导读本文带来非常详细的元服务开发及上架全流程介绍,包含元服务介绍、创建、服务卡片、签名、开发测试、签名打包、上架审核等,一应俱全。元服务简介元服务是一种新的服务提供方式开发简单、免安装、易于获取和使用相较于小程序,系统原生,丝滑流畅轻量应用程序形态,具备秒
使用taro+canvas实现微信小程序的图片分享功能 | 京东云技术团队
业务场景二轮充电业务中,用户充电完成后在订单详情页展示订单相关信息,用户点击分享按钮唤起微信小程序分享菜单,将生成的图片海报分享给微信好友或者下载到本地,好友可通过扫描海报中的二维码加群领取优惠。使用场景及功能:微信小程序生成海报图片分享好友下载图片使用技
618技术揭秘:探究竞速榜页面核心前端技术 | 京东云技术团队
本文将探究京东竞速榜H5页面的核心前端技术,包括动画、样式配置化、皮肤切换、海报技术、调试技巧等方面,希望能够为广大前端开发者提供一些有用的参考和思路。
京东云开发者 京东云开发者
11个月前
使用 Taro 开发鸿蒙原生应用 —— 快速上手,鸿蒙应用开发指南
随着鸿蒙系统的不断完善,许多应用厂商都希望将自己的应用移植到鸿蒙平台上。最近,Taro发布了v4.0.0beta.x版本,支持使用Taro快速开发鸿蒙原生应用,也可将现有的小程序转换为鸿蒙原生应用。在《使用Taro开发鸿蒙原生应用》系列文章中,我们已经介绍
田楷 田楷
1个月前
鸿蒙原生开发手记:01-元服务开发
简介元服务是鸿蒙中的一种轻量应用形态,无需下载,直接运行。类似于微信小程序,但与小程序不同的是,元服务更加轻量。元服务使用原生开发,是系统级提供的,无论从易用性、性能、体验上,都要比小程序好。创建元服务使用DevEco,点击Create,左侧模板选择Ato