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

news2024/12/17 23:29:07

这学期我学习了鸿蒙,想用鸿蒙做一个鸿蒙商城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方法。

@Entry
@Component
struct Index {
  build() {
    Column(){
      Blank()
      Column(){

      }
      .height('100%')
      .width('100%').linearGradient({
        colors: [
          ["#B3CDE3", 0],  // 浅蓝色
          ["#7F8FA6", 0.5], // 中等蓝色
          ["#2C3E50", 1]   // 深蓝色
        ]})
    }
  }
}


@Entry
@Component
struct LaunchPage {

  build() {
    Column() {
      Blank()
      Column(){
        Text('探索')
          .fontSize(50)
          .fontColor(Color.White)
        Text('购物乐趣')
          .fontSize(50)
          .fontColor(Color.White)
      }
    }
    .height('100%')
    .width('100%').linearGradient({
      colors: [
        ["#B3CDE3", 0],  // 浅蓝色
        ["#7F8FA6", 0.5], // 中等蓝色
        ["#2C3E50", 1]   // 深蓝色
      ]})
  }
}

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

logo图片素材

import router from '@ohos.router';
@Entry
@Component
struct Index {
  @State opacityValue: number = 0.3;
  onPageShow(){
    this.opacityValue = 1;
  }
  build() {
    Column(){
      Blank()
      Column(){
        Text('探索')
        .fontSize(50)
        .fontColor(Color.White)
          .fontWeight(FontWeight.Bold)
        Text('购物乐趣')
        .fontSize(50)
        .fontColor(Color.White)
          .fontWeight(FontWeight.Bold)
      }.alignItems(HorizontalAlign.Start).opacity(this.opacityValue)
      .animation({
        duration: 1500,
        iterations:3,
        onFinish: () => {
          router.pushUrl({
            url: '/pages/LaunchPage'
          });
        }
      })
      Blank()
      Blank()
        Image($r('app.media.logo')).width(200)
      }.margin({top:30})
      .height('100%')
      .width('100%').linearGradient({
        colors: [
          ["#B3CDE3", 0],  // 浅蓝色
          ["#7F8FA6", 0.5], // 中等蓝色
          ["#2C3E50", 1]   // 深蓝色
        ]})
    }
  }

效果图如下

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

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

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

@Entry
@Component
struct Index {
  @State opacityValue: number = 0.3;
  onPageShow(){
    this.opacityValue = 1;
  }
  build() {
    Column(){
      Blank()
      Column(){
        Text('探索')
        .fontSize(50)
        .fontColor(Color.White)
          .fontWeight(FontWeight.Bold)
        Text('购物乐趣')
        .fontSize(50)
        .fontColor(Color.White)
          .fontWeight(FontWeight.Bold)
      }.alignItems(HorizontalAlign.Start).opacity(this.opacityValue)
      .animation({
        duration: 1500,
        iterations:3,
        onFinish: () => {
        }
      })
      Blank()
      Blank()
        Image($r('app.media.logo')).width(200)
      }

      .height('100%')
      .width('100%').linearGradient({
        colors: [['#FF8469',0],[ '#FC4355',1] ]})
    }
  }

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

2.引导页实现

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

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

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

LaunchPage页面

​
@Entry
@Component
struct LaunchPage {

  build() {
    Column() {

    }
    .height('100%')
    .width('100%').linearGradient({
      colors: [
        ["#B3CDE3", 0],  // 浅蓝色
        ["#7F8FA6", 0.5], // 中等蓝色
        ["#2C3E50", 1]   // 深蓝色
      ]})
  }
}

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

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页面代码如下

import BannerModel from '../models/BannerModel'
import { router } from '@kit.ArkUI'

@Entry
@Component
struct LaunchPage {
  currentIndex: number = 0
  @State index: number = 0
  @State items: BannerModel[] =[
    { id:0,
      title: '甄选推荐',
      subtitle: '精心挑选,为您呈现',
      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',

    },
    { id:1,
      title: '手机专区',
      subtitle: '手机特惠区,尽享购物惊喜',
      image: 'https://img.alicdn.com/i2/1114511827/O1CN018TdXCN1PMoOG25L5Q_!!1114511827.jpg',

    },
    { id:2,
      title: '电脑专区',
      subtitle: '电脑特区,装备你的数位生活',
      image: 'https://tse3-mm.cn.bing.net/th/id/OIP-C.nDvymf_rVmMgx0RnuRbwOQHaGM?rs=1&pid=ImgDetMain',

    }

  ]
  build() {
    Column() {
      Tabs(){
        ForEach(this.items, (item: BannerModel) => {
          TabContent(){
            Column() {
              Text(item.title)
                .fontSize(50)
                .fontColor(Color.White)
                .fontWeight(FontWeight.Bold)
              Text(item.subtitle)
                .fontSize(30)
                .fontColor(Color.White)
                .fontWeight(FontWeight.Bold)
              Blank()
              Image(item.image)
                .width(300)
                .height(300)
                .objectFit(ImageFit.Contain)
                .interpolation(ImageInterpolation.High)
              Row({ space: 10}){
                ForEach(this.items,(item:BannerModel) => {
                  Rect({
                    width: 10,height: 10
                  }).fill(this.currentIndex === item.id ? Color.White : Color.Gray)

                })
              }.margin({ top: 30})

              if (this.currentIndex == this.items.length-1) {
                Button({ type: ButtonType.Capsule }){
                  Text('立即体验').fontColor(Color.White).fontSize(18)
                }
                  .width(200)
                  .height(50)
                  .backgroundColor(Color.Transparent)
                .borderWidth(2)
                .borderColor(Color.Black)
                .borderRadius(6)
                  .onClick(() => {
                    router.pushUrl({
                      url: 'pages/HomePage'
                    })
                  })
                  .margin({ top: 50})
              }
            }.width('100%').height('100%').padding({ top: 50,left: 50,right: 50})
          }
        })

      }.width('100%').height('100%').onChange((value: number)=>{
        this.currentIndex = value
      })

    }.height('100%')
    .width('100%').linearGradient({
      colors: [
        ["#B3CDE3", 0],  // 浅蓝色
        ["#7F8FA6", 0.5], // 中等蓝色
        ["#2C3E50", 1]   // 深蓝色
      ]})
  }
}

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

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

​

@Entry
@Component
struct HomePage {
  @State currentIndex:number = 0
  private tabsController: TabsController = new TabsController()
  @Builder
  TabBuilder(title:string,image:Resource,selectedImage:Resource,tag:number){
Column(){
  Image(this.currentIndex === tag?selectedImage:image)
    .size({width: 40, height: 40})
    .objectFit(ImageFit.Contain).interpolation(ImageInterpolation.High)
  Text(title).fontSize(14)
    .fontColor(this.currentIndex === tag?Color.Blue:Color.Black)
}.width('100%').height(50).justifyContent(FlexAlign.Center)
    .border({
      width: {top: 1},
      color: Color.White
    })
    .onClick(()=>{
      this.currentIndex = tag
      this.tabsController.changeIndex(this.currentIndex)
    })
  }
  build() {
    Column(){
      Tabs({barPosition:BarPosition.End,controller:this.tabsController}){
        TabContent(){
          Text('首页')
        }.tabBar(this.TabBuilder('首页',$r('app.media.home'),$r('app.media.home_selected'),0))
        TabContent(){
          Text('分类')
        }.tabBar(this.TabBuilder('分类',$r('app.media.sort'),$r('app.media.sort_selected'),0))
        TabContent(){
          Text('购物车')
        }.tabBar(this.TabBuilder('购物车',$r('app.media.cart'),$r('app.media.cart_selected'),0))
        TabContent(){
          Text('我的')
        }.tabBar(this.TabBuilder('我的',$r('app.media.my'),$r('app.media.my_selected'),0))
        }.width('100%').height('100%').barHeight(80).backgroundColor(Color.White)
      .onChange((index:number)=>{
        this.currentIndex = index
      })
      }.width('100%').height('100%')
    }
  }


​

效果如下图所示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2261299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Qt】按钮类控件:QPushButton、QRadioButton、QCheckBox、ToolButton

目录 QPushButton 例子: QRadioButton 例子: 按钮的常见信号函数 单选按钮分组 例子: QCheckButton 例子: QToolButton QWidget的常见属性及其功能对于它的派生类控件都是有效的(也就是Qt中的各种控件),包括…

UI框架DevExpress XAF v24.2新功能预览 - .NET Core / .NET增强

DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 在上文中…

ArrayList源码分析、扩容机制面试题,数组和List的相互转换,ArrayList与LinkedList的区别

目录 1.java集合框架体系 2. 前置知识-数组 2.1 数组 2.1.1 定义: 2.1.2 数组如何获取其他元素的地址值?(寻址公式) 2.1.3 为什么数组索引从0开始呢?从1开始不行吗? 3. ArrayList 3.1 ArrayList和和…

阿里云服务器手动部署LNMP环境【官方文档注意事项】

这是官方文档 注意&#xff1a; 要添加安全组&#xff0c;端口为80。否则最后用浏览器访问公网IP没有结果。 Mysql密码策略要求密码至少包含一个大写字母、一个小写字母、一个数字和一个特殊字符&#xff0c;并且密码总长度至少为 8 个字符。sudo mysqladmin -uroot -p<ol…

Invalid default value for ‘gender‘,mysql在idea中字符集设置,default

默认值default创建错误的&#xff0c;设置数据库字符集 我的错误&#xff1a;Invalid default value for ‘gender’ -- 修改数据库字符集 alter database db01 charset utf8;

240004基于Jamva+ssm+maven+mysql的房屋租赁系统的设计与实现

基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化&#xff0c;包括新增了注册功能&#xff0c;房屋模糊查询功能&#xff0c;管理员和用户信息管理等功能&#xff0c;以及对网站界面进行了优…

使用Navicat从SQL Server导入表数据到MySQL

在表上右键选择导入向导 选择ODBC 1.内输入ip即可&#xff0c;不需要端口号 一定要勾选允许保存密码 选择需要的表&#xff0c;下一步 根据需求&#xff0c;可修改表名、是否新建表 根据需求修改不同表的字段类型和长度 按需选择导入方式

STM32F407+LAN8720A +LWIP +FreeRTOS ping通

使用STM32CUBEIDE自带的 LWIP和FreeROTS 版本说明STM32CUBEIDE 操作如下1. 配置RCC/SYS2. 配置ETH/USART3. 配置EHT_RESET/LED4. 配置FreeRTOS5. 配置LWIP6. 配置时钟7. 生成单独的源文件和头文件,并生成代码8. printf重定义9. ethernetif.c添加lan8720a复位10. MY_LWIP_Init …

用 Python Turtle 绘制经典汤姆猫:重温卡通角色的经典魅力

用 Python Turtle 绘制经典汤姆猫&#xff1a;重温卡通角色的经典魅力 &#x1f438; 前言 &#x1f438;&#x1f41e;往期绘画>>点击进所有绘画&#x1f41e;&#x1f40b; 效果图 &#x1f40b;&#x1f409; 代码 &#x1f409; &#x1f438; 前言 &#x1f438; 汤…

RabbitMQ个人理解与基本使用

目录 一. 作用&#xff1a; 二. RabbitMQ的5中队列模式&#xff1a; 1. 简单模式 2. Work模式 3. 发布/订阅模式 4. 路由模式 5. 主题模式 三. 消息持久化&#xff1a; 消息过期时间 ACK应答 四. 同步接收和异步接收&#xff1a; 应用场景 五. 基本使用 &#xff…

Y3编辑器文档4:触发器1(界面及使用简介、变量作用域、入门案例)

文章目录 一、触发器简介1.1 触发器界面1.2 ECA语句编辑及快捷键1.3 参数设置1.4 变量设置1.5 实体触发器1.6 触发器复用 二、触发器的多层结构2.1 子触发器&#xff08;在游戏内对新的事件进行注册&#xff09;2.2 触发器变量作用域 三、入门案例3.1 使用触发器实现瞬间移动3.…

【DBeaver】连接带kerberos的hive[Apache|HDP]

目录 一、安装配置Kerberos客户端环境 1.1 安装Kerberos客户端 1.2 环境配置 二、基于Cloudera驱动创建连接 三、基于Hive原生驱动创建连接 一、安装配置Kerberos客户端环境 1.1 安装Kerberos客户端 在Kerberos官网下载,地址如下&#xff1a;https://web.mit.edu/kerberos…

bug:uniapp运行到微信开发者工具 白屏 页面空白

1、没有报错信息 2、预览和真机调试都能正常显示&#xff0c;说明代码没错 3、微信开发者工具版本已经是win7能装的最高版本了&#xff0c;1.05版 链接 不打算回滚旧版本 4、解决&#xff1a;最后改调试基础库为2.25.4解决了&#xff0c;使用更高版本的都会报错&#xff0c;所…

【前端】JavaScript自定义 forEach方法详解与原理分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;题目演示与效果演示代码控制台输出结果 &#x1f4af;代码分析与源理解释1. 构造函数 Brray2. 实例化 Brray3. 调用自定义的 forEach &#x1f4af;比较与拓展1. 比较原…

基于卷积神经网络的Caser算法

将一段交互序列嵌入到一个以时间为纵轴的平面空间中形成“一张图”后&#xff0c;基于卷积序列嵌入的推荐&#xff08;Caser&#xff09;算法利用多个不同大小的卷积滤波器&#xff0c;来捕捉序列中物品间的点级&#xff08;point-level&#xff09;、联合的&#xff08;union-…

挑战一个月基本掌握C++(第三天)了解注释、数据类型、变量

一 C注释 程序的注释是解释性语句&#xff0c;您可以在 C 代码中包含注释&#xff0c;这将提高源代码的可读性。所有的编程语言都允许某种形式的注释。 C 支持单行注释和多行注释。注释中的所有字符会被 C 编译器忽略。 C 注释一般有两种&#xff1a; // - 一般用于单行注释…

211-基于FMC的1路1.5G ADC 1路 2.5G DAC子卡

一、板卡概述 FMC-1AD-1DA-1SYNC是我司自主研发的一款1路1G AD采集、1路2.5G DA回放的FMC、1路AD同步信号子卡。板卡采用标准FMC子卡架构&#xff0c;可方便地与其他FMC板卡实现高速互联&#xff0c;可广泛用于高频模拟信号采集等领域。 二、功能介绍 2.1 原理框图 2.2 硬件…

Cloudlog 电台日志系统 request_form SQL注入漏洞复现

0x01 产品简介 Cloudlog 是一个自托管的 PHP 应用程序,可让您在任何地方记录您的业余无线电联系人。使用PHP和MySQL构建的基于Web的业余无线电记录应用程序支持从HF到微波的一般站记录任务。 0x02 漏洞概述 Cloudlog request_form 接口存在未授权SQL注入漏洞,未经身份验证…

Jenkins容器使用宿主机Docker(五)

DevOps之安装和配置 Jenkins (一) DevOps 之 CI/CD入门操作 (二) Sonar Qube介绍和安装&#xff08;三&#xff09; Harbor镜像仓库介绍&安装 &#xff08;四&#xff09; Jenkins容器使用宿主机Docker&#xff08;五&#xff09; Jenkins流水线初体验&#xff08;六&#…

【大模型】LLaMA-2:Open Foundation and Fine-Tuned Chat Models, July. 2023.

论文&#xff1a;LLaMA-2&#xff1a;Open Foundation and Fine-Tuned Chat Models, July. 2023. 链接&#xff1a;https://arxiv.org/abs/2307.09288 Introduction 创新点 7B - 70B 预训练 微调 开源Llama 2 和Llama 2-Chat&#xff0c;针对对话用例进行了优化Motivation A…