【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文件夹中添加视频,代码中的文件路径替换由读者自行替换。
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开发 简易视频播放器的更多相关文章
- C语言基于GTK+Libvlc实现的简易视频播放器
		
小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢~小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文.简易 ...
 - C语言基于GTK+Libvlc实现的简易视频播放器(二)
		
简易视频播放器-全屏播放 一.课程说明 上一次我们使用gtk+libvlc实现了一个最简单的视频播放器,可以实现点击按钮暂定和停止播放视频,以及同步显 示视频播放进度,但即使作为一个视频播放器,只有这 ...
 - Android本地视频播放器开发--简易播放器原型
		
在以前的基础上,将音视频进行合并,音频播放采用OpenSL ES,视频播放采用OpenGL ES2.0进行显示,这次的版本其中音频和视频是在同一个线程,会造成音频断断续续,后续会采用音频使用SDL,视 ...
 - 简易视频播放器2 (基于Qt、opencv)
		
因项目需要,需要实现一个对以保存的监测视频快速查看功能. 查询网上一些资料,初步简易的实现了一下. 实际效果图: 该程序基于Qt5.4,opencv248,开发环境为win8.1 结构为: video ...
 - ios开发 MPMoviePlayerController 视频播放器
		
项目中用到视频播放功能, 写点视频基础部分 MPMoviePlayerController是通过MediaPlayer.frame引入的,可用于播放在iOS支持的所有格式的视频,用起来很简单!!! M ...
 - FFmpeg简易播放器的实现-视频播放
		
本文为作者原创:https://www.cnblogs.com/leisure_chn/p/10047035.html,转载请注明出处 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
 - FFmpeg简易播放器的实现-音视频播放
		
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10235926.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
 - FFmpeg简易播放器的实现-音视频同步
		
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
 - FFmpeg简易播放器的实现-音频播放
		
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10068490.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
 
随机推荐
- 脚踏实地的Netty源码研究笔记——开篇
			
1. 脚踏实地的Netty源码研究笔记--开篇 1.1. Netty介绍 Netty是一个老牌的高性能网络框架.在众多开源框架中都有它的身影,比如:grpc.dubbo.seata等. 里面有着非常多 ...
 - nodejs使用 svg-captcha 做验证码及验证
			
一.需求 使用 nodejs 做后端开发,需要请求验证码,在 github 上看到了 svg-captcha 这个库,发现他是将 text 转 svg 进行返回的,安全性也有保证,不会被识别成文字. ...
 - HTML表格以及表单
			
学习内容: 1.HTML表格 代码实例: <%@ page language="java" import="java.util.*" pageEncodi ...
 - 配置中心Nacos(服务发现)
			
服务演变之路 单体应用架构 在刚开始的时候,企业的用户量.数据量规模都⽐较⼩,项⽬所有的功能模块都放在⼀个⼯程中编码.编译.打包并且部署在⼀个Tomcat容器中的架构模式就是单体应用架构,这样的架构既 ...
 - 内网穿透frp教程  windows远程桌面连接
			
鉴于ngrok不是特别好用 昨天又发现frp这个神器 在管理端还有图形界面十分友好 话不多说开始 准备工作 1.一个域名 2.一台服务器 一.域名与服务器 域名和服务器直接买就好咯 价格不高 一定要在 ...
 - JS基础6--逻辑运算符
			
&&与 ||或 !非 如果对一个值进行两次取反,它不会变化 如果对一个非布尔值进行取反,则会将其转换为布尔值,再取反 所以我们可以利用该特点.来将 ...
 - BitBlt()函数实现带数字百分比进度条控件、静态文本(STATIC)控件实现的位图进度条、自定义进度条控件实现七彩虹颜色带数字百分比
			
Windows API BitBlt()函数实现带数字百分比进度条控件. 有两个例子:一用定时器实现,二用多线程实现. 带有详细注解. 此例是本人原创,绝对是网上稀缺资源(本源码用Windows AP ...
 - NODE.JS exports require理解
			
node.js exports 的作用是什么? 因为A.js文件想访问B.js文件中的类或函数,是不能直接访问的.为了解决这个问题 node.js 产生了 exports ,exports 实际可以理 ...
 - 技术分享 | app自动化测试(Android)--App 控件交互
			
原文链接 常用操作 点击操作 通常获取到元素之后,可以调用 click() 方法来实现对这个元素的点击操作.示例代码如下: python 版本 driver.find_element_by_id(&q ...
 - 【Java面试】TCP协议为什么要设计三次握手?
			
一个工作5年的粉丝,最近去面试了很多公司,每次都被各种技术原理题问得语无伦次. 由于找了快1个月时间的工作,有点焦虑,来向我求助. 我能做的只是保证每天更新一个面试题,然后问他印象最深刻的一个面试题是 ...