前言:这一次我们来使用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文件夹中添加视频,代码中的文件路径替换由读者自行替换。

const localSource: string = "/common/video/video1.mp4";
const webSource: string = "https://ss0.bdstatic.com/-0U0bnSm1A5BphGlnYG/cae-legoup-video-target/93be3d88-9fc2-4fbd-bd14-833bca731ca7.mp4"; export const swiperVideos:any[] = [
{
"image":'/common/image/video_ad0.jpg',
"source":localSource
},
{
"image":'/common/image/video_ad1.jpg',
"source":localSource
},
{
"image":'/common/image/video_ad2.jpg',
"source":localSource
}
] export const horizontalVideos:any[] = [
{
"image":'/common/image/video_list0.jpg',
"source":webSource
},
{
"image":'/common/image/video_list1.jpg',
"source":webSource
},
{
"image":'/common/image/video_list2.jpg',
"source":webSource
}
]

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

import router from '@system.router';

import {swiperVideos,horizontalVideos} from '../common/data/VideoData.ets'

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

@Entry

@Component

struct Index {

  build() {

    Column() {

      Swiper() {

        ForEach(swiperVideos, item => {

          SwiperItem({ imageSrc: item.image, source: item.source })

        }, item => item.image.toString())

      }

      .autoPlay(true)

      .height(180)

      .itemSpace(15)

    }

    .backgroundColor("#EEEEEE")

    .padding({ left: 15, top: 15, right: 15, bottom: 15 })

  }

}

@Component

struct SwiperItem {

  private imageSrc: string

  private source: string

  build() {

    Navigator({ target: 'pages/Play', type: NavigationType.Push }) {

      Image(this.imageSrc).objectFit(ImageFit.Cover)

    }

    .params({ source: this.source })

  }

}

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

@Entry 

@Component 

struct Index { 

  build() { 

    Column() { 

     ... 

      Flex({ direction: FlexDirection.Row }) { 

        Text('Coming soon') 

          .fontSize(20).fontWeight(FontWeight.Bold).margin({ left: 10 }) 

        Image('/common/image/next.png').height(8).width(16) 

      } 

      .margin({ top: 20, bottom: 15 }) 

      List({ space: 15 }) { 

        ForEach(horizontalVideos, item => { 

          ListItem() { 

            HorizontalItem({ imageSrc: item.image, source: item.source }) 

          } 

        }, item => item.image.toString()) 

      } 

      // 设置列表横向排列 

      .listDirection(Axis.Horizontal) 

    } 

    .backgroundColor("#EEEEEE") 

    .padding({ left: 15, top: 15, right: 15, bottom: 15 }) 

  } 

} 

... 

@Component 

struct HorizontalItem { 

  private imageSrc: string 

  private source: string 

  build() { 

    Image(this.imageSrc) 

      .width('80%') 

      .height('25%') 

      .onClick(() => { 

        router.push({ 

          uri: 'pages/Play', 

          params: { source: this.source } 

        }) 

      }) 

  } 

}

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

import router from '@system.router';

import {swiperVideos,horizontalVideos} from '../common/data/VideoData.ets'

@Entry

@Component

struct Index {

  build() {

    Column() {

      //轮播组件

      Swiper(){

        ForEach(swiperVideos, item => {

          SwiperItem({ imageSrc: item.image, source: item.source })

        }, item => item.image.toString())

      }

      .autoPlay(true)

      .height(180)

      .itemSpace(15)

      //文本信息

      Flex({direction:FlexDirection.Row}){

        Text('Coming soon')

        .fontSize(20).fontWeight(FontWeight.Bold).margin({left:10})

        Image('/common/image/Record.png').height(8).width(16)

      }

      .margin({top:20, bottom:15})

      List({space:15}){

        ForEach(horizontalVideos, item =>{

          ListItem(){

            HorizontalItem({imageSrc:item.image,source:item.source})

          }

        },item => item.image.toString())

      }

      .listDirection(Axis.Horizontal)

    }

    .backgroundColor("#EEEEEE")

    .padding({ left: 15, top: 15, right: 15, bottom: 15 })

  }

}

@Component

struct SwiperItem{

  private imageSrc:string

  private source:string

  build(){

    Navigator({target:'pages/Play',type:NavigationType.Push}){

      Image(this.imageSrc).objectFit(ImageFit.Cover)

    }

    .params({source:this.source})

  }

}

@Component

struct HorizontalItem{

  private imageSrc:string

  private source:string

  build(){

    Image(this.imageSrc)

    .width('80%')

    .height('25%')

    .onClick(()=>{

      router.push({

        uri:'pages/Play',

        params:{source:this.source}

      })

    })

  }

}

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

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

