鸿蒙(HarmonyOS)应用开发—— video组件实操

news2024/12/26 10:59:28

video 组件

harmonyOS 系统提供了基础的video。下面就直接上代码

原始video

新建项目 customVideo项目

在这里插入图片描述

本地视频

网络地址,就不用说明,只需要把地址换成网络地址即可
在resource 文件夹下的rawfile文件夹下 添加视频
在这里插入图片描述

在index.ets

在这里插入图片描述

  Video({src:$rawfile("videoTest.mp4")})
        .height("30%")

呈现的效果

在这里插入图片描述

新闻类/课程类视频

引入背景图片

在resource 文件下的base——media 中添加进背景图
在这里插入图片描述
添加背景图属性

    Column(){
      Flex() {
        Video({src:$rawfile("videoTest.mp4"),previewUri:$r('app.media.preview')})
          .height("30%")


      }
      Flex(){
        Text("sss")
      }
    }

呈现效果

在这里插入图片描述

自定义播放栏

新建VideoSlider.ets

@Component
export struct VideoSlider {
  @Consume isOpacity: boolean;
  private controller: VideoController = new VideoController();
  @Consume currentStringTime: string;
  @Consume currentTime: number;
  @Consume durationTime: number;
  @Consume durationStringTime: string;
  @Consume isPlay: boolean;
  @Consume flag: boolean;
  @Consume isLoading: boolean;
  @Consume progressVal: number;

  build() {
    Row({ space: MARGIN_FONT_SIZE.FIRST_MARGIN }) {
      Image(this.isPlay ? $r('app.media.ic_pause') : $r('app.media.ic_play'))
        .width(IMAGE_SIZE)
        .height(IMAGE_SIZE)
        .margin({ left: MARGIN_FONT_SIZE.FIRST_MARGIN })
        .onClick(() => {
          this.iconOnclick();
        })
      Text(this.currentStringTime)
        .fontSize(MARGIN_FONT_SIZE.SECOND_MARGIN)
        .fontColor(Color.White)
        .margin({ left: MARGIN_FONT_SIZE.FIRST_MARGIN })
      Slider({
        value: this.currentTime,
        min: 0,
        max: this.durationTime,
        step: 1,
        style: SliderStyle.OutSet
      })
        .blockColor($r('app.color.white'))
        .width(STRING_PERCENT.SLIDER_WITH)
        .trackColor(Color.Gray)
        .selectedColor($r("app.color.white"))
        .showSteps(true)
        .showTips(true)
        .trackThickness(this.isOpacity ? SMALL_TRACK_THICK_NESS : BIG_TRACK_THICK_NESS)
        .onChange((value: number, mode: SliderChangeMode) => {
          this.sliderOnchange(value, mode);
        })
      Text(this.durationStringTime)
        .fontSize(MARGIN_FONT_SIZE.SECOND_MARGIN)
        .margin({ right: MARGIN_FONT_SIZE.FIRST_MARGIN })
        .fontColor(Color.White)
    }
    .opacity(this.isOpacity ? DEFAULT_OPACITY : 1)
    .width(ALL_PERCENT)
    .alignItems(VerticalAlign.Center)
    .justifyContent(FlexAlign.Center)
  }

  /**
   * icon onclick callback
   */
  iconOnclick() {
    if (this.isPlay === true) {
      this.controller.pause()
      this.isPlay = false;
      this.isOpacity = false;
      return;
    }
    if (this.flag === true) {
      this.controller.start();
      this.isPlay = true;
      this.isOpacity = true;
    } else {
      this.isLoading = true;
      // The video loading is not complete. The loading action is displayed.
      let intervalLoading = setInterval(() => {
        if (this.progressVal >= STACK_STYLE.PROGRESS_TOTAL) {
          this.progressVal = 0;
        } else {
          this.progressVal += STACK_STYLE.PROGRESS_STEP;
        }
      }, STACK_STYLE.MILLI_SECONDS)
      // The scheduled task determines whether the video loading is complete.
      let intervalFlag = setInterval(() => {
        if (this.flag === true) {
          this.controller.start();
          this.isPlay = true;
          this.isOpacity = true;
          this.isLoading = false;
          clearInterval(intervalFlag);
          clearInterval(intervalLoading);
        }
      }, STACK_STYLE.MILLI_SECONDS);
    }
  }

