我使用HarmonyOs Next开发了b站的首页

1.实现效果展示:

2.图标准备

我使用的是iconfont图标,下面为项目中所使用到的图标

3. 代码

(1)Index.ets:

复制代码
import {InfoTop} from '../component/InfoTop'
import {InfoCenter} from '../component/InfoCenter'
import {InfoBottom} from '../component/InfoBottom'

@Entry
@Component
struct Index {

  @State currentPage:number = 0

  build(){
    Column() {
      InfoTop()

      InfoCenter()

      InfoBottom({selectCurrent:this.currentPage})
    }
    .width('100%')
    .height('100%')
  }
}

(2)InfoTop 组件:

复制代码
import font from '@ohos.font';

@Component
export struct InfoTop {

  aboutToAppear():void{
    font.registerFont({
      familyName:'infoTop',
      familySrc:'/fonts/iconfont.ttf'
    })

  }

  build(){
    
    Column(){

      Row(){
        Image($r('app.media.avatar'))
          .height(48)
          .width(48)
          .borderRadius(24)
          .margin({right:18})

        //搜索框
        Row(){
          Text('\ue7d2')
            .fontFamily('infoTop')
            .fontSize(20)

          Text('HarmonyOS Next')
            .textOverflow({overflow:TextOverflow.Ellipsis})
            .maxLines(1)
            .layoutWeight(1)

        }.border({
          width:1
        })
        .height(40)
        .layoutWeight(1)
        .padding(10)
        .borderRadius(20)


        Text('\ue613')
          .fontFamily('infoTop')
          .fontSize(35)
          .margin({left:24,right:18})

        Text('\ue673')
          .fontFamily('infoTop')
          .fontSize(35)

      }
      .width('100%')



    }.padding(10)
    .width('100%')

  }
}

(3)InfoCenter组件:

复制代码
import font from '@ohos.font';
import {HomeRecommend} from './HomeRecommend'
@Component
export struct InfoCenter {
  aboutToAppear():void{
    font.registerFont({
      familyName:'infoCenter',
      familySrc:'/fonts/iconfont.ttf'
    })

  }

  @State navTop:string[] = ['直播','推荐','热门','动画','影视','新征程']

  @State selectCurrent:number = 1 //默认为推荐页面

  @State swiperImg:Resource[] = [
    $r('app.media.swiper_phone_01'),
    $r('app.media.swiper_phone_03'),
    $r('app.media.swiper_phone_00')]

  @Builder
  tabNavBuilder(index:number){
    Text(this.navTop[index])
      .border({
        width:{bottom:this.selectCurrent==index?2:0},
        color:this.selectCurrent==index?'#ffec839a':Color.Black
      })
      .fontColor(this.selectCurrent==index ?'#ffec839a':Color.Black)

      .textOverflow({overflow:TextOverflow.Clip})
      .maxLines(1)
  }

  @Builder
  moreBuilder(){
    Column(){
      Text('\ue643')
        .fontFamily('infoCenter')
        .fontSize(20)
        .backgroundColor(Color.White)
    }

  }



  build(){


    Column() {
      Tabs({barPosition:BarPosition.Start}){
        ForEach(this.navTop,(item:string,index)=>{
          TabContent(){
            //内容

            HomeRecommend()

          }.tabBar(this.tabNavBuilder(index))


          if(index == this.navTop.length-1){
            TabContent(){
            }.tabBar(this.moreBuilder())

          }
        })


      }
      .onChange((index:number)=>{
        if(index == this.navTop.length){
          console.log('跳转页面')
          return;
        }

        this.selectCurrent = index

      })



    }
    .height('80%')
    .width('100%')
  }
}

InfoCenter中的HomeRecommend组件

复制代码
import font from '@ohos.font';

interface   recommendData{
  img:Resource
  title:string
  username:string
}

@Component
export struct HomeRecommend{
  aboutToAppear():void{
    font.registerFont({
      familyName:'recommendChannel',
      familySrc:'/fonts/iconfont.ttf'
    })
  }

  @State recommendList:recommendData[] = [
    {img:$r('app.media.harmonyOs'),title:'使用HarmonyOs Next开发b站首页的推荐,喜欢本期视频的观众朋友,可以关注一下up主',username:'XXX'},
    {img:$r('app.media.harmonyOs'),title:'使用HarmonyOs Next开发b站首页的推荐,喜欢本期视频的观众朋友,可以关注一下up主',username:'XXX'},
    {img:$r('app.media.harmonyOs'),title:'使用HarmonyOs Next开发b站首页的推荐,喜欢本期视频的观众朋友,可以关注一下up主',username:'XXX'},
    {img:$r('app.media.harmonyOs'),title:'使用HarmonyOs Next开发b站首页的推荐,喜欢本期视频的观众朋友,可以关注一下up主',username:'XXX'},
    {img:$r('app.media.harmonyOs'),title:'使用HarmonyOs Next开发b站首页的推荐,喜欢本期视频的观众朋友,可以关注一下up主',username:'XXX'},
    {img:$r('app.media.harmonyOs'),title:'使用HarmonyOs Next开发b站首页的推荐,喜欢本期视频的观众朋友,可以关注一下up主',username:'XXX'},
    {img:$r('app.media.harmonyOs'),title:'使用HarmonyOs Next开发b站首页的推荐,喜欢本期视频的观众朋友,可以关注一下up主',username:'XXX'},
    {img:$r('app.media.harmonyOs'),title:'使用HarmonyOs Next开发b站首页的推荐,喜欢本期视频的观众朋友,可以关注一下up主',username:'XXX'}]




