• 【Harmony OS】【ArkUI】ets开发 简易视频播放器


    前言:这一次我们来使用ets的Swiper组件、List组件和Video组件制作一个简易的视频播放器。本篇是以HarmonyOS官网的codelab简易视频播放器(eTS)为基础进行编写。本篇最主要的内容就是一个主界面包括顶部的视频海报轮播,中部的视频播放列表,以及点击海报和播放列表进入到播放界面完成视频播放的功能。师傅领进门,修行在个人,所以本篇只讲大概的组件使用,具体的细节和更详细的属性读者自己在学习中摸索。相信通过这次的学习,你能有所收获。希望能帮助你快速了解Harmony的ETS开发,学会简单的视频播放器制作学习。本篇最后会贴上参考原文链接。

    首先讲一下大致的思路,我们要在主界面顶部使用Swiper组件完成视频海报轮播,下方使用List组件完成视频播放的列表,点击海报和播放列表进入视频播放界面使用Video组件制作,其他的属性就由读者自行探索。

    1.         构建主界面。

    1)       在default文件夹中创建data、image、video文件夹,在data文件夹中创建VideoData.ets文件,用来定义电影轮播图数组swiperVideos和视频列表图片数组horizontalVideos。Image文件夹中添加图片,video文件夹中添加视频,代码中的文件路径替换由读者自行替换。

    1. const localSource: string = "/common/video/video1.mp4";
    2. const webSource: string = "https://ss0.bdstatic.com/-0U0bnSm1A5BphGlnYG/cae-legoup-video-target/93be3d88-9fc2-4fbd-bd14-833bca731ca7.mp4";
    3. export const swiperVideos:any[] = [
    4. {
    5. "image":'/common/image/video_ad0.jpg',
    6. "source":localSource
    7. },
    8. {
    9. "image":'/common/image/video_ad1.jpg',
    10. "source":localSource
    11. },
    12. {
    13. "image":'/common/image/video_ad2.jpg',
    14. "source":localSource
    15. }
    16. ]
    17. export const horizontalVideos:any[] = [
    18. {
    19. "image":'/common/image/video_list0.jpg',
    20. "source":webSource
    21. },
    22. {
    23. "image":'/common/image/video_list1.jpg',
    24. "source":webSource
    25. },
    26. {
    27. "image":'/common/image/video_list2.jpg',
    28. "source":webSource
    29. }
    30. ]

    2)       在index.ets中引入router和swiperVideos、horizontalVideos

    1. import router from '@system.router';
    2. import {swiperVideos,horizontalVideos} from '../common/data/VideoData.ets'

    3)       在index.ets中添加Swiper组件用于显示电影轮播图,使用Navigator实现页面跳转。

    1. @Entry
    2. @Component
    3. struct Index {
    4. build() {
    5. Column() {
    6. Swiper() {
    7. ForEach(swiperVideos, item => {
    8. SwiperItem({ imageSrc: item.image, source: item.source })
    9. }, item => item.image.toString())
    10. }
    11. .autoPlay(true)
    12. .height(180)
    13. .itemSpace(15)
    14. }
    15. .backgroundColor("#EEEEEE")
    16. .padding({ left: 15, top: 15, right: 15, bottom: 15 })
    17. }
    18. }
    19. @Component
    20. struct SwiperItem {
    21. private imageSrc: string
    22. private source: string
    23. build() {
    24. Navigator({ target: 'pages/Play', type: NavigationType.Push }) {
    25. Image(this.imageSrc).objectFit(ImageFit.Cover)
    26. }
    27. .params({ source: this.source })
    28. }
    29. }

    4)       添加Flex组件用于显示电影列表上方的文本信息,添加List组件用于显示电影列表,使用router实现页面跳转。

    1. @Entry
    2. @Component
    3. struct Index {
    4. build() {
    5. Column() {
    6. ...
    7. Flex({ direction: FlexDirection.Row }) {
    8. Text('Coming soon')
    9. .fontSize(20).fontWeight(FontWeight.Bold).margin({ left: 10 })
    10. Image('/common/image/next.png').height(8).width(16)
    11. }
    12. .margin({ top: 20, bottom: 15 })
    13. List({ space: 15 }) {
    14. ForEach(horizontalVideos, item => {
    15. ListItem() {
    16. HorizontalItem({ imageSrc: item.image, source: item.source })
    17. }
    18. }, item => item.image.toString())
    19. }
    20. // 设置列表横向排列
    21. .listDirection(Axis.Horizontal)
    22. }
    23. .backgroundColor("#EEEEEE")
    24. .padding({ left: 15, top: 15, right: 15, bottom: 15 })
    25. }
    26. }
    27. ...
    28. @Component
    29. struct HorizontalItem {
    30. private imageSrc: string
    31. private source: string
    32. build() {
    33. Image(this.imageSrc)
    34. .width('80%')
    35. .height('25%')
    36. .onClick(() => {
    37. router.push({
    38. uri: 'pages/Play',
    39. params: { source: this.source }
    40. })
    41. })
    42. }
    43. }

    5)       整个index.ets文件的代码如下:

    1. import router from '@system.router';
    2. import {swiperVideos,horizontalVideos} from '../common/data/VideoData.ets'
    3. @Entry
    4. @Component
    5. struct Index {
    6. build() {
    7. Column() {
    8. //轮播组件
    9. Swiper(){
    10. ForEach(swiperVideos, item => {
    11. SwiperItem({ imageSrc: item.image, source: item.source })
    12. }, item => item.image.toString())
    13. }
    14. .autoPlay(true)
    15. .height(180)
    16. .itemSpace(15)
    17. //文本信息
    18. Flex({direction:FlexDirection.Row}){
    19. Text('Coming soon')
    20. .fontSize(20).fontWeight(FontWeight.Bold).margin({left:10})
    21. Image('/common/image/Record.png').height(8).width(16)
    22. }
    23. .margin({top:20, bottom:15})
    24. List({space:15}){
    25. ForEach(horizontalVideos, item =>{
    26. ListItem(){
    27. HorizontalItem({imageSrc:item.image,source:item.source})
    28. }
    29. },item => item.image.toString())
    30. }
    31. .listDirection(Axis.Horizontal)
    32. }
    33. .backgroundColor("#EEEEEE")
    34. .padding({ left: 15, top: 15, right: 15, bottom: 15 })
    35. }
    36. }
    37. @Component
    38. struct SwiperItem{
    39. private imageSrc:string
    40. private source:string
    41. build(){
    42. Navigator({target:'pages/Play',type:NavigationType.Push}){
    43. Image(this.imageSrc).objectFit(ImageFit.Cover)
    44. }
    45. .params({source:this.source})
    46. }
    47. }
    48. @Component
    49. struct HorizontalItem{
    50. private imageSrc:string
    51. private source:string
    52. build(){
    53. Image(this.imageSrc)
    54. .width('80%')
    55. .height('25%')
    56. .onClick(()=>{
    57. router.push({
    58. uri:'pages/Play',
    59. params:{source:this.source}
    60. })
    61. })
    62. }
    63. }

    6)       打开预览器看一下效果:

    8b08e3e8be1eb6cc5f4c38095943ae8d_433x753.gif%40900-0-90-f.gif

     

    欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh 

  • 相关阅读:
    数据结构和算法的笔记手写2
    在服务器上开Juypter Lab教程(远程访问)
    Tsinghua:Finding Skill Neurons in Pre-trained Transformer-based Language Models
    Linux下JAVA使用JNA调用C++的动态链接库(g++或者gcc编译的.so文件)
    MySQL必知必会_第十九~二十三章
    基于微信小程序电影交流平台源码成品(微信小程序毕业设计)
    你适合做自动化测试吗?
    以单颗CMOS摄像头重构三维场景,维悟光子发布单目红外3D成像模组
    SpringBoot:如何优雅地进行响应数据封装、异常处理?
    anaconda python 版本对应关系
  • 原文地址:https://blog.csdn.net/weixin_44708240/article/details/126155063