鸿蒙NEXT开发实战教程:仿抖音短视频
今天的实战教程是简单模仿一下抖音短视频,主要是首页部分的内容,先看效果图:
下面为大家讲解这个项目的详细教程。
tabbar
Tabbar的难点在于中间有个发布按钮,思路是我们可以在tabbar里加个判断,中间按钮使用图片,其余按钮使用文字。相关代码如下:
@State arr: Array<string> = ['首页', '朋友', '发布', '消息', '我'];
@Builder TabBuilder(index: number) {
Column() {
if (index === 2) {
Image($rawfile('add.png'))
.width($r('app.float.width_small'))
} else {
Text(`${this.arr[index]}`)
.fontColor(this.currentIndex === index ? Color.Red : Color.Gray)
.fontSize(17)
.fontWeight(500)
}
}
.width('100%')
.height('100%')
.alignItems(HorizontalAlign.Center)
.justifyContent(FlexAlign.Center)
.backgroundColor(Color.Black)
}
导航栏
这里的导航栏是透明的,而且不占用空间,覆盖在视频之上,所以就不能使用系统的Navigation,我们要自定义一个导航栏。导航栏的内容有两边的图片按钮,还有中间可以滑动的菜单列表,实现代码如下:
Row(){
Row(){
Image($r('app.media.l_more'))
.width(25)
.height(25)
}
.height(56)
.width(this.screenWidth/7)
.justifyContent(FlexAlign.Center)
.alignItems(VerticalAlign.Center)
YLTabbar()
.width(5*this.screenWidth/7)
Row(){
Image($r('app.media.find'))
.width(25)
.height(25)
}
.width(this.screenWidth/7)
.height(56)
.width(this.screenWidth/7)
.justifyContent(FlexAlign.Center)
.alignItems(VerticalAlign.Center)
}
.margin({top:this.topHeight})
.height(56)
播放视频
本项目使用的视频资源是本地文件,存放在rawfile文件夹下,鸿蒙系统提供了Video组件来播放视频,具体使用方法如下:
Video({
src: this.videoResource,
controller: this.controller
})
.height('100%')
.autoPlay(true)
.controls(false)
.objectFit(ImageFit.Cover)
.loop(true)
视频翻页
幽蓝君起初尝试过使用很多组件来实现翻页效果,比如List、Grid等等,最后发现swiper组件的效果最好,也最简单,只是要进行一些属性上的设置,比如动画曲线、循环模式等等,具体代码如下:
Swiper(this.swiperController){
SingleRow({videoResource:$rawfile('video1.mp4')})
SingleRow({videoResource:$rawfile('video2.mp4')})
SingleRow({videoResource:$rawfile('video3.mp4')})
}
.index(videoIndex) // 设置当前在容器中显示的子组件的索引值
.width('100%')
.height('100%')
.autoPlay(false)
.indicator(false)
.loop(true)
.duration(200) // 子组件切换的动画时长
.cachedCount(0)
.vertical(true)
.itemSpace(0)
/**
* 弹性曲线产生自然的弹簧效果,四个参数分别对应附着在弹簧上的对象的初始速度、附着在弹簧上的对象的质量、单位形变量所需弹力的大小、
* 弹簧在振动过程中的减震力,使得弹簧振幅逐渐减小直至停止在平衡位置
*/
.curve(curves.interpolatingSpring(-1, 1, 328, 34))
.onChange((index) => {
this.index = index;
this.playBoo = true;
videoIndex = index;
})
以上就是本项目中的一些难点.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了