如何用所学的鸿蒙知识做一个小应用

今时今日,不管是大人,还是小孩,都喜欢刷视频,生活中刷视频的 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显示屏室内和户外的区别和两者各自的应用场所
物联网时代下硬件设计到底有多重要
冷凝水回收装置液位测量解决方案