0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

OpenHarmony技术社区 ? 来源:鸿蒙技术社区 ? 作者:狼哥Army ? 2021-10-19 09:23 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

今时今日,不管是大人,还是小孩,都喜欢刷视频,生活中刷视频的 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 代码:
publicclassMainAbilityextendsAceAbility{
@Override
publicvoidonStart(Intentintent){
super.onStart(intent);
//动态判断权限
if(verifySelfPermission("ohos.permission.DISTRIBUTED_DATASYNC")!=IBundleManager.PERMISSION_GRANTED){
//应用未被授予权限
if(canRequestPermission("ohos.permission.DISTRIBUTED_DATASYNC")){
//是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)
requestPermissionsFromUser(newString[]{"ohos.permission.DISTRIBUTED_DATASYNC"},0);
}
}
}

@Override
publicvoidonStop(){
super.onStop();
}
}

HML 代码(重要界面布局文件):

<divclass="container">
<swiperclass="swiper"id="swiper"index="{{continueAbilityData.currentIndex}}"indicator="false"loop="true"digital="false"vertical="true"onchange="changeSwiper">
<divclass="swiperContent">
<videoid='videoOne'src='{{continueAbilityData.videoList[0]}}'muted='false'autoplay='true'ontimeupdate='timeupdateCallback'style="object-fit:fill;width:100%;height:100%;"controls="false"onclick="change_start_pause_one"loop='true'starttime='{{ontinueAbilityData.timeupdatetime}}'>video>
div>
<divclass="swiperContent">
<videoid='videoTwo'src='{{continueAbilityData.videoList[1]}}'muted='false'autoplay='false'ontimeupdate='timeupdateCallback'style="object-fit:fill;width:100%;height:100%;"controls="false"onclick="change_start_pause_two"loop='true'starttime='{{ontinueAbilityData.timeupdatetime}}'>video>
div>
<divclass="swiperContent">
<videoid='videoThree'src='{{continueAbilityData.videoList[2]}}'muted='false'autoplay='false'ontimeupdate='timeupdateCallback'style="object-fit:fill;width:100%;height:100%;"controls="false"onclick="change_start_pause_three"loop='true'starttime='{{continueAbilityData.timeupdatetime}}'>video>
div>
swiper>
<divclass="btn-footer">
<imageclass="comment-iconicon"src="/common/army_icon.jpg">image>
<textclass="footer-label">#HarmonyOS挑战赛第二期#text>
<imageclass="comment-icon"src="/common/share.png"onclick="tryContinueAbility">image>
<imageclass="comment-icon"src="/common/bxs-message.png"onclick="showPanel">image>
div>
<panelid="simplepanel"type="foldable"mode="half"miniheight="400px">
<divclass="panel-div">
<listclass="todo-wrapper">
<list-itemfor="{{continueAbilityData.todolist}}"class="todo-item">
<imageclass="todo-icon"src="/common/avatar04.png">image>
<textclass="todo-title">{{$item.title}}text>
list-item>
list>
<divclass="inner-btn">
<inputid="input"class="input"type="text"value="{{continueAbilityData.comment}}"maxlength="20"enterkeytype="send"placeholder="请输入评论内容"onchange="changeValue"onenterkeyclick="enterkeyClick"style="margin-right:10px;">input>
<buttontype="capsule"value="关闭"onclick="closePanel">button>
div>
div>
panel>
div>

JS 代码(重要逻辑代码,各组件事件):

//@ts-nocheck
importappfrom'@system.app';
exportdefault{
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);
}elseif(index==1){
this.$element('videoOne').pause();
this.$element('videoTwo').start();
this.$element('videoThree').pause();
console.info("onRestoreData:videoTwo<>start"+this.$element('videoTwo').starttime);
}elseif(index==2){
this.$element('videoOne').pause();
this.$element('videoTwo').pause();
this.$element('videoThree').start();
console.info("onRestoreData:videoThree<>start"+this.$element('videoThree').starttime);
}
},

