鸿蒙开发之ArkUI组件常用组件-CustomDialog/Video

CustomDialog

自定义弹窗(CustomDialog)可用于广告、中奖、警告、软件更新等与用户交互响应操作。我们可以通过CustomDialogController类显示自定义弹窗。

创建自定义弹窗
  • 使用@CustomDialog装饰器装饰自定义弹窗
  • @CustomDialog装饰器用于装饰自定义弹窗,此装饰器内进行自定义内容
@CustomDialog
struct CustomDialogDemo {
  controller:CustomDialogController
  build() {
    Column() {
      Text("这是弹窗")
        .fontSize(20)
        .margin({top:20,bottom:10})
      Text("这是自定义弹窗的内容。。。。")
        .fontSize(16)
        .margin({top:10,bottom:30})
    }
  }
}
  • 创建构造器,与装饰器呼应相连
 dialogController:CustomDialogController = new CustomDialogController({
    builder:CustomDialogDemo({})
  })
  • 点击与onClick事件绑定的组件使弹窗弹出
 Row() {
      Flex({justifyContent:FlexAlign.Center}){
        Button('显示弹窗')
          .onClick(() => {
            this.dialogController.open()
          })
      }.width('100%').position({x:0,y:200})
    }

显示的效果是:

弹窗交互

弹窗可用于数据交互,完成用户一系列响应操作。

假设有个删除记录的按钮,点击后有弹窗提示

  • 在@CustomDialog装饰器内添加按钮操作,同时添加数据函数的创建
@CustomDialog
struct CustomDialogDemo {
  controller:CustomDialogController
  cancel:() => void //取消的回调
  confirm:() => void //确认的回调
  build() {
    Column() {
      Text("温馨提示")
        .fontSize(20)
        .margin({top:20,bottom:10})
      Text("确认要删除吗?删除的话,无法恢复的哟")
        .fontSize(16)
        .margin({top:10,bottom:20})
      Row() {
        Button('取消').onClick(() => {
          this.controller.close() //关闭弹窗
          this.cancel() //回调取消
        }).backgroundColor(0xffffff)
          .fontColor(Color.Gray)
          .width('50%')
        Button('确定').onClick(()=> {
          this.controller.close()
          this.confirm()
        }).backgroundColor(0xffffff)
          .fontColor(Color.Red)
          .width('50%')
      }.margin({bottom:20})
    }
  }
}

  • 页面内需要在构造器内进行接收,同时创建相应的函数操作。
dialogController:CustomDialogController = new CustomDialogController({
    builder:CustomDialogDemo({
      cancel:this.cancelAction,
      confirm:this.confirmAction,
    }),
    alignment:DialogAlignment.Center //可设置dialog对齐方式,设定底部或中间
  })

 cancelAction() {
    console.log("点击了取消!!")
  }
  confirmAction() {
    console.log("点击了确认删除")
  }

效果

Video

Video组件用于播放视频文件并控制其播放状态,常用于为短视频应用和应用内部视频的列表页面。当视频完整出现时会自动播放,用户点击视频区域则会暂停播放,同时显示播放进度条,通过拖动播放进度条指定视频播放到具体位置。

创建视频组件

Video(value: {src?: string | Resource, currentProgressRate?: number | string | PlaybackSpeed, previewUri?: string | PixelMap | Resource, controller?: VideoController})

该接口用于创建视频播放组件。其中,src指定视频播放源的路径,加载方式请参考加载视频资源,currentProgressRate用于设置视频播放倍速,previewUri指定视频未播放时的预览图片路径,controller设置视频控制器,用于自定义控制视频。

倍速枚举值

加载视频资源

Video组件支持加载本地视频和网络视频。

1.加载本地视频

  • 加载普通视频

加载本地视频时,首先在本地rawfile目录指定对应的文件,如下图所示。

使用资源访问符$rawfile()引用视频资源

@Entry
@Component
struct VideoPage {
  @State message: string = 'Hello World'
  private controller:VideoController
  private previewUril:Resource = $r('app.media.preview')
  private  videoRes:Resource = $rawfile('test.mp4')
  build() {
    Row() {
      Column() {
       Video({
         src:this.videoRes,
         previewUri:this.previewUril,
         controller:this.controller
       }).height('30%')
      }
      .width('100%')
    }
    .height('100%')
  }
}

  • Data Ability提供的视频路径带有dataability://前缀,使用时确保对应视频资源存在即可。

2.加载沙箱路径视频

支持file:///data/storage路径前缀的字符串,用于读取应用沙箱路径内的资源。需要保证应用沙箱目录路径下的文件存在并且有可读权限。

3.加载网络视频

加载网络视频时,需要申请权限ohos.permission.INTERNET,具体申请方式请参考权限申请声明。此时,Video的src属性为网络视频的链接。

属性

Video组件属性主要用于设置视频的播放形式。例如设置视频播放是否静音、播放时是否显示控制条等。