  /**
   * video slider component onchange callback
   */
  sliderOnchange(value: number, mode: SliderChangeMode) {
    this.currentTime = Number.parseInt(value.toString());
    this.controller.setCurrentTime(Number.parseInt(value.toString()), SeekMode.Accurate);
    if (mode === SliderChangeMode.Begin || mode === SliderChangeMode.Moving) {
      this.isOpacity = false;
    }
    if (mode === SliderChangeMode.End) {
      this.isOpacity = true;
    }
  }
}
 private controller : VideoController;

Flex() {
        Video({src:$rawfile("videoTest.mp4"),previewUri:$r('app.media.preview')})
          .height("30%")
          .controls(false)
        VideoSlider({ controller: this.controller })

      }

呈现效果

在这里插入图片描述

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

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

相关文章

C++数据结构——二叉搜索树详解

目录 一,关于二叉搜索树 1.1 概念 1.2 基本结构 二,二叉搜索树接口实现 2.1 插入 2.2 查找 2.3 打印 2.4* 删除 三,二叉搜索树接口递归实现 3.1 查找 3.2 插入 3.3 删除 四,二叉搜索树的默认成员函数 五,…

一篇文章带你了解各个程序员接单平台,让你选择不再迷茫!!!

相信现在很多程序员都已经走上了或者准备走上网上接单这条路,但是目前市面上的接单平台可谓五花八门,对于各个平台的优缺点,不同的程序员该如何选择适合自己的接单平台,你又是否了解呢? 接下来就让小编用一篇文章来为…

定位咨询:企业市场竞争中的定海神针

什么是定位咨询?定位咨询能给企业带来什么帮助?在现代市场的激烈竞争中,定位咨询不仅是企业区分自己的重要工具,更是它们赢得市场份额的关键。以下是定位咨询的定义和几个核心方面,笔者将列举具体案例说明其重要性和实用性。 定位咨询的简单…

python接口自动化测试--requests使用和基本方法封装

之前学习了使用jmeterant做接口测试,并实现了接口的批量维护管理(大概500多条用例),对“接口”以及“接口测试”有了一个基础了解,最近找了一些用python做接口测试的资料,一方面为了学习下如何使用python进行接口测试(如何做出一个…

券商期权手续费现在最低多少钱一张?怎么调低最方便

券商期权手续费是指您在证券公司开设期权账户并进行期权交易时,需要向券商支付的费用。券商期权手续费主要包括以下三个部分: 中国结算费用:这是中国证券登记结算有限责任公司向期权交易者收取的费用,固定为每张合约0.3元&#x…

GPT-4V with Emotion:A Zero-shot Benchmark forMultimodal Emotion Understanding

GPT-4V with Emotion:A Zero-shot Benchmark forMultimodal Emotion Understanding GPT-4V情感:多模态情感理解的zero-shot基准 1.摘要 最近,GPT-4视觉系统(GPT-4V)在各种多模态任务中表现出非凡的性能。然而,它在情感识别方面的功效仍然是个问题。本文定…

Crocoddyl: 多接触最优控制的高效多功能框架

系列文章目录 前言 我们介绍了 Crocoddyl(Contact RObot COntrol by Differential DYnamic Library),这是一个专为高效多触点优化控制(multi-contact optimal control)而定制的开源框架。Crocoddyl 可高效计算给定预定…

将yolo格式转化为voc格式:txt转xml(亲测有效)

1.文件目录如下所示: 对以上目录的解释: 1.dataset下面的image文件夹:里面装的是数据集的原图片 2.dataset下面的label文件夹:里面装的是图片对应得yolo格式标签 3.dataset下面的Annotations文件夹:这是一个空文件夹&…

通过与 Team Finance 整合,Casper Network 让 Token 的创建、部署更加高效

随着 Team Finance 整合到 Casper 系统中,Token 创建的过程变得更加迅速而简便。Casper Network 的方案正在使代币的创建变得易于访问与调整,这将让任何有创意和业务理念的人能够以高效、可信的方式,更快速、安全地在 Casper 上推出他们的项目…

程序流程图的意义(合集)

程序流程图的意义 1、矩形 作用:一般用作要执行的处理(process),在程序流程图中做执行框。 在axure中如果是画页面框架图,那么也可以指代一个页面。有时候我们会把页面和执行命令放在同一个流程中做说明,这个时候将两类不同的矩形…

关于设计师的自我评价(合集)

设计师的自我评价篇一 本人接受过正规的美术教育,具有较好的美术功底及艺术素养,能够根据公司的需要进行设计制作,熟练掌握多种电脑制作软件,能够高效率地完成工作。本人性格开朗、思维活跃、极富创造力,易于沟通&…

internet download manager 6.42怎么删除卸载,2024最新idm卸载不干净怎么解决

internet download manager 6.42简称为IDM,这是一款非常好用的下载软件,很多小伙伴都在使用。如果后续我们不再需要使用该软件,小伙伴们知道具体该如何将其卸载掉吗,其实卸载方法是非常简单的,只需要进行几个非常简单的…

乐理基础-弱起小节、弱起

弱起小节的定义: 1.音乐不是从强拍开始的,是从弱拍或次强拍开始的。 2.弱起小节会省去前面没有音乐的部分,它是不完整的小节,它的拍数是不够的。如图1 弱起小节的作用: 强拍经常要作为 和弦出现 和 变化的地方&#xf…

减速机振动相关标准 - 笔记

参考标准:国家标准|GB/T 39523-2020 减速机的振动标准与发动机不同,摘引: 原始加速度传感器波形 可以明显看到调幅波 它的驱动电机是300Hz~2000Hz范围的。这个采样时间是5秒,看分辨率至少1024线。可分出500条谱线。 频谱部分 …

算法(2)——滑动窗口

前言: 步骤及算法模板: 确定两个指针变量,left0,right0; 进窗口: 判断: 出窗口 更新结果 接下来我们的所用滑动窗口解决问题都需要以上几个步骤。 一、长度最小的子数组 209. 长度最小的子数组 - 力扣(L…

VR党建:VR全景技术如何助力党建知识传播

导语: 随着科技的不断发展,虚拟现实技术逐渐深入人们生活的方方面面。VR全景技术作为一种全新的沉浸式体验方式,被广泛应用于娱乐、教育、医疗等领域。而在党建学习中,VR全景技术也展现出了巨大的潜力,成为了一种创新…

23.会话技术

概述 提出问题 HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的 ,浏览器的每一次请求都是完全孤立的 怎么才能实现网上商店中的购物车呢:某个用户从网站的登录页面登入后,再进入购物页面购物时…

P58 生成式对抗网络(GAN)

Generator network as generator x 和 z 同时作为 network的输入 z服从一定的简单分布 生成复杂分布的y 为什么要训练 generator , 为什么输出是要一个分布? 为了适应一些具有创造性的任务 ,答案有多种可能。比如打游戏可能向左。可能向右。 加入一个…

AWS RDS慢日志文件另存到ES并且每天发送邮件统计慢日志

1.背景:需要对aws rds慢日志文件归档到es,让开发能够随时查看。 2.需求:并且每天把最新的慢日志,过滤最慢的5条sql 发送给各个产品线的开发负责人。 3.准备: aws ak/sk ,如果rds 在不同区域需要认证不同的…

Linux软件管理rpm和yum

rpm方式管理 rpm软件包名称: 软件名称 版本号(主版本、次版本、修订号) 操作系统 -----90%的规律 #有依赖关系,不能自动解决依赖关系。 举例:openssh-6.6.1p1-31.el7.x86_64.rpm 数字前面的是名称 数字是版本号:第一位主版本号,第二位次版本…