//流转事件
tryContinueAbility:asyncfunction(){
//应用进行迁移
letresult=awaitFeatureAbility.continueAbility();
console.info("result:"+JSON.stringify(result));
},
onStartContinuation(){
//判断当前的状态是不是适合迁移
console.info("onStartContinuation");
returntrue;
},
onCompleteContinuation(code){
//迁移操作完成,code返回结果
console.info("CompleteContinuation:code="+code);
app.terminate();

},
onSaveData(saveData){
//数据保存到savedData中进行迁移。
vardata=this.continueAbilityData;
console.info("onSaveData:"+JSON.stringify(data));
Object.assign(saveData,data)
},
onRestoreData(restoreData){
console.info("onRestoreData:"+JSON.stringify(restoreData));
//收到迁移数据,恢复。
this.continueAbilityData=restoreData;

varcurrentIndex=this.continueAbilityData.currentIndex;
varcurrentTime=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

责任编辑:haq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • APP
    APP
    +关注

    关注

    33

    文章

    1587

    浏览量

    74589
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2642

    浏览量

    68410
  • HarmonyOS
    +关注

    关注

    80

    文章

    2130

    浏览量

    33690

原文标题:做一个鸿蒙版仿抖音APP!

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    何用QT开发USB3.0上位机?

    何用QT开发USB3.0上位机
    发表于 05-21 06:54

    功德+1,用小安派-Eyes-S1做一个电子木鱼

    2024积德累功,心想事成!接下来看看如何用小安派-Eyes-S1做一个电子木鱼。01GUI-Guider页面设计先新建工程。直接进入UI设计界面,这里用到了两
    的头像 发表于 04-09 18:38 ?459次阅读
    功德+1,用小安派-Eyes-S1<b class='flag-5'>做一个</b>电子木鱼

    DevEco Studio 联合小艺接入 DeepSeek,步骤更简单开发鸿蒙更专业

    完成后,打开 DevEco Studio,创建新的鸿蒙应用项目,选择适合的模板(如 Empty Ability)。 2、下载并安装 CodeGenie 工具 如果你安装的是官网最新的 DevEco
    发表于 03-13 15:11

    【「极速探索HarmonyOS NEXT 」阅读体验】 本书开启了鸿蒙开发的整个生态资源

    点时间,从百度云盘中下载到了下内容,如图: 这是书内容相关的PPT文档的目录: 这是相关源代码的目录: 它们补充了书中所有的描述的内容,使我对学习鸿蒙知识有了
    发表于 03-06 11:44

    鸿蒙之路:家国情怀下的坚守与成长

    大家好,我是《极速探索HarmonyOS NEXT 纯血鸿蒙应用开发实践》书的副主编, 、写书的初衷:填补知识空白,助力生态发展 在科技的广袤星空中,操作系统犹如最璀璨的星辰之
    的头像 发表于 02-24 15:18 ?544次阅读
    <b class='flag-5'>鸿蒙</b>之路:家国情怀下的坚守与成长

    #新年新气象,大家新年快乐!#AIGC入门及鸿蒙入门

    ,基于扩散模型,能够生成与给定文本描述相符的图像。 鸿蒙系统入门 1.基础知识鸿蒙系统(HarmonyOS)是华为推出的款分布式操作系统,旨在实现跨设备、跨平台的无缝协同体验。
    发表于 01-13 10:46

    AIGC入门及鸿蒙入门

    模型,能够生成与给定文本描述相符的图像。 鸿蒙系统入门 1. 基础知识鸿蒙系统(HarmonyOS)是华为推出的款分布式操作系统,旨在实现跨设备、跨平台的无缝协同体验。
    发表于 01-13 10:32

    如何做一个12V/120A输出的电源模块?

    做一个12V/120A输出的电源模块(模块后会接电池),选用AMC1200来检测输出电压做电压反馈环,同时也用来做一个防反接的保护,故将AMC1200的原理图大致如下,因为看的
    发表于 01-08 07:57

    用小安派 DSL做一个天气站

    2.4 寸 320 *240 分辨率屏幕,外接 sht30 温湿度传感器,做一个天气站。 01、主要功能 时间显示(已完成) 天气显示(已完成) 温湿度显示(已完成) wifi 密码保
    的头像 发表于 01-06 16:44 ?593次阅读
    用小安派 DSL<b class='flag-5'>做一个</b>天气站

    《HarmonyOS第课》焕新升级,赋能开发者快速掌握鸿蒙应用开发

    《HarmonyOS第课》焕新升级,赋能开发者快速掌握鸿蒙应用开发 随着HarmonyOS NEXT发布,鸿蒙生态日益壮大,广大开发者对于系统化学习平台和课程的需求愈发强烈。近日,华为精心打造
    发表于 01-02 14:24

    自己动手做一个好玩的POV显示设备

    “ 读大学的时候就很喜欢这些开脑洞的小玩意儿。看到印度小哥用ESP32 做了高分辨率的 POV,而且开源了全部的硬件和代码,忍不住想分享给大家。”
    的头像 发表于 12-25 15:15 ?1737次阅读
    自己动手<b class='flag-5'>做一个</b>好玩的POV显示设备

    如何使用合宙的DTU+业务云平台,做一个温湿度传感器数据采集项目?

    使用合宙的DTU+业务云平台,做一个温湿度传感器数据采集项目,超详细教程。
    的头像 发表于 09-18 11:11 ?1006次阅读
    如何使用合宙的DTU+业务云平台,<b class='flag-5'>做一个</b>温湿度传感器数据采集项目?

    何用TLC2272C做一个耳机的功放?

    需要用TLC2272C做一个耳机的功放,请提供下典型应用的例子,谢谢
    发表于 09-06 06:37

    何用OPA333搭建单电源同相放大电路?

    何用OPA333搭建单电源同相放大电路?虚拟地能用电源地吗?输出的电压是以虚拟地为参考?如果是以虚拟地为参考那与输入电压的倍数关系是怎样的?
    发表于 09-05 06:25

    何用OPA615做一个脉冲信号的峰值保持电路?

    求助 ,想用OPA615做一个脉冲信号的峰值保持电路 有没有电路图什么的或者相关的资料
    发表于 08-27 07:50