事件

@Entry
@Component
struct VideoPlayer{
  private controller:VideoController;
  private previewUris: Resource = $r ('app.media.preview');
  private innerResource: Resource = $rawfile('videoTest.mp4');
  build(){
    Column() {
      Video({
        src: this.innerResource,
        previewUri: this.previewUris,
        controller: this.controller
      })
        .onUpdate((event) => {   //更新事件回调
          console.info("Video update.");
        })
        .onPrepared((event) => {  //准备事件回调
          console.info("Video prepared.");
        })
        .onError(() => {          //失败事件回调
          console.info("Video error.");
        })
    }
  }
}
VideoController的使用

Video控制器主要用于控制视频的状态,包括播放、暂停、停止以及设置进度等,详细的使用请参考VideoController使用说明。

默认的控制器支持视频的开始、暂停、进度调整、全屏显示四项基本功能。

自定义控制器

使用自定义的控制器,先将默认控制器关闭掉,之后可以使用button以及slider等组件进行自定义的控制与显示,适合自定义较强的场景下使用。

@Entry
@Component
struct VideoPage {
  @State message: string = 'Hello World'
  private previewUril:Resource = $r('app.media.preview')
  private  videoRes:Resource = $rawfile('test.mp4')
  @State curRate: PlaybackSpeed = PlaybackSpeed.Speed_Forward_1_00_X
  @State isAutoPlay: boolean = false
  @State showControls: boolean = true
  @State sliderStartTime: string = '';
  @State currentTime: number = 0;
  @State durationTime: number = 0;
  @State durationStringTime: string ='';
  controller: VideoController = new VideoController()
  build() {
    Row() {
      Column() {
       Video({
         src:this.videoRes,
         previewUri:this.previewUril,
         controller:this.controller,
         currentProgressRate: this.curRate,
       }).controls(false).autoPlay(true) //关闭默认控制器
         .onPrepared((event)=>{
           this.durationTime = event.duration
         })
         .onUpdate((event)=>{
           this.currentTime =event.time
         })
         .height('30%')
        Row() {
          Text(JSON.stringify(this.currentTime) + 's').padding({left:5})
          Slider({
            value: this.currentTime,
            min: 0,
            max: this.durationTime
          })
            .onChange((value: number, mode: SliderChangeMode) => {
              this.controller.setCurrentTime(value);
            }).width("85%")
          Text(JSON.stringify(this.durationTime) + 's').margin({right:5})
        }
        .opacity(0.9)
        .width("100%")
      }
      .width('100%')
    }
    .height('100%')
  }
}

Video组件已经封装好了视频播放的基础能力,开发者无需进行视频实例的创建,视频信息的设置获取,只需要设置数据源以及基础信息即可播放视频,相对扩展能力较弱。如果开发者想自定义视频播放,还请参考媒体系统播放音视频

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vuepress 2从0-1保姆级进阶教程——美化与模板

Vuepress 2 专栏目录 1. 入门阶段 Vuepress 2从0-1保姆级入门教程——环境配置篇Vuepress 2从0-1保姆级入门教程——安装流程篇Vuepress 2从0-1保姆级入门教程——文档配置篇Vuepress 2从0-1保姆级入门教程——范例与部署 2.进阶阶段 Vuepress 2从0-1保姆级进阶教程——全文搜索…

【Java程序设计】【C00388】基于(JavaWeb)Springboot的校园竞赛管理系统(有论文)

Springboot的校园竞赛管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,博客…

基于ZHW3548的红外额温枪解决方案

红外额温枪,非接触式测量最典型的方法是红外测温。自红外辐射原理被发现以来,红外技术被广泛应用在温度测量中。红外测温仪具有测温范围广,响应速度快,灵敏度高等特点。红外耳温枪、红外额温计和红外筛检仪都属于非接触式体温计。…

实验3 中文分词

必做题: 数据准备:academy_titles.txt为“考硕考博”板块的帖子标题,job_titles.txt为“招聘信息”板块的帖子标题,使用jieba工具对academy_titles.txt进行分词,接着去除停用词,然后统计词频,最…

鱼眼相机的测距流程及误差分析[像素坐标系到空间一点以及测距和误差分析]

由于最近在整理单目测距的内容,顺手也总结下鱼眼相机的测距流程和误差分析,如果有错误,还请不吝赐教。 参考链接: 鱼眼镜头的成像原理到畸变矫正(完整版) 相机模型总结(针孔、鱼眼、全景) 三维…

Linux 基础IO [缓冲区文件系统]

💓博主CSDN主页:麻辣韭菜-CSDN博客💓   ⏩专栏分类:http://t.csdnimg.cn/G90eI⏪   🚚代码仓库:Linux: Linux日常代码练习🚚   🌹关注我🫵带你学习更多Linux知识   🔝 目录 前言…

HarmonyOS实战开发-实现自定义弹窗

