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

news2024/10/5 9:37:16

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%')

  }
}

 

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

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

相关文章

EtherCAT总线

目录 1、EtherCAT的系统组成 2、EtherCAT的运行原理 3、EtherCAT的数据帧结构 4、EtherCAT的寻址方式 5、EtherCAT的分布时钟 6、EtherCAT的通信模式 7、EtherCAT应用层协议 1、EtherCAT的系统组成 EtherCAT是一种实时以太网技术,由一个主站设备和多个从站…

SwinTransformer的相对位置索引的原理以及源码分析

文章目录 1. 理论分析2. 完整代码 引用:参考博客链接 1. 理论分析 根据论文中提供的公式可知是在 Q Q Q和 K K K进行匹配并除以 d \sqrt d d ​ 后加上了相对位置偏执 B B B。 A t t e n t i o n ( Q , K , V ) S o f t m a x ( Q K T d B ) V \begin{aligned} &…

认识并理解webSocket

今天逛牛客,看到有大佬分享说前端面试的时候遇到了关于webSocket的问题,一看自己都没见过这个知识点,赶紧学习一下,在此记录! WebSocket 是一种网络通信协议,提供了全双工通信渠道,即客户端和服…

无法下载cuda

cuda下载不了 一、台式机电脑浏览器打不开cuda下载下面二、解决办法 一、台式机电脑浏览器打不开cuda下载下面 用360、chrome、Edge浏览器都打不开下载页面,有的人说后缀com改成cn,都不行。知乎上说是网络问题,电信换成换成移动/联通的网络会…

2229:Sumsets

网址如下&#xff1a; OpenJudge - 2229:Sumsets 这题不是我想出来的 在这里仅做记录 代码如下&#xff1a; #include<iostream> using namespace std;const int N 1000000000; int dp[1000010]; int n;int main() {cin >> n;dp[0] 1;dp[1] 1;for (int i 2…

Win11系统文件夹预览无法预览PDF文件,PDF阅读器是adobe acrobat

三步走 首先&#xff0c;打开文件夹预览功能 然后&#xff0c;设置adobe acrobat为默认PDF打开应用 最后&#xff0c;打开在Windows资源管理器中启用PDF缩略图&#xff0c;正常设定后&#xff0c;会显示配置文件&#xff0c;稍等一会。

5个实用的文章生成器,高效输出优质文章

在自媒体时代&#xff0c;优质内容的持续输出是吸引读者、提升影响力的关键。然而&#xff0c;对于许多自媒体创作者来说&#xff0c;频繁的创作难免会遭遇灵感枯竭、创作不出文章的困扰。此时&#xff0c;文章生成器便成为了得力的助手。文章生成器的优势能够快速自动生成高质…

7 系列 FPGA 引脚及封装(参考ug475)

目录 I/O BankPins引脚定义I/O and Multi-Function PinsPower Supply PinsDedicated XADC PinsTransceiver PinsDedicated Configuration PinsTemperature Sensor Pins Device 视图整个 FPGAIOBILOGIC,OLOGIC,IDELAY,ODELAYBUFIO,BUFR,IDELAYCTRLBUFMRCEBRAM,DSPIBUFDS_GTE2CLB…

Spring源码十四:Spring生命周期

上一篇我们在Spring源码十三&#xff1a;非懒加载单例Bean中看到了Spring会在refresh方法中去调用我们的finishBeanFactoryInitialization方法去实例化&#xff0c;所有非懒加载器单例的bean。并实例化后的实例放到单例缓存中。到此我们refresh方法已经接近尾声。 Spring的生命…

医疗器械企业CRM系统推荐清单(2024版)

近年来&#xff0c;我国医疗器械行业在国家政策支持、医改深入、人口老龄化和消费能力提升等因素推动下&#xff0c;得到了快速发展&#xff0c;正日益成为创新能力增强、市场需求旺盛的朝阳产业。然而&#xff0c;行业也面临价格压力、市场份额重新分配、合规风险以及产品和服…

【C语言】register 关键字

在C语言中&#xff0c;register关键字用于提示编译器将变量尽量存储在CPU的寄存器中&#xff0c;而不是在内存中。这是为了提高访问速度&#xff0c;因为寄存器的访问速度比内存快得多。使用register关键字的变量通常是频繁使用的局部变量。 基本用法 void example() {regist…

使用ChatGPT写学术论文的技巧和最佳实践指南

大家好&#xff0c;感谢关注。我是七哥&#xff0c;一个在高校里不务正业&#xff0c;折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥&#xff08;yida985&#xff09;交流&#xff0c;多多交流&#xff0c;相互成就&#xff0c;共同进步&a…

ActiveMq工具之管理页面说明

文章目录 安装ActiveMQ一: 访问管理页面二: 进入管理页面&#xff0c;主页三: Queues页说明四: Topics页说明五: Subscribers页说明 安装ActiveMQ wget https://archive.apache.org/dist//activemq/5.13.3/apache-activemq-5.13.3-bin.tar.gz wget https://mirrors.huaweiclou…

ubuntu 系统中 使用docker 制作 Windows 系统,从此告别 vmware虚拟机

我的系统是 ubuntu 24 前期准备工作&#xff1a; 安装dockerdocker pull 或者 手动制作镜像 docker build 的话 必须要 科学上网&#xff0c; 好像阿里镜像都下不下来。需要 知道 docker 和docker compose 命令的使用方式 我是给docker 挂了 http代理 如果你能pull下来镜像 …

Mysql-常见DML-DQL-语句语法用法总结

1、常见DML语句 1.1 INSERT语句 说明&#xff1a;将数据插入到数据库表中。 INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); 实例&#xff1a;添加C罗信息到数据库表中 insert into employee (ID, name, gender, entrydate, age) values …

MinIO - 从 环境搭建 -> SpringBoot实战 -> 演示,掌握 Bucket 和 Object 操作

目录 开始 Docker 部署 MinIO 中的基本概念 SpringBoot 集成 MinIO 依赖 配置 MinIO 时间差问题报错 The difference between the request time and the servers time is too large MinIO 中对 Bucket&#xff08;文件夹&#xff09; 的操作 是否存在 / 创建 查询所有…

Android 四大组件

1. Activity 应用程序中&#xff0c;一个Activity通常是一个单独的屏幕&#xff0c;它上面可以显示一些控件&#xff0c;也可以监听并对用户的事件做出响应。 Activity之间通过Intent进行通信&#xff0c;在Intent 的描述结构中&#xff0c;有两个最重要的部分&#xff1a;动…

嵌入式Linux系统编程 — 7.2 进程的环境变量

目录 1 什么是进程的环境变量 2 环境变量的作用 3 应用程序中获取环境变量 3.1 environ全局变量 3.2 获取指定环境变量 getenv 4 添加/删除/修改环境变量 4.1 putenv()函数添加环境变量 4.2 setenv()函数 4.3 unsetenv()函数 1 什么是进程的环境变量 每一个进程都有一…

Node.js 生成vue组件

在项目根目录下创建 create.js /*** 脚本生成vue组件* 主要是利用node自带的fs模块操作文件的写入* ===========================================* 准备步骤:* 1.输入作者名* 2.输入文件名* 3.输入菜单名* 4.输入文件地址* ============================================* 操…

【公益案例展】厦门大学附属成功医院——国产数据库在综合三甲医院核心系统的应用...

‍ 达梦数据公益案例 本项目案例由达梦数据投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2024中国数据智能产业最具社会责任感企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 厦门大学附属成功医院是一所集医疗、教学、科研、保健、疗…