  build(){
    Column(){

      Swiper(){
        Image($r('app.media.harmonyOs'))
        Image($r('app.media.harmonyOs'))
        Image($r('app.media.harmonyOs'))

      }.width('100%')
      .height(200)
      .autoPlay(true)
      .interval(2000)
      .margin(10)
      .indicator(
       Indicator.dot()
        .itemWidth(10)
        .itemHeight(10)
        .color(Color.Gray)
        .selectedItemWidth(10)
        .selectedItemHeight(10)
        .selectedColor(Color.White)
      )



      List(){
        ForEach(this.recommendList,(item:recommendData,index)=>{
          ListItem(){
            Column(){
              Image(item.img)
                .width('100%')
                .borderRadius({topRight:10,topLeft:10})

              Text(item.title)
                .textOverflow({overflow:TextOverflow.Ellipsis})
                .maxLines(2)
                .width('100%')
                .padding(5)

              Row(){
                Row({space:15}){
                  Text('\ue665')
                    .fontFamily('recommendChannel')
                    .margin({left:11})
                    .fontSize(22)

                  Text(item.username)

                }

                Text('\ue75f')
                  .fontFamily('recommendChannel')


              }
              .margin({top:10})
              .width('100%')
              .justifyContent(FlexAlign.SpaceBetween)

            }
            .backgroundColor(Color.White)
            .width('100%')

          }

        })

      }
      .padding(2)
      .lanes(2,15)


    }.backgroundColor('#ffefefef')
    .height('100%')
    .width('100%')

  }

}

(4)InfoBottom组件:

复制代码
import font from '@ohos.font';

interface IBottomNav{
  title:string
  font:string
}

@Component
export struct InfoBottom{

  aboutToAppear():void{
    font.registerFont({
      familyName:'infoBottom',
      familySrc:'/fonts/iconfont.ttf'
    })

  }

  @Link selectCurrent:number

  @State bottomNav:IBottomNav[] = [
    { title:'首页',font:'\ue61f' },
    { title:'动态',font:'\ue625' },
    { title:'会员购',font:'\ue601' },
    { title:'我的',font:'\ue600' }]

  @State offsetNav:number = 0

  @Builder
  bottomNavBuilder(item:IBottomNav,index:number){
    Column(){
      Text(item.font)
        .fontFamily('infoBottom')
        .fontSize(40)
        //感觉图标1和图标2都有点细小,进行加粗
        .fontWeight(index == 0 || index == 1 ? FontWeight.Bold:FontWeight.Normal)
        .fontColor(this.selectCurrent == index ? '#fff162d2':Color.Black)

      Text(item.title)
        .fontColor(this.selectCurrent == index ? '#fff162d2':Color.Black)
    }
  }

  @Builder
  addBuilder(){
    Text('\ue696;')
      .fontFamily('infoBottom')
      .fontSize(60)
      .fontColor('#fff162d2')


  }



  build(){

    Column(){

      Tabs({barPosition:BarPosition.Start}){
        ForEach(this.bottomNav,(item:IBottomNav,index)=>{
          TabContent(){

          }
          .tabBar(this.bottomNavBuilder(item,index))


          //放在中间-1之后的第一位位置
          if(this.bottomNav.length/2 == index + 1){
            TabContent(){

            }
            .tabBar( this.addBuilder())

          }


        })

      }
      .animationDuration(0)
      .onChange((index:number)=>{
        if(index == this.bottomNav.length/2 ){
          //跳转上传页面
          return;
        }

        if(index > this.bottomNav.length/2 ){
          this.selectCurrent = index - 1
        }else{
          this.selectCurrent = index
        }


      })


    }.border({
      width:{top:1},
      style:BorderStyle.Dotted
    })
    .padding(5)
    .height(80)
    .width('100%')

  }
}
相关推荐
遇到困难睡大觉哈哈1 天前
HarmonyOS —— Remote Communication Kit 拦截器(Interceptor)高阶定制能力笔记
笔记·华为·harmonyos
遇到困难睡大觉哈哈1 天前
HarmonyOS —— Remote Communication Kit 定制处理行为(ProcessingConfiguration)速记笔记
笔记·华为·harmonyos
氤氲息1 天前
鸿蒙 ArkTs 的WebView如何与JS交互
javascript·交互·harmonyos
遇到困难睡大觉哈哈1 天前
HarmonyOS支付接入证书准备与生成指南
华为·harmonyos
赵浩生1 天前
鸿蒙技术干货10:鸿蒙图形渲染基础,Canvas绘图与自定义组件实战
harmonyos
赵浩生1 天前
鸿蒙技术干货9:deviceInfo 设备信息获取与位置提醒 APP 整合
harmonyos
BlackWolfSky1 天前
鸿蒙暂未归类知识记录
华为·harmonyos
L、2181 天前
Flutter 与开源鸿蒙(OpenHarmony):跨平台开发的新未来
flutter·华为·开源·harmonyos
L、2181 天前
Flutter 与 OpenHarmony 深度融合实践:打造跨生态高性能应用(进阶篇)
javascript·flutter·华为·智能手机·harmonyos