介绍 本篇Codelab基于ArkTS的声明式开发范式实现了三种不同的弹窗,第一种直接使用公共组件,后两种使用CustomDialogController实现自定义弹窗,效果如图所示 相关概念 AlertDialog:警告弹窗,可设置文本内容和响应回调…

Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(三)

概览 承接上一篇博文: Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(二)我们在其中讨论了如何使用第三方强大通用的钩子库 SwiftHook 来协助我们完成 NSObject 构造器 init 的 SWIZZ 操作。我们还讨论了为什么用 print 打印对象信息时会发生崩溃…

在Windows系统上安装多个 Nodejs

前言 在Windows系统安装Nodejs 在Windows系统上安装多个 Nodejs v14.16.1安装位置 D:\sde\nodejs\node-v14.16.1-win-x64 v16.20.2安装位置 D:\sde\nodejs\node-v16.20.2-win-x64 v18.20.0安装位置 D:\sde\nodejs\node-v18.20.0-win-x64 v20.12.0安装位置 D:\sde\nod…

YOLOv9改进策略 :neck优化 | 路径融合GFPN,小目标到大目标一网打尽 | 轻骨干重Neck的轻量级目标检测器GiraffeDet

💡💡💡本文改进内容:设计了一种新的路径融合GFPN:包含跳层与跨尺度连接,改进思路来自ICLR2022 GiraffeDet的核心思想。 💡💡💡GFPN和六个检测头结合,这种跳层…

集体出走的Stability AI 发布全新代码大模型,3B以下性能最优,超越Code Llama和DeepSeek-Coder

Stability AI又有新动作!程序员又有危机了? 3月26日,Stability AI推出了先进的代码语言模型Stable Code Instruct 3B,该模型是在Stable Code 3B的基础上进行指令调优的Code LM。 Stability AI 表示,Stable Code Instru…

【python】flask执行上下文context,请求上下文和应用上下文原理解析

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

2024河北石家庄矿业矿山展览会|河北智慧矿山展会|河北矿博会

2024中国(石家庄)国际矿业博览会      时间:2024年7月4-6日 地点:石家庄国际会展中心.正定      随着全球经济的持续增长和矿产资源需求的不断攀升,矿业行业正迎来前所未有的发展机遇。作为矿业领域的盛会&…

3.28C++

复数类的实现&#xff0c;写出三种构造函数&#xff0c;算术运算符、关系运算符、逻辑运算符重载尝试实现自增、自减运算符的重载 #include <iostream> using namespace std; class Num {int rel; //实部int vir; //虚部 public:Num():rel(2),vir(1){}Num(int rel,…

确保未来安全:应对云安全的复杂性

云是业务运营的重要组成部分&#xff0c;它改变了组织扩展、创新和适应的方式。然而&#xff0c;其影响力日益增长的广度和深度不仅仅局限于商业领域。云环境是我们日常生活中不可或缺的一部分&#xff0c;负责存储和传输全球平民最敏感的数据。随着大量企业和个人利用云&#…

【C语言】编译和链接----从源代码到可执行程序的转换【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为【C语言】文件操作揭秘&#xff1a;C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言 欢迎来到本篇博客&…

最小化安装Kubesphere报错问题解决方法

最小化安装Kubesphere报错: TASK [preinstall : Stop if defaultStorageClass was not found] ****************** fatal: [localhost]: FAILED! > {"assertion": "\"(default)\" in default_storage_class_check.stdout", "changed&qu…

数据结构进阶篇 之 【二叉树链序存储】的整体实现讲解

封建迷信我嗤之以鼻&#xff0c;财神殿前我长跪不起 一、二叉树链式结构的实现 1.二叉树的创建 1.1 手动创建 1.2 前序递归创建 2.二叉树的遍历 2.1 前序&#xff0c;中序以及后序遍历概念 2.2 层序遍历概念 2.3 前序打印实现 2.4 中序打印实现 2.4 后序打印实现 2.…

SnapGene 5 for Mac 分子生物学软件

SnapGene 5 for Mac是一款专为Mac操作系统设计的分子生物学软件&#xff0c;以其强大的功能和用户友好的界面&#xff0c;为科研人员提供了高效、便捷的基因克隆和分子实验设计体验。 软件下载&#xff1a;SnapGene 5 for Mac v5.3.1中文激活版 这款软件支持DNA构建和克隆设计&…

Linux_进程概念_冯诺依曼_进程概念_查看进程_获取进程pid_创建进程_进程状态_进程优先级_环境变量_获取环境变量三种方式_3

文章目录 一、硬件-冯诺依曼体系结构二、软件-操作系统-进程概念0.操作系统做什么的1.什么叫做进程2.查看进程3.系统接口 获取进程pid- getpid4.系统接口 获取父进程pid - getppid5.系统接口 创建子进程 - fork1、手册2、返回值3、fork做了什么4、基本用法 6.进程的状态1、进程…