第四章 精选页面和我的页面设计


前言

本次主要介绍精选页面和我的页面的设计思路。


一、精选页面

1.顶部设计

将顶部设计单分一块,在精选中使用import语句,构建Header()函数。

代码如下:

@Component
export struct Header{
  private title: ResourceStr
  build(){
    Row(){
      Image($r('app.media.ic_public_back'))
        .width(30)
      Text(this.title)
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
      Blank()
      Image($r('app.media.ic_public_refresh'))
        .width(30)
    }
    .width('100%')
    .height(30)
  }
}

2.商品信息整合

精选界面有着多个商品的图片和价格信息,如果全都放在private items下写必然导致代码冗长,不易阅读,所以使用@Builder装饰器构建ItemCard()函数,用来定义和储存商品对象的各个信息。

代码如下:

@Builder function ItemCard(item: Item){
  Row({space: 10}){
    Image(item.image)
      .width(100)
    Column({space: 4}){
      if(item.discount){
        Text(item.name)
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
        Text('原价:¥' + item.price)
          .fontColor('#CCC')
          .fontSize(14)
          .decoration({type: TextDecorationType.LineThrough})
        Text('折扣价:¥' + (item.price - item.discount))
          .priceText()
        Text('补贴:¥' + item.discount)
          .priceText()
      }
      else{
        Text(item.name)
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
        Text('¥' + item.price)
          .priceText()
      }

    }
    .height('100%')
    .alignItems(HorizontalAlign.Start)
  }
  .width('100%')
  .backgroundColor('#FFF')
  .borderRadius(20)
  .height(120)
  .padding(10)
}

精选页面整体代码:

class Item {
  name: string
  image: ResourceStr
  price: number
  discount: number

  constructor(name: string, image: ResourceStr, price: number, discount: number = 0) {
    this.name = name
    this.image = image
    this.price = price
    this.discount = discount
  }
}

import {Header} from './components/CommonComponents'

@Builder function ItemCard(item: Item){
  Row({space: 10}){
    Image(item.image)
      .width(100)
    Column({space: 4}){
      if(item.discount){
        Text(item.name)
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
        Text('原价:¥' + item.price)
          .fontColor('#CCC')
          .fontSize(14)
          .decoration({type: TextDecorationType.LineThrough})
        Text('折扣价:¥' + (item.price - item.discount))
          .priceText()
        Text('补贴:¥' + item.discount)
          .priceText()
      }
      else{
        Text(item.name)
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
        Text('¥' + item.price)
          .priceText()
      }

    }
    .height('100%')
    .alignItems(HorizontalAlign.Start)
  }
  .width('100%')
  .backgroundColor('#FFF')
  .borderRadius(20)
  .height(120)
  .padding(10)
}

@Styles function fillScreen(){
  .width('100%')
  .height('100%')
  .backgroundColor('#EFEFEF')
  .padding(20)
}

@Extend(Text) function priceText(){
  .fontColor('#F36D')
  .fontSize(18)
}

@Component
export default struct Choice {
  //商品数据
  private items: Array<Item> = [
    new Item('华为Mate60', $r('app.media.mate60'),6999, 500),
    new Item('MateBookProX', $r('app.media.mateBookProX'),13999),
    new Item('WatchGT4', $r('app.media.watchGT4'),1438),
    new Item('FreeBuds Pro3', $r('app.media.freeBudsPro3'),1499),
    new Item('FreeBuds Pro3', $r('app.media.freeBudsPro3'),1499),
    new Item('Mate X5', $r('app.media.mateX5'),12999),
  ]

  build() {
    Column({ space: 8 }) {

      Header({ title: '商品列表' })
        .margin({ bottom: 20 })

      List({ space: 8 }) {
        ForEach(
          this.items,
          (item: Item) => {
            ListItem() {
              ItemCard(item)
            }
          }
        )
      }
      .width('100%')
      .layoutWeight(1)
    }
    .fillScreen()
  }
}

效果展示:
在这里插入图片描述

二、我的页面

1.退出登录页面路由

在我的页面下,添加退出登录按钮,实现由主页返回到登录页面,依旧使用@ohos.router进行操作。

代码如下:

        //退出登录
        Button('退出登录')
          .width('90%')
          .height(40)
          .fontSize(16)
          .backgroundColor('#e5e8ea')
          .fontColor(Color.Red)
          .margin({
            top: 30
          })
          .onClick(() => {
            //跳转
            router.pushUrl({
              url:'pages/LoginPage'  //跳转到登录
            }).catch((error:Error) => {
              //异常处理
            })
          })

2.用户信息模块

在我的页面顶部显示用户的部分信息和头像。

代码如下:

  build() {
    Row() {
      Image($r('app.media.ic_04'))
        .width(50)
        .height(50)
      Column(){
        Text('张三')
          .fontSize(20)
        Text('zhangsan123@qq.com')
          .fontSize(14)
          .margin({top: 5})
      }
      .alignItems(HorizontalAlign.Start)
      .margin({left: 15})
    }
    .alignItems(VerticalAlign.Center)
    .backgroundColor(Color.White)
    .width('100%')
    .height(100)
    .margin({
      top: 30,
      bottom: 12
    })
    .borderRadius(25)
    .padding({left: 20})
  }

3.用户菜单列表

用户菜单包括日常功能按键,使用Switch开关切换,提供开关的用户反馈。

  build() {
    List(){
      ForEach(this.listData, (item:ItemType) => {
        ListItem(){
          Row(){
            Row({space: 10}){
              Image(item.img)
                .width(22)
                .height(22)
              Text(item.title)
                .fontSize(16)
            }
            //开关组件
            //isOn 开关的打开或关闭状态 true打开
            Toggle({type:ToggleType.Switch, isOn:false})
              .onChange((isChange:Boolean) => {
                //isChange打开或关闭的状态
                let tip:string = isChange?'系统选项打开':'系统选项关闭'
                promptAction.showToast({
                  message:tip,
                  duration:3000
                })
              })
          }
          .width('100%')
          .justifyContent(FlexAlign.SpaceBetween)
          .padding(12)
        }
        .height(50)
      })
    }
    .width('100%')
    .backgroundColor(Color.White)
    .borderRadius(25)
    .padding({
      top: 5,
      bottom: 5
    })
    .divider({  //分割线
      color: '#dddd',
      strokeWidth: 1,
      startMargin: 46,  //分割线的开始的位置
      endMargin: 12
    })
  }

在其中注意到,使用 let rip 判断系统选项的开与关,并提供给用户信息反馈。

效果展示:
在这里插入图片描述
在这里插入图片描述


总结

这次完成了最后的代码设计,整体来说比较完善,但首页还有待改善,下一章将进行整个项目的具体总结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值