【Harmony OS】【ArkUI】ets开发 简易视频播放器的更多相关文章

  1. C语言基于GTK+Libvlc实现的简易视频播放器

    小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢~小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文.简易 ...

  2. C语言基于GTK+Libvlc实现的简易视频播放器(二)

    简易视频播放器-全屏播放 一.课程说明 上一次我们使用gtk+libvlc实现了一个最简单的视频播放器,可以实现点击按钮暂定和停止播放视频,以及同步显 示视频播放进度,但即使作为一个视频播放器,只有这 ...

  3. Android本地视频播放器开发--简易播放器原型

    在以前的基础上,将音视频进行合并,音频播放采用OpenSL ES,视频播放采用OpenGL ES2.0进行显示,这次的版本其中音频和视频是在同一个线程,会造成音频断断续续,后续会采用音频使用SDL,视 ...

  4. 简易视频播放器2 (基于Qt、opencv)

    因项目需要,需要实现一个对以保存的监测视频快速查看功能. 查询网上一些资料,初步简易的实现了一下. 实际效果图: 该程序基于Qt5.4,opencv248,开发环境为win8.1 结构为: video ...

  5. ios开发 MPMoviePlayerController 视频播放器

    项目中用到视频播放功能, 写点视频基础部分 MPMoviePlayerController是通过MediaPlayer.frame引入的,可用于播放在iOS支持的所有格式的视频,用起来很简单!!! M ...

  6. FFmpeg简易播放器的实现-视频播放

    本文为作者原创:https://www.cnblogs.com/leisure_chn/p/10047035.html,转载请注明出处 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  7. FFmpeg简易播放器的实现-音视频播放

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10235926.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  8. FFmpeg简易播放器的实现-音视频同步

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  9. FFmpeg简易播放器的实现-音频播放

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10068490.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

随机推荐

  1. Windows 程序安装与更新方案: Clowd.Squirrel

    我的Notion Clowd.Squirrel Squirrel.Windows 是一组工具和适用于.Net的库,用于管理 Desktop Windows 应用程序的安装和更新. Squirrel.W ...

  2. 《HALCON数字图像处理》第六章笔记

    目录 第六章 图像增强 图像增强的概念和分类 灰度变换 直方图处理 图像的平滑 图像的锐化 图像的彩色增强 我在Gitee上建了个仓库,会将学习书本的时候打的一些代码上传上去,笔记中所有代码都在仓库里 ...

  3. ExtJS 布局-Column布局(Column layout)

    更新记录: 2022年6月1日 开始. 2022年6月4日 发布. 1.说明 使用列布局,可以将容器拆分为特定大小的列,并将子组件放置在这些列中. 可以设置子组件宽度值为: 百分比(相对父容器宽度) ...

  4. .NET中获取Windows的常见路径

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年6月30日. 一.说明 每种平台都其预定义的规则,比如Windows平台有自己的规定.公司也有预定义的规章制度.那么在平台上开发和干活 ...

  5. Snowflake(雪花算法),什么情况下会冲突?

    文章首发在公众号(龙台的技术笔记),之后同步到博客园和个人网站:xiaomage.info 分布式系统中,有一些需要使用全局唯一 ID 的场景,这种时候为了防止 ID 冲突可以使用 36 位的 UUI ...

  6. RocketMQ事务消息机制

    1.half消息对消费者不可见,用于确定MQ服务正常. 2.MQ响应half消息. 3.生产者执行本地事务. 4.生产者发送具体消息+本地事务状态,MQ根据本地事务状态执行Commit或者Rollba ...

  7. 命令行工具tabby--gi t仓库Token的使用

    命令行工具tabby--git仓库Token的使用 欢迎关注H寻梦人公众号 前言 再见 Xshell !这款开源的终端工具逼格更高! 终端神器--Tabby Terminal electerm is ...

  8. bat-配置环境变量

    查看环境变量 set 查看当前所有变量 set path 查看变量path的值 echo %xxx% 查看某一个环境变量 临时设置环境变量 set xxx=xxx set xxx= 永久设置环境变量 ...

  9. java请求登录接口代码示例

    前言 近期研究如何利用java代码如何获取其他系统中所需的数据,自己总结的方法如下: 1.工具类代码 /** * <pre> * 方法体说明:向远程接口发起请求,返回字符串类型结果 * @ ...

  10. 如何将 DevSecOps 引入企业?

    前 言 现如今,大部分企业已经在内部实现了 DevOps 实践.DevOps 为团队提供了交付可靠软件和快速更新的方法论.这种方法让团队更专注于质量而不是将时间浪费在运维上.然而,结果是,安全实践往往 ...