今时今日,不管是大人,还是小孩,都喜欢刷视频,生活中刷视频的 app 也多得是,如:抖音,快手,视频号,今日头条,火山…数也不数不清了。
然而华为论坛鸿蒙版块搞活动,做一个属于自己的视频应用,说真的,看到这个活动我很开心,又可以用所学的鸿蒙知识来做一个小应用了!
看了小提示,都是 js 组件来实现的,当我看到分布式也可以用 js 来写时,当时觉得 js 也太强大了,因为之前写的 demo 都是用 java 来写分布式的。
本人工作也是从事 java 后台开发,对于 js 前端知识,也就是入门级水平,然后就在想是用 java 来写这个视频应用,还是用 js 来写呢。
通过看了 js 参考 api 实例后,决定使用 js 来写,简单易懂,同时也希望现在还在观望鸿蒙应用开发的前端开发人员,不要怕自己不会 java 开发,而一直在观望,没有踏出第一步来写 demo。
我写的这个视频应用取名为“爱视频” ,99% 是用 js 前端知识完成的,只有 1% 的 java 代码是复制过来的,也就是动态授权代码,所以希望还在观望的前端开发者,就从这个爱视频 app 开始你们的第一个鸿蒙应用吧!
实现效果
创建工程
在这当作你已经安装好最新版本 deveco-studio 开发工具,点击 file→new→new project…弹出 create harmonyos project 窗口。
这里我选择空白 js 模板创建,写界面还是 js 比较方便些,对于有一定前端知识的小伙伴来说。
主界面开发
在展示源代码之前,先介绍一下使用到了 js 哪些组件:
滑动容器(swiper)
视频播放(video)
可滑动面板(panel)
列表组件(list)
图片组件(image)
文本组件(text)
交互式组件(input)
按钮组件(button)
通过查看 js api 参考文档,就可以做出你喜欢的视频应用了。
先介绍简单的 1% java 代码,如果之前做过分布式 demo,直接复制过来就可以使用:
java 代码:public class mainability extends aceability { @override public void onstart(intent intent) { super.onstart(intent); // 动态判断权限 if (verifyselfpermission(ohos.permission.distributed_datasync) != ibundlemanager.permission_granted) { // 应用未被授予权限 if (canrequestpermission(ohos.permission.distributed_datasync)) { // 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示) requestpermissionsfromuser(new string[]{ohos.permission.distributed_datasync}, 0); } } } @override public void onstop() { super.onstop(); }} hml 代码(重要界面布局文件):
#harmonyos挑战赛第二期#
{{$item.title}}
js 代码(重要逻辑代码,各组件事件):
// @ts-nocheckimport app from '@system.app';export default { data: { img: resources/media/pic_tv.png, continueabilitydata: { currentindex: 0, videolist: [ /common/000001.mp4, /common/000002.mp4, /common/000003.mp4 ], timeupdatetime: 2, isstart: true, todolist: [ {title: 'hdc2021活动门票进行中'}, {title: '我期待harmonyos生态越来越完善'}, {title: 'harmonyos你值得拥有'}], comment: '' } }, oninit() { }, changeswiper(e) { console.info(onrestoredata:changeswiper); this.switchplay(e.index); }, switchplay(index) { console.info(onrestoredata:onshow + index); this.continueabilitydata.currentindex = index; if(index == 0) { this.$element('videoone').start(); this.$element('videotwo').pause(); this.$element('videothree').pause(); console.info(onrestoredata:videoone start + this.$element('videoone').starttime); }else if(index == 1) { this.$element('videoone').pause(); this.$element('videotwo').start(); this.$element('videothree').pause(); console.info(onrestoredata:videotwo start + this.$element('videotwo').starttime); }else if(index == 2) { this.$element('videoone').pause(); this.$element('videotwo').pause(); this.$element('videothree').start(); console.info(onrestoredata:videothree start + this.$element('videothree').starttime); } }, //流转事件 trycontinueability: async function() { // 应用进行迁移 let result = await featureability.continueability(); console.info(result: + json.stringify(result)); }, onstartcontinuation() { // 判断当前的状态是不是适合迁移 console.info(onstartcontinuation); return true; }, oncompletecontinuation(code) { // 迁移操作完成,code返回结果 console.info(completecontinuation: code = + code); app.terminate(); }, onsavedata(savedata) { // 数据保存到saveddata中进行迁移。 var data = this.continueabilitydata; console.info(onsavedata: + json.stringify(data)); object.assign(savedata, data) }, onrestoredata(restoredata) { console.info(onrestoredata: + json.stringify(restoredata)); // 收到迁移数据,恢复。 this.continueabilitydata = restoredata; var currentindex = this.continueabilitydata.currentindex; var currenttime = this.continueabilitydata.timeupdatetime; this.$element('videoone').pause(); this.$element('videotwo').pause(); this.$element('videothree').pause(); this.$element('videoone').starttime = currenttime; this.$element('videotwo').starttime = currenttime; this.$element('videothree').starttime = currenttime; this.switchplay(currentindex); }, //评论事件 showpanel() { this.$element('simplepanel').show() }, closepanel() { this.$element('simplepanel').close() }, changevalue(e) { this.continueabilitydata.comment = e.value; }, enterkeyclick(e) { this.continueabilitydata.todolist.push({title: this.continueabilitydata.comment}); this.continueabilitydata.comment = ; }, timeupdatecallback:function(e){ this.continueabilitydata.timeupdatetime = e.currenttime;}, change_start_pause_one: function() { if(this.continueabilitydata.isstart) { this.$element('videoone').pause(); this.continueabilitydata.isstart = false; } else { this.$element('videoone').start(); this.continueabilitydata.isstart = true; } }, change_start_pause_two: function() { if(this.continueabilitydata.isstart) { this.$element('videotwo').pause(); this.continueabilitydata.isstart = false; } else { this.$element('videotwo').start(); this.continueabilitydata.isstart = true; } }, change_start_pause_three: function() { if(this.continueabilitydata.isstart) { this.$element('videothree').pause(); this.continueabilitydata.isstart = false; } else { this.$element('videothree').start(); this.continueabilitydata.isstart = true; } }}
css 代码(重要化妆技术):
.container { width: 100%; height: 100%; flex-direction: column;}.img { object-fit: cover; background-color: #808080;}.swiper { flex-direction: column; align-content: center; align-items: center; width: 100%; height: 100%; background-color: black;}.swipercontent { height: 100%; justify-content: center; background-color: black;}.btn-footer { height: 60px; line-height: 60px; width: 100%; background-color: black; flex-direction: row;}.footer-label { font-size: 16px; color: white; padding-top: 0px; flex-weight: 1; line-height: 20px;}.comment-icon { width: 32px; height: 32px; margin: 8px;}.icon { border-radius: 16px;}.panel-div { flex-direction: column; align-content: center; align-items: center; width: 100%; height: 100%;}.inner-btn { height: 70px; padding: 10px;}.todo-wrapper { width: 100%; height: 100%;}.todo-item { width: 100%; height: 30px; padding-left: 10px; padding-right: 10px;}.todo-icon { width: 16px; height: 16px; margin-top: 10px; margin-right: 10px;}.todo-title { width: 100%; height: 100%; text-align: left; font-size: 14fp;}
代码就写到此了,不要忘记了 config.json 文件的权限配置哦,在 module 下添加:
reqpermissions: [ { name: ohos.permission.distributed_datasync }] 总结
说实存的,当看到这个活动时间才几天时,感觉时间不太够用,要滑动视频,要评论功能,要分布式的,加上都是用空闲时间来做的,然而当深入去理解相关组件用法后,发现应该一天时间就可以了。
有兴趣的小伙伴可以下载源码查看,项目代码写得还不算靓仔,很多为了实现效果,都是 hardcode 的。
有空可以把重复代码抽出来,视频源也可以放到服务器上,然后就可以更愉快的刷更多视频了,源码同步到 gitee 码云,项目素材没有上传,自行添加。 源码在这:
https://gitee.com/army16/qin-hong-jun-video
如何利用定义、定律计算电路的电阻、电压、电流等参数
Gartner发布物联网技术十大战略和趋势
NPN和PNP两种三极管的使用和连接方法
LG Gram 2018宣布下月亮相:八代酷睿+触摸屏,你还期待哪点?
人工智能正渗透房地产行业
如何用所学的鸿蒙知识做一个小应用
拯救笔记本电脑硬盘的十大攻略
摩根士丹利:PMIC、MOSFET需求仍疲弱
国内智能汽车市场十大走向不可不知
手机的技术创新提升了FPC软板的用量与价值量
基于LIN总线控制系统实现LIN开发平台的搭建
DLP拼接显示墙的可靠性研究
霍尼韦尔助力武汉市中心医院杨春湖院区打造“数字孪生智慧医院”
传感器在物联网万亿级市场中的应用及发展趋势
水货C版iPhone 4S三地能烧号
阿里推出一款新的人工智能机器人,有点未来风格的合金蛋状机器人
什么是数据模型以及它如何应用于PICMG IoT.1
LED显示屏室内和户外的区别和两者各自的应用场所
物联网时代下硬件设计到底有多重要
冷凝水回收装置液位测量解决方案