首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【中工开发者】鸿蒙商城app

  • 25-02-17 10:40
  • 3055
  • 11980
blog.csdn.net

这学期我学习了鸿蒙,想用鸿蒙做一个鸿蒙商城app,来展示一下。

项目环境搭建:

1.开发环境:DevEco Studio
2.开发语言:ArkTS
3.运行环境:Harmony NEXT base1

软件要求:

DevEco Studio 5.0.0 Release

HarmonyOS SDK​​版本:API version 10

硬件要求:

华为手机或能够顺利运行DevEco Studio上的华为手机模拟器的电脑

1.欢迎界面实现

欢迎界面的实现过程如下:首先,我们创建了一个名为Index的组件,使用Column容器组件构建布局,并在其中添加了空白空间、文本和另一个Column容器。文本内容为“探索”和“购物乐趣”,字体大小为50,颜色为白色,并且加粗。接着,在Column容器中添加了一张图片,图片资源位于resource文件夹下的logo图片素材中。整个欢迎界面的背景采用了渐变色,颜色从#FF8469渐变到#FC4355。为了实现欢迎界面的闪屏变化效果,我们添加了一个透明度变化的动画,使用属性动画实现渐变过渡。在Column组件上添加了opacity属性,并使用state修饰器声明了一个状态变量opacityValue,初始值为0.3。在生命周期函数onPageShow中,我们将opacityValue设置为1,使组件完全显示。动画的duration参数设置为1500ms,iterations参数设置为3次播放。动画完成后,会触发onFinish方法。

  1. @Entry
  2. @Component
  3. struct Index {
  4. build() {
  5. Column(){
  6. Blank()
  7. Column(){
  8. }
  9. .height('100%')
  10. .width('100%').linearGradient({
  11. colors: [
  12. ["#B3CDE3", 0], // 浅蓝色
  13. ["#7F8FA6", 0.5], // 中等蓝色
  14. ["#2C3E50", 1] // 深蓝色
  15. ]})
  16. }
  17. }
  18. }

  1. @Entry
  2. @Component
  3. struct LaunchPage {
  4. build() {
  5. Column() {
  6. Blank()
  7. Column(){
  8. Text('探索')
  9. .fontSize(50)
  10. .fontColor(Color.White)
  11. Text('购物乐趣')
  12. .fontSize(50)
  13. .fontColor(Color.White)
  14. }
  15. }
  16. .height('100%')
  17. .width('100%').linearGradient({
  18. colors: [
  19. ["#B3CDE3", 0], // 浅蓝色
  20. ["#7F8FA6", 0.5], // 中等蓝色
  21. ["#2C3E50", 1] // 深蓝色
  22. ]})
  23. }
  24. }

记得把logo图片放在如下目录里面resource文件夹下面

logo图片素材

  1. import router from '@ohos.router';
  2. @Entry
  3. @Component
  4. struct Index {
  5. @State opacityValue: number = 0.3;
  6. onPageShow(){
  7. this.opacityValue = 1;
  8. }
  9. build() {
  10. Column(){
  11. Blank()
  12. Column(){
  13. Text('探索')
  14. .fontSize(50)
  15. .fontColor(Color.White)
  16. .fontWeight(FontWeight.Bold)
  17. Text('购物乐趣')
  18. .fontSize(50)
  19. .fontColor(Color.White)
  20. .fontWeight(FontWeight.Bold)
  21. }.alignItems(HorizontalAlign.Start).opacity(this.opacityValue)
  22. .animation({
  23. duration: 1500,
  24. iterations:3,
  25. onFinish: () => {
  26. router.pushUrl({
  27. url: '/pages/LaunchPage'
  28. });
  29. }
  30. })
  31. Blank()
  32. Blank()
  33. Image($r('app.media.logo')).width(200)
  34. }.margin({top:30})
  35. .height('100%')
  36. .width('100%').linearGradient({
  37. colors: [
  38. ["#B3CDE3", 0], // 浅蓝色
  39. ["#7F8FA6", 0.5], // 中等蓝色
  40. ["#2C3E50", 1] // 深蓝色
  41. ]})
  42. }
  43. }

效果图如下

到此我们完成了欢迎界面的布局

接下来我们将实现欢迎界面的闪屏变化效果,可以使用属性动画来实现渐变过渡的效果

我们添加一个组件,透明度变化的动画可以使用属性动画来实现渐变过渡的效果,在column组件上添加opacity属性,透明度的变化是一个动态的值,这里我们使用state修饰器声明一个状态变量,状态变量变化会触发UI刷新,默认的透明度设置为0.3,然后在生命周期函数,on page show中设置透明度的值为一让组件完全显示,然后设置animation属性动画的参数duration参数设置动画时长默认值为1000ms,这里我们设置为1500ms,iterations参数设置播放次数默认值播放一次,这里我们设置播放三次,最后添加UNFINISH方法,该方法在动画播放完成时触发

  1. @Entry
  2. @Component
  3. struct Index {
  4. @State opacityValue: number = 0.3;
  5. onPageShow(){
  6. this.opacityValue = 1;
  7. }
  8. build() {
  9. Column(){
  10. Blank()
  11. Column(){
  12. Text('探索')
  13. .fontSize(50)
  14. .fontColor(Color.White)
  15. .fontWeight(FontWeight.Bold)
  16. Text('购物乐趣')
  17. .fontSize(50)
  18. .fontColor(Color.White)
  19. .fontWeight(FontWeight.Bold)
  20. }.alignItems(HorizontalAlign.Start).opacity(this.opacityValue)
  21. .animation({
  22. duration: 1500,
  23. iterations:3,
  24. onFinish: () => {
  25. }
  26. })
  27. Blank()
  28. Blank()
  29. Image($r('app.media.logo')).width(200)
  30. }
  31. .height('100%')
  32. .width('100%').linearGradient({
  33. colors: [['#FF8469',0],[ '#FC4355',1] ]})
  34. }
  35. }

现在我们在预览界面查看欢迎界面的最终效果

2.引导页实现

接下来,我们实现引导页。创建launchPage页面

在index页面导入import router from '@ohos.router';

引导页的布局采用垂直方向,使用Column容器组件,并设置宽度和高度。背景同样使用渐变色。

LaunchPage页面

  1. ​
  2. @Entry
  3. @Component
  4. struct LaunchPage {
  5. build() {
  6. Column() {
  7. }
  8. .height('100%')
  9. .width('100%').linearGradient({
  10. colors: [
  11. ["#B3CDE3", 0], // 浅蓝色
  12. ["#7F8FA6", 0.5], // 中等蓝色
  13. ["#2C3E50", 1] // 深蓝色
  14. ]})
  15. }
  16. }

引导页创建好后,我们使用页面路由跳转到应用内的指定页面。在欢迎界面中导入路由模块,

import router from '@ohos.router';

并在动画效果结束后调用路由的push url方法,配置跳转选项,并传入引导页的URL。

引导页的功能包括通过左右滑动切换页面,使用Tabs组件实现内容视图的切换。每个页签对应一个TabContent组件。

我们创建了一个banner model对象,包含id、title、subtitle和image属性,并指定了引导页的数据源。在Tabs组件中,我们添加了三个TabContent组件,并通过forEach接口基于数组类型数据进行循环渲染。每个TabContent组件中,我们创建了一个Column组件,设置宽度、高度和内边距,并在其中添加了Text和Image组件,显示标题、内容和图片。我们还创建了一个页码指示器,使用Roll组件渲染页码指示器,同样使用forEach执行循环渲染。最后,当切换到最后一个页签时,显示一个“立即体验”的按钮,点击后跳转到商城首页。在Button组件的点击事件中,我们调用路由的push url方法,传入首页的URL,实现跳转。

LaunchPage页面代码如下

  1. import BannerModel from '../models/BannerModel'
  2. import { router } from '@kit.ArkUI'
  3. @Entry
  4. @Component
  5. struct LaunchPage {
  6. currentIndex: number = 0
  7. @State index: number = 0
  8. @State items: BannerModel[] =[
  9. { id:0,
  10. title: '甄选推荐',
  11. subtitle: '精心挑选,为您呈现',
  12. image:'https://img1.wushang.com/pn/wsec-img1/2021/6/9/d8328eef-8552-4d4e-968c-7030836e46f1.jpg?x-oss-process=image/resize,w_800,h_800',
  13. },
  14. { id:1,
  15. title: '手机专区',
  16. subtitle: '手机特惠区,尽享购物惊喜',
  17. image: 'https://img.alicdn.com/i2/1114511827/O1CN018TdXCN1PMoOG25L5Q_!!1114511827.jpg',
  18. },
  19. { id:2,
  20. title: '电脑专区',
  21. subtitle: '电脑特区,装备你的数位生活',
  22. image: 'https://tse3-mm.cn.bing.net/th/id/OIP-C.nDvymf_rVmMgx0RnuRbwOQHaGM?rs=1&pid=ImgDetMain',
  23. }
  24. ]
  25. build() {
  26. Column() {
  27. Tabs(){
  28. ForEach(this.items, (item: BannerModel) => {
  29. TabContent(){
  30. Column() {
  31. Text(item.title)
  32. .fontSize(50)
  33. .fontColor(Color.White)
  34. .fontWeight(FontWeight.Bold)
  35. Text(item.subtitle)
  36. .fontSize(30)
  37. .fontColor(Color.White)
  38. .fontWeight(FontWeight.Bold)
  39. Blank()
  40. Image(item.image)
  41. .width(300)
  42. .height(300)
  43. .objectFit(ImageFit.Contain)
  44. .interpolation(ImageInterpolation.High)
  45. Row({ space: 10}){
  46. ForEach(this.items,(item:BannerModel) => {
  47. Rect({
  48. width: 10,height: 10
  49. }).fill(this.currentIndex === item.id ? Color.White : Color.Gray)
  50. })
  51. }.margin({ top: 30})
  52. if (this.currentIndex == this.items.length-1) {
  53. Button({ type: ButtonType.Capsule }){
  54. Text('立即体验').fontColor(Color.White).fontSize(18)
  55. }
  56. .width(200)
  57. .height(50)
  58. .backgroundColor(Color.Transparent)
  59. .borderWidth(2)
  60. .borderColor(Color.Black)
  61. .borderRadius(6)
  62. .onClick(() => {
  63. router.pushUrl({
  64. url: 'pages/HomePage'
  65. })
  66. })
  67. .margin({ top: 50})
  68. }
  69. }.width('100%').height('100%').padding({ top: 50,left: 50,right: 50})
  70. }
  71. })
  72. }.width('100%').height('100%').onChange((value: number)=>{
  73. this.currentIndex = value
  74. })
  75. }.height('100%')
  76. .width('100%').linearGradient({
  77. colors: [
  78. ["#B3CDE3", 0], // 浅蓝色
  79. ["#7F8FA6", 0.5], // 中等蓝色
  80. ["#2C3E50", 1] // 深蓝色
  81. ]})
  82. }
  83. }

LaunchPage页面预览效果图如下所示

3.首页自定义导航栏选项卡

  1. ​
  2. @Entry
  3. @Component
  4. struct HomePage {
  5. @State currentIndex:number = 0
  6. private tabsController: TabsController = new TabsController()
  7. @Builder
  8. TabBuilder(title:string,image:Resource,selectedImage:Resource,tag:number){
  9. Column(){
  10. Image(this.currentIndex === tag?selectedImage:image)
  11. .size({width: 40, height: 40})
  12. .objectFit(ImageFit.Contain).interpolation(ImageInterpolation.High)
  13. Text(title).fontSize(14)
  14. .fontColor(this.currentIndex === tag?Color.Blue:Color.Black)
  15. }.width('100%').height(50).justifyContent(FlexAlign.Center)
  16. .border({
  17. width: {top: 1},
  18. color: Color.White
  19. })
  20. .onClick(()=>{
  21. this.currentIndex = tag
  22. this.tabsController.changeIndex(this.currentIndex)
  23. })
  24. }
  25. build() {
  26. Column(){
  27. Tabs({barPosition:BarPosition.End,controller:this.tabsController}){
  28. TabContent(){
  29. Text('首页')
  30. }.tabBar(this.TabBuilder('首页',$r('app.media.home'),$r('app.media.home_selected'),0))
  31. TabContent(){
  32. Text('分类')
  33. }.tabBar(this.TabBuilder('分类',$r('app.media.sort'),$r('app.media.sort_selected'),0))
  34. TabContent(){
  35. Text('购物车')
  36. }.tabBar(this.TabBuilder('购物车',$r('app.media.cart'),$r('app.media.cart_selected'),0))
  37. TabContent(){
  38. Text('我的')
  39. }.tabBar(this.TabBuilder('我的',$r('app.media.my'),$r('app.media.my_selected'),0))
  40. }.width('100%').height('100%').barHeight(80).backgroundColor(Color.White)
  41. .onChange((index:number)=>{
  42. this.currentIndex = index
  43. })
  44. }.width('100%').height('100%')
  45. }
  46. }
  47. ​

效果如下图所示

注:本文转载自blog.csdn.net的编程小白gogogo的文章"https://blog.csdn.net/weixin_73566800/article/details/144401421"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

135
HarmonyOS
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top