鸿蒙开发【微博首页】实操

一、创建页面并且绘制页面顶部内容

1. 创建页面命名为MicroBlogPage,自定义组件tab标签

代码如下:

@Entry

@Component
export struct MicroBlogPage {

@State currentIndex:number=0
private tabsController:TabsController=new TabsController()
@Builder TabBuilder(title:string,targetIndex:number,selectedImg: Resource, normalImg: Resource){
 
Column() {
   
Image(this.currentIndex === targetIndex ? selectedImg : normalImg)
     
.size({ width: 25, height: 25 }).margin({top:20})
   
Text(title)
     
.fontColor(this.currentIndex === targetIndex ? '#1698CE' : '#6B6B6B')
 
}
 
.width('100%')
 
.height(50)
 
.justifyContent(FlexAlign.Center)


  .onClick(()=>{
   
this.currentIndex=targetIndex
   
this.tabsController.changeIndex(this.currentIndex)
 
})
}

build() {
   
Column() {

}

}

}

2. 在build()里面利用层叠组件添加页面顶部内容

需要实现的效果图:

同一容器中兄弟组件显示层级关系。zIndex值越大,显示层级越高,即zIndex值大的组件会覆盖在zIndex值小的组件上方。

代码如下:

build() {
   
Column() {
     
Stack({ alignContent: Alignment.TopStart }) {
       
Row() {
         
Image($r('app.media.sign_in')).fancy().margin({ top: 20, left: 20 })
    
       
}
       
.zIndex(10)

Stack({ alignContent: Alignment.TopEnd }) {
 
Row({space:10}) {
   
Image($r('app.media.red')).fancy().width(40)
   
Image($r('app.media.add')).fancy()
   
 
}.width(90)
 
.zIndex(10) //同一容器中兄弟组件显示层级关系。
 
// zIndex值越大,显示层级越高,即zIndex值大的组件会覆盖在zIndex值小的组件上方。

3.添加顶部标签样式

代码示例:

Tabs({ barPosition: BarPosition.Start,controller:this.tabsController }) {
 
TabContent() {

}.tabBar('关注')

TabContent() {

}.tabBar('推荐')

}

二、利用ForEach循环渲染、List组件实现图片文本布局的水平方向滑动

1. 利用divider设置水平分割线

代码示例:

Row() {
 
Divider().backgroundColor('#EDEDED')
}.justifyContent(FlexAlign.Start)

2.定义类ImageItem封装

 class ImageItem {
 
image: ResourceStr
 
name:string

 
constructor(image: ResourceStr,name:string) {
   
this.name=name
   
this.image =image
 
}
}

3.创建自定义函数list

@State  list:Array<ImageItem> =[
 
new ImageItem($r('app.media.listen'),'听听'),
  new
ImageItem($r('app.media.grant'),'种地吧'),
  new
ImageItem($r('app.media.lian'),'颐莲'),
  new
ImageItem($r('app.media.plant'),'种地星球'),
  new
ImageItem($r('app.media.begger'),'贵族乞丐'),
  new
ImageItem($r('app.media.listen'),'听听'),
  new
ImageItem($r('app.media.grant'),'种地吧'),
  new
ImageItem($r('app.media.lian'),'颐莲'),
  new
ImageItem($r('app.media.plant'),'种地星球'),
  new
ImageItem($r('app.media.begger'),'贵族乞丐')
]

4. 设置图片的样式fancy( )方便调用

@Styles function fancy() {
 
.height(25)
 
.width(25)
 
.margin({top:20})
}

5.利用Builder  定义函数Item Card

代码示例:

@Builder  function  ItemCard(item:ImageItem){
 
Row(){
   
Column({space:5}){
     
Image(item.image).width(50).height(50)
     
Text(item.name)
   
}
  }
.height(50)
 
.margin({left:20,top:5})

}

6.利用list组件以及循环渲染

代码示例:

List() {
 
ForEach(this.list, (item: ImageItem) => {
   
ListItem() {
     
//直接调用定义的ItemCard函数
      ItemCard(item)
   
}
  }
)
}
.height(100)
.listDirection(Axis.Horizontal)

listDirection(Axis.Horizontal) 对于list设置在水平方向上的滑动。

三、利用线性布局Row属性添加文本

代码示例:

Row({ space: 20 }) {
 
Text('近期热门人物推荐')
 
Text('查看更多').fontColor('#36D')

}
.width('100%').height(50)
.justifyContent(FlexAlign.SpaceAround)

四、利用线性布局组件,以及ForEach循环渲染

1.设置任务推荐左右滑动,定义类CheckMany

class CheckMany{
 
image: ResourceStr
 
title:string
 
content:string
 
constructor(image: ResourceStr,title:string,content:string) {
   
this.image =image
   
this.title =title
   
this.content=content
 
}
}

2.自定义arr列表组件函数

@State arr:Array<CheckMany> =[
 
new CheckMany($r('app.media.image_1'),'行走的一条尾鱼','你可能感兴趣的人'),
  new
CheckMany($r('app.media.image_2'),'一线明星','你可能感兴趣的人'),
  new
CheckMany($r('app.media.image_1'),'行走的一条尾鱼','你可能感兴趣的人'),
  new
CheckMany($r('app.media.image_2'),'一线明星','你可能感兴趣的人'),
  new
CheckMany($r('app.media.image_1'),'行走的一条尾鱼','你可能感兴趣的人'),
  new
CheckMany($r('app.media.image_2'),'一线明星','你可能感兴趣的人'),
]

3.创建自定义函数CheckToal

@Builder function CheckToal(item:CheckMany){
 
Row({ space: 10 }) {
   
Column({ space: 8 }) {
     
Image(item.image).height(80).width(80)
     
Text(item.title).fontSize(20).fontWeight(FontWeight.Bold)
     
Text(item.content)
     
Button('+ 关注').backgroundColor(Color.Orange).width(120).height(30)
   
}
   
.height(200)
   
.border({ style: BorderStyle.Solid, width: 1, radius: 15, color: Color.Grey })
   
.padding(8).margin(8)
 
}.height(200)

}

4.利用list组件以及循环渲染

代码示例:

//设置人物推荐左右滑动
List() {
 
ForEach(this.arr, (item: CheckMany) => {
   
ListItem() {
     
CheckToal(item)
   
}
  }
)
}.height(200)
.listDirection(Axis.Horizontal)

五、设置关注人物动态内容

1.定义类Though对关注人物封装

 class Though{
 
Himg:ResourceStr
 
name:string
 
img1:ResourceStr
 
img2:ResourceStr
 
img3:ResourceStr
 
title:string
 
content:string
 
Bimg:ResourceStr
 
constructor( Himg:ResourceStr,name:string,img1:ResourceStr, img2:ResourceStr,img3:ResourceStr,title:string,content:string,Bimg:ResourceStr ) {
   
this.Himg=Himg
   
this.name=name
   
this.img1=img1
   
this.img2 = img2
   
this.img3 =img3
   
this.title = title
   
this.content =content
   
this.Bimg = Bimg
 
}
}

2.自定义tho列表组件函数

代码示例:

@State tho:Array<Though> =[
 
new Though($r('app.media.bhead'),'白敬亭',$r('app.media.bhead0'),$r('app.media.bhead1'),$r('app.media.bhead2'),'18小时前  来自 已关注','今日穿搭',$r('app.media.baijinting')),
  new
Though($r('app.media.liuyifei'),'刘亦菲',$r('app.media.bhead0'),$r('app.media.liuyifeih'),$r('app.media.bhead2'),'11小时前  来自 已关注','刘亦菲春游plog',$r('app.media.bliuyifei')),
  new
Though($r('app.media.bhead'),'白敬亭',$r('app.media.bhead0'),$r('app.media.bhead1'),$r('app.media.bhead2'),'18小时前  来自 已关注','今日穿搭',$r('app.media.baijinting')),
  new
Though($r('app.media.liuyifei'),'刘亦菲',$r('app.media.bhead0'),$r('app.media.liuyifeih'),$r('app.media.bhead2'),'11小时前  来自 已关注','刘亦菲春游plog',$r('app.media.bliuyifei')),
]

3.创建自定义函数ThoughT

代码示例:

@Builder export  function ThoughT(item:Though){
 
Column(){
   
Row({space:10}){
     
Image(item.Himg).width(50).height(50)
     
Column({space:5}){
       
Row({space:10}){
         
Text(item.name).fontSize(18)
         
Image(item.img1).width(50).height(30)
         
Image(item.img2).width(80).height(40).margin({top:10,left:30})
         
Image(item.img3).width(20).height(20).margin({bottom:15})
                   
}
       
Row(){
         
Text(item.title).fontColor(Color.Grey).margin({right:150})
       
}
      }
    }
   
Column(){
     
Text(item.content).fontSize(18)
     
Image(item.Bimg).width(350).height(200)
   
}.alignItems(HorizontalAlign.Start)

   
Divider().height(20)
   
Row(){
     
Image($r('app.media.meme')).height(50).width(50)
     
TextInput({placeholder:'友善评论,文明发言'}).width('80%')
   
}
   
Row({space:50}){
     
Row({space:5}){
       
Image($r('app.media.zhuanfa')).width(20).height(20)
       
Text('18.7')
     
}
     
Row({space:5}){
       
Image($r('app.media.red')).width(40).height(20)
       
Text('5.3')
     
}
     
Row({space:5}){
       
Image($r('app.media.dianzan')).width(20).height(20)
       
Text('28.3')
     
}
    }
.height(40)
   
Row().height(10).width('100%').backgroundColor('#EDEDED')

 
}.height('65%')
}

4.利用list组件以及循环渲染

代码示例:

Divider().backgroundColor(Color.White).height(10)
//设置关注人物态
List() {
 
ForEach(this.tho, (item: Though) => {
   
ListItem() {
     
ThoughT(item)
   
}
  }
)
}

5.给添加标志设置Mean菜单选项

(1).自定义SelMeanu类用来封装

class SelMeanu{
 
image: ResourceStr
 
name:string
 
constructor(image: ResourceStr,name:string) {
   
this.image = image
   
this.name = name
 
}
}

(2).定义构造函数列表Menu

//菜单
  private Menu:Array<SelMeanu>=[
   
new SelMeanu($r('app.media.wei_bo'),'写微博'),
    new
SelMeanu($r('app.media.phtoto'),'图片'),
    new
SelMeanu($r('app.media.video_1'),'视频'),
    new
SelMeanu($r('app.media.dian_ping'),'点评'),
    new
SelMeanu($r('app.media.swiper1'),'直播'),
 
]

(3).创建菜单自定义组件,ForEach 循环渲染

//菜单自定义组件
  @Builder   MenuContent() {
 
Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
   
ForEach(this.Menu, (item:SelMeanu) => {
     
Column() {
       
Row() {
         
Image(item.image).width(20).height(20).margin({ right: 5 })
         
Text(item.name).fontSize(20)
       
}
       
.width('100%')
       
.height(30)
       
.justifyContent(FlexAlign.Center)
       
.align(Alignment.Center)
       
.onClick(() => {
         
console.log('成功')
       
})
     
}.padding(5).height(50)
   
})
 
}.width(100)
}

(4).在添加图片直接调用菜单内容

Image($r('app.media.add')).fancy()
 
.bindMenu(this.MenuContent())

(5)运行效果:

  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值