乐于分享
好东西不私藏

HarmomyOS实战案例:闲置物品App

HarmomyOS实战案例:闲置物品App

大家好,今天要分享的案例是闲置物品App,效果图如下:

本项目基于HarmonyOS6,api20,采用V2版本状态管理,项目分为首页和分类两个页面,下面为大家介绍案例的详细实现过程。

首页

首页内容较多,整体可以分为标题栏和内容列表两部分。标题栏Navigation组件的title属性实现,Navigation的标题栏默认为自适应模式,我们需要固定设置为Mini模式,并且隐藏返回按钮。标题栏内容包括定位信息、搜索框和搜索按钮,整体呈水平布局,使用Row容器实现即可,具体代码如下:

pathStack:NavPathStack = new NavPathStack()@Builder TitleBar(){  Row({space:25}){    Row({space:3}){      Image($r('app.media.location'))        .width(19)        .height(19)      Text('北京')        .fontColor('#999999')        .fontSize(14)      Image($r('app.media.down'))        .width(6)        .height(6)    }    Row({space:6}){      Search()        .height(30)        .layoutWeight(1)      Text('搜索')        .backgroundColor('#424241')        .fontColor(Color.White)        .textAlign(TextAlign.Center)        .fontSize(14)        .width(55)        .height(28)        .borderRadius(6)    }    .layoutWeight(1)    .alignItems(VerticalAlign.Center)  }  .width('100%')  .alignItems(VerticalAlign.Center)  .padding({left:12,right:12})}@Builder pathMap(name:string){  if(name == 'type'){    TypePage()  }}Navigation(this.pathStack){}.titleMode(NavigationTitleMode.Mini).hideBackButton(true).title(this.TitleBar()).navDestination(this.pathMap)
上述代码中,由于首页涉及到分类页的跳转,所以为Navigation绑定了导航控制器pathStack。
接下来是内容列表部分,这部分内容使用List组件实现,内容可以分为三部分,分别是banner、分类列表和物品列表,如下图所示。
banner目前只有一张图片,直接使用Swiper组件就可以轻松实现轮播图样式,具体代码如下:
ListItem(){  Swiper(){    Image($r('app.media.banner'))  }  .width('100%')  .height(172)}
分类列表呈水平排列,不支持滚动,在Row容器中循环添加组件即可,具体代码如下:
export classTypeClass{  title:string = ''  image:Resource = $r('app.media.chongwu')}@Local typeList:TypeClass[] = [  {title:'服饰',image:$r('app.media.fushi')},  {title:'宠物',image:$r('app.media.chongwu')},  {title:'书籍',image:$r('app.media.shuji')},  {title:'电子',image:$r('app.media.dianzi')},  {title:'其他',image:$r('app.media.qita')},]ListItem(){  Row(){    ForEach(this.typeList,(item:TypeClass,index)=>{      Column({space:5}){        Image(item.image)          .width(32)          .height(32)        Text(item.title)          .fontSize(14)          .fontColor(Color.Black)      }      .onClick(()=>{        this.pathStack.pushPathByName('type',null)      })    })  }  .width('100%')  .justifyContent(FlexAlign.SpaceAround)  .margin({top:20})}
物品列表部分包含标题,所以用到ListItemGroup,用来实现header,紧接着下面是水平滚动的分类列表,使用Scroll容器实现,并实现选中样式,具体代码如下:
ListItemGroup({header:this.GroupTitle()}){  ListItem(){    Scroll(){      Row({space:20}){        ForEach(this.goodsList,(item:string,index)=>{          Column({space:4}){            Text(item)            .fontSize(14)              .fontWeight(index == this.goodsIndex?FontWeight.Bold:FontWeight.Regular)            Row(){}            .width(30)            .height(3)            .backgroundColor('#FADA52')            .borderRadius(1.5)            .visibility(index == this.goodsIndex?Visibility.Visible:Visibility.Hidden)          }          .onClick(()=>{            this.goodsIndex = index          })        })      }    }    .width('100%')    .scrollable(ScrollDirection.Horizontal)    .scrollBar(BarState.Off)    .padding({top:5,right:12})  }}
具体物品列表为网格部分,使用Grid组件实现,具体代码如下:
@Local goods:GoodsClass[] = [  {name:'旅游鞋',price:'120',image:$r('app.media.goods1')},  {name:'京巴狗',price:'340',image:$r('app.media.goods2')},  {name:'旅游鞋',price:'120',image:$r('app.media.goods1')},  {name:'京巴狗',price:'340',image:$r('app.media.goods2')},  {name:'旅游鞋',price:'120',image:$r('app.media.goods1')},  {name:'京巴狗',price:'340',image:$r('app.media.goods2')}]ListItem(){  Grid(){    ForEach(this.goods,(item:GoodsClass,index)=>{      GridItem(){        Column(){          Image(item.image)            .width('100%')            .height(124)          Text(item.name)            .fontColor(Color.Black)            .fontSize(14)            .margin({top:5})          Text('¥' + item.price)            .fontColor(Color.Gray)            .fontSize(13)            .margin({top:5})        }        .alignItems(HorizontalAlign.Start)      }    })  }  .columnsTemplate('1fr 1fr')  .rowsGap(10)  .columnsGap(10)  .maxCount(2)  .margin({top:13})}

分类页

分类页很明显分为左右两部分,左边比较简单,就是一个List列表,右边是网格列表,看似使用Grid组件可以实现,但是它又包含多个分组,而分组标题使用Grid是不太好实现的,所以我们使用List组件实现分组和标题,在其中嵌套Grid组件来实现最终样式。要注意的是,分类页作为首页的导航子页一定要添加NavDestination组件,具体代码如下:
@Local typeList:string[] = ['服饰','书籍','宠物','电子','家具','居家','电器','消耗品','服饰']@Local typeIndex:number = 0@Local typeSubList:TypeClass[] = [  {title:'短裤套装',image:$r('app.media.type_1')},  {title:'短裤套装',image:$r('app.media.type_2')},  {title:'短裤套装',image:$r('app.media.type_3')},  {title:'短裤套装',image:$r('app.media.type_4')},  {title:'短裤套装',image:$r('app.media.type_1')},  {title:'短裤套装',image:$r('app.media.type_2')},]@Builder GroupTitle(title:string){  Text(title)    .fontColor(Color.Black)    .fontSize(17)    .fontWeight(FontWeight.Bold)    .padding({left:13,top:15,bottom:10})}build() {  NavDestination(){    Flex({direction:FlexDirection.Row}){      List(){        ForEach(this.typeList,(item:string,index)=>{          ListItem(){            Stack({alignContent:Alignment.Start}){              if(this.typeIndex == index){                Row(){}                .width(5)                .height(30)                .borderRadius(2.5)                .backgroundColor('#FADA52')              }              Row(){                Text(item)                  .fontColor(this.typeIndex == index?Color.Black:'#666666')                  .fontSize(this.typeIndex == index?16:14)                  .fontWeight(this.typeIndex == index?FontWeight.Bold:FontWeight.Regular)              }              .alignItems(VerticalAlign.Center)              .justifyContent(FlexAlign.Center)              .height(50)              .width('100%')              .onClick(()=>{                this.typeIndex = index              })            }          }        })      }      .width(86)      .height('100%')      .backgroundColor('#e3e3e3')      List(){        ListItemGroup({header:this.GroupTitle('夏季套装')}){          ListItem(){            Grid(){              ForEach(this.typeSubList,(item:TypeClass,index)=>{                GridItem(){                  Column({space:6}){                    Image(item.image)                      .width(65)                      .height(65)                    Text(item.title)                      .fontColor('#666666')                      .fontSize(14)                  }                }              })            }            .width('100%')            .columnsTemplate('1fr 1fr 1fr')            .rowsGap(10)            .columnsGap(10)          }        }        ListItemGroup({header:this.GroupTitle('夏季套装')}){          ListItem(){            Grid(){              ForEach(this.typeSubList,(item:TypeClass,index)=>{                GridItem(){                  Column({space:6}){                    Image(item.image)                      .width(65)                      .height(65)                    Text(item.title)                      .fontColor('#666666')                      .fontSize(14)                  }                }              })            }            .width('100%')            .columnsTemplate('1fr 1fr 1fr')            .rowsGap(10)            .columnsGap(10)          }        }      }      .height('100%')      .width('100%')    }    .width('100%')    .height('100%')  }  .title('商品分类')}
以上就是闲置物品App实现过程,感谢阅读。
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » HarmomyOS实战案例:闲置物品App

评论 抢沙发

1 + 8 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