chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙版JS如何實(shí)現(xiàn)分布式仿抖音應(yīng)用

OpenHarmony技術(shù)社區(qū) ? 來源:鴻蒙技術(shù)社區(qū) ? 作者:陳建朋 ? 2021-11-15 09:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

之前大家看過了 Java 版的《HarmonyOS 分布式之仿抖音應(yīng)用》,現(xiàn)在講講 JS 如何實(shí)現(xiàn)分布式仿抖音應(yīng)用,通過 JS 方式開發(fā)視頻播放,分布式設(shè)備遷移,評論,通過 Java 和 JS 交互,獲取設(shè)備信息,選擇設(shè)備信息做分布式遷移。

功能:分布式遷移到不同設(shè)備,視頻進(jìn)行評論,播放視頻,可以像抖音一樣切換視頻,可以點(diǎn)贊,分享等操作。

開發(fā)版本:sdk6,DevEco Studio3.0 Beta1。

主要代碼

①視頻播放

鴻蒙 js 中有專門【video】的組件,并且非常完善,可以直接使用:

https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-components-media-video-0000000000611764

<videoid='playerId{{$idx}}'src='{{$item.path}}'muted='false'autoplay='true'
controls="false"onprepared='preparedCallback'onstart='startCallback'onpause='pauseCallback'
onfinish='finishCallback'onerror='errorCallback'onseeking='seekingCallback'
onseeked='seekedCallback'
ontimeupdate='timeupdateCallback'style="object-fit:contain;width:100%;"
onlongpress='change_fullscreenchange'onclick="change_start_pause"loop='true'
starttime="0"
>
video>

js 代碼中視頻資源:

list:[{
path:"/common/video/video1.mp4"
},{
path:"/common/video/video2.mp4"
},{
path:"/common/video/video3.mp4"
},{
path:"/common/video/video4.mp4"
},{
path:"/common/video/video5.mp4"
},{
path:"/common/video/video6.mp4"
}]
②仿抖音視頻切換

有關(guān)視頻切換的開發(fā) js 中也提供了對應(yīng)的組件【swiper】,可以直接使用來進(jìn)行視頻切換:

https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-components-container-swiper-0000000000611533



<swiperclass="swiper-content"id="swiper"index="{{player_index}}"
indicator="false"loop="true"digital="false"vertical="true"onchange="changeVideo">
<stackclass="stack-parent"for="list">
<divclass="videosource">

<videoid='playerId{{$idx}}'src='{{$item.path}}'muted='false'autoplay='true'
controls="false"onprepared='preparedCallback'onstart='startCallback'onpause='pauseCallback'
onfinish='finishCallback'onerror='errorCallback'onseeking='seekingCallback'
onseeked='seekedCallback'
ontimeupdate='timeupdateCallback'style="object-fit:contain;width:100%;"
onlongpress='change_fullscreenchange'onclick="change_start_pause"loop='true'
starttime="0"
>
video>
div>
stack>
swiper>

③評論功能添加

評論功能使用了鴻蒙 js 中了兩個(gè)組件【list】(負(fù)責(zé)列表展示) 和【input】(負(fù)責(zé)信息發(fā)送),可參見有關(guān)文檔。
https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-components-container-list-0000000000611496

https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-components-basic-input-0000000000611673

評論功能有兩部分,評論列表和評論發(fā)送輸入框。

<divclass="pinglun"style="visibility:{{ifhidden}};">
<divstyle="height:32%;background-color:transparent;"onclick="hideenbg">
<text>text>
div>

<listclass="todo-wrapper"divider="true"style="divider-color:darkgrey;">

<list-itemfor="{{todolist}}"class="todo-item">
<divclass="photo">
<imageclass="image-set"src="/common/images/science6.png">image>
<textclass="todo-title"style="font-size:14fp;margin-left:10px;">{{$item.name}}
text>
div>
<textclass="todo-title"style="font-size:14fp;margin-top:5px;">{{$item.detail}}text>
list-item>
list>

<divclass="butt">

<inputid="input"class="input"type="text"value="{{content}}"maxlength="20"enterkeytype="send"
placeholder="{{placecontent}}"onchange="change"
onenterkeyclick="enterkeyClick">
input>
<buttonclass="last"onclick="sendmessage">發(fā)送button>
div>
div>

功能實(shí)現(xiàn)邏輯:

change(e){//監(jiān)聽輸入框信息變化獲取信息
this.message=e.value;
console.log("message==="+this.message)
},

sendmessage(){//提交信息后組織數(shù)據(jù)刷新界面
this.todolist.push({
name:'王者',
detail:this.message,
})
this.content="";
this.message="";
},
④JS 和 Java 交互獲取設(shè)備信息 在實(shí)現(xiàn)分布式設(shè)備遷移的時(shí)候查找 js 沒有找到獲取設(shè)備信息的有關(guān)接口,所以考慮通過 js 和 Java 相互調(diào)用實(shí)現(xiàn)。通過 jsFA 調(diào)用 Java PA機(jī)制,實(shí)現(xiàn)數(shù)據(jù)的獲取和傳遞。 js 端實(shí)現(xiàn)如下:

重點(diǎn):
  • Ability 類型,對應(yīng) PA 端不同的實(shí)現(xiàn)方式:0:Ability,1:Internal Ability。

  • syncOption PA 側(cè)請求消息處理同步/異步選項(xiàng):0:同步方式,默認(rèn)方式,1:異步方式。
initAction(code){
varactionData={};
actionData.firstNum=1024;
actionData.secondNum=2048;
varaction={};
action.bundleName="com.corecode.video.videoplayer";//包名
action.abilityName="com.corecode.video.videoplayer.DeviceInternalAbility";//包名+類名
action.messageCode=code;//消息編碼
action.data=actionData;//傳遞數(shù)據(jù)
action.abilityType=1;//ability類型
action.syncOption=1;//同步還是異步類型
returnaction;
},
getLevel:asyncfunction(){
try{
varaction=this.initAction(1001);
varresult=awaitFeatureAbility.callAbility(action);
console.info("result="+result);
this.deviceId=JSON.parse(JSON.parse(result).result);
console.log("deviceId=="+this.deviceId)
this.devicelist="visible";
}catch(pluginError){
console.error("getBatteryLevel:PluginError="+pluginError);
}
}

Java 端實(shí)現(xiàn)如下:

Java 端需要?jiǎng)?chuàng)建一個(gè) ability 服務(wù)繼承 AceInternalAbility 具體是使用哪種類型,看上面的解釋。

創(chuàng)建后需要注冊,比如我創(chuàng)建的是 InternalAbility 這樣注冊:DeviceInternalAbility.register(this);

packagecom.corecode.video.videoplayer;
publicclassDeviceInternalAbilityextendsAceInternalAbility{
privatestaticfinalHiLogLabelTAG=newHiLogLabel(0,0,"DeviceInternalAbility");
privatestaticfinalintCONNECT_ABILITY=2000;
privatestaticfinalintDISCONNECT_ABILITY=2001;
privatestaticfinalintSEND_MSG=1001;
privatestaticfinalintSUCCESS_CODE=0;
privatestaticfinalintFAIL_CODE=-1;
privatestaticDeviceInternalAbilityINSTANCE;
privateStringselectDeviceId;

/**
*defaultconstructor
*
*@paramcontextabilitycontext
*/
publicDeviceInternalAbility(AbilityContextcontext){
super("com.corecode.video.videoplayer","com.corecode.video.videoplayer.DeviceInternalAbility");
}

publicDeviceInternalAbility(StringbundleName,StringabilityName){
super(bundleName,abilityName);
}

publicDeviceInternalAbility(StringabilityName){
super(abilityName);
}

/**
*setInternalAbilityHandlerforDistributeInternalAbilityinstance
*
*@paramcontextabilitycontext
*/
staticvoidregister(AbilityContextcontext){
INSTANCE=newDeviceInternalAbility(context);
INSTANCE.setInternalAbilityHandler((code,data,reply,option)->
INSTANCE.onRemoteRequest(code,data,reply,option));
}

/**
*destroyDistributeInternalAbilityinstance
*/
privatestaticvoidunregister(){
INSTANCE.destroy();
}

/**
*defaultdestructor
*/
privatevoiddestroy(){
}

/**
*handclickrequestfromjavascript
*
*@paramcodeACTION_CODE
*@paramdatadatasentfromjavascript
*@paramreplyreplyforjavascript
*@paramoptioncurrentlyexcessive
*@returnwhetherjavascriptclickeventiscorrectlyresponded
*/
privatebooleanonRemoteRequest(intcode,MessageParceldata,MessageParcelreply,MessageOptionoption){
MapreplyResult=newHashMap<>();
switch(code){
//sendmessagetoremotedevice,messagecontainscontrollercommandfromFA
caseSEND_MSG:{
ZSONObjectdataParsed=ZSONObject.stringToZSON(data.readString());
intmessage=dataParsed.getIntValue("message");
////SYNC
//if(option.getFlags()==MessageOption.TF_SYNC){
//reply.writeString(ZSONObject.toZSONString(result));
//}
//ASYNC
//返回結(jié)果當(dāng)前僅支持String,對于復(fù)雜結(jié)構(gòu)可以序列化為ZSON字符串上報(bào)
Mapresult=newHashMap();
result.put("result",MainAbility.getList());
MessageParcelresponseData=MessageParcel.obtain();
responseData.writeString(ZSONObject.toZSONString(result));
IRemoteObjectremoteReply=reply.readRemoteObject();
try{
remoteReply.sendRequest(0,responseData,MessageParcel.obtain(),newMessageOption());
}catch(RemoteExceptionexception){
returnfalse;
}finally{
responseData.reclaim();
}
break;
}
//toinvokeremotedevice'snewsShareabilityandsendnewsurlwetransfer
caseCONNECT_ABILITY:{
ZSONObjectdataParsed=ZSONObject.stringToZSON(data.readString());
selectDeviceId=dataParsed.getString("deviceId");
break;
}
//whencontrollerFAwenttodestroylifeCycle,disconnectwithremotenewsShareability
caseDISCONNECT_ABILITY:{
unregister();
break;
}
default:
HiLog.error(TAG,"messageCodenothandleproperlyinphonedistributeInternalAbility");
}
returntrue;
}

privatevoidassembleReplyResult(intcode,MapreplyResult,Objectcontent,MessageParcelreply){
replyResult.put("code",code);
replyResult.put("content",content);
reply.writeString(ZSONObject.toZSONString(replyResult));
}
}

js 調(diào)用后會(huì)進(jìn)入 Java 的 onRemoteRequest 函數(shù)進(jìn)行數(shù)據(jù)解析和組織,然后通過如下接口將需要的結(jié)果回傳給 js 做界面展示和操作。

remoteReply.sendRequest(0,responseData,MessageParcel.obtain(),newMessageOption());

獲取設(shè)備信息:

List<DeviceInfo>deviceInfos=DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);

⑤分布式遷移

鴻蒙中分布式遷移真的是做到了強(qiáng)大,在 js 中只需要四個(gè)函數(shù)就能完成分布式遷移。

onSaveData(saveData){//數(shù)據(jù)保存到savedData中進(jìn)行遷移。
vardata={
list:this.list,
player_index:this.player_index,
};
Object.assign(saveData,data)
},
onRestoreData(restoreData){//收到遷移數(shù)據(jù),恢復(fù)。
console.info('====onRestoreData'+JSON.stringify(restoreData))
this.list=restoreData.list
this.player_index=restoreData.player_index

this.$element('swiper').swipeTo({
index:this.player_index
});

},
onCompleteContinuation(code){//遷移完成
console.log("onCompleteContinuation==="+code)
},
onStartContinuation(){//遷移開始
returntrue;
},

遷移:上面的四個(gè)有關(guān)函數(shù)設(shè)置好后執(zhí)行下面的接口就能實(shí)現(xiàn)分布式遷移了。

continueVideoAbility:asyncfunction(){
letconti=awaitFeatureAbility.continueAbility();
}
⑥權(quán)限

需要加上需要的權(quán)限:

"reqPermissions":[
{
"reason":"",
"usedScene":{
"ability":[
"MainAbility"
],
"when":"inuse"
},
"name":"ohos.permission.DISTRIBUTED_DATASYNC"
},
{
"name":"ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"
},
{
"name":"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"
},
{
"name":"ohos.permission.GRT_BUNDLE_INFO"
},
{
"name":"ohos.permission.INTERNET"
}
]

源碼地址【 分布式仿抖音視頻】:

https://gitee.com/dot_happydz_admin/video-player

責(zé)任編輯:haq
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 應(yīng)用
    +關(guān)注

    關(guān)注

    2

    文章

    441

    瀏覽量

    34770
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2642

    瀏覽量

    69314
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2146

    瀏覽量

    35511

原文標(biāo)題:鴻蒙版“抖音”,體驗(yàn)賊好!

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    【節(jié)能學(xué)院】Acrel-1000DP分布式光伏監(jiān)控系統(tǒng)在奉賢平高食品 4.4MW 分布式光伏中應(yīng)用

    分布式光伏本地和遠(yuǎn)程通信方案,并研究分布式光伏采集模型的構(gòu)建、多源數(shù)據(jù)融合估計(jì)、面向分布式光伏的有功、無功功率優(yōu)化控制等關(guān)鍵技術(shù),實(shí)現(xiàn)了對小容量工商業(yè)
    的頭像 發(fā)表于 08-23 08:04 ?3292次閱讀
    【節(jié)能學(xué)院】Acrel-1000DP<b class='flag-5'>分布式</b>光伏監(jiān)控系統(tǒng)在奉賢平高食品 4.4MW <b class='flag-5'>分布式</b>光伏中應(yīng)用

    分布式光伏發(fā)電監(jiān)測系統(tǒng)技術(shù)方案

    分布式光伏發(fā)電監(jiān)測系統(tǒng)技術(shù)方案 柏峰【BF-GFQX】一、系統(tǒng)目標(biāo) :分布式光伏發(fā)電監(jiān)測系統(tǒng)旨在通過智能化的監(jiān)測手段,實(shí)現(xiàn)分布式光伏電站的全方位、高精度、實(shí)時(shí)化管理。該系統(tǒng)能
    的頭像 發(fā)表于 08-22 10:51 ?2870次閱讀
    <b class='flag-5'>分布式</b>光伏發(fā)電監(jiān)測系統(tǒng)技術(shù)方案

    電商 API 接口:平臺(tái)電商活動(dòng)熱度實(shí)時(shí)監(jiān)測

    ? 作為全球領(lǐng)先的短視頻平臺(tái),其電商業(yè)務(wù)近年來蓬勃發(fā)展,吸引了眾多商家和消費(fèi)者。實(shí)時(shí)監(jiān)測電商活動(dòng)熱度,對于商家優(yōu)化營銷策略、平臺(tái)提升用戶體驗(yàn)至關(guān)重要。電商 API 接口為開發(fā)者
    的頭像 發(fā)表于 08-21 15:30 ?546次閱讀
    <b class='flag-5'>抖</b><b class='flag-5'>音</b>電商 API 接口:<b class='flag-5'>抖</b><b class='flag-5'>音</b>平臺(tái)電商活動(dòng)熱度實(shí)時(shí)監(jiān)測

    揭秘電商 API,讓小店粉絲增長有跡可循

    “透明路徑”。本文將逐步揭秘電商 API 的使用方法,幫助您實(shí)現(xiàn)粉絲增長的可視化與可控化。 一、什么是電商 API?
    的頭像 發(fā)表于 08-20 15:46 ?556次閱讀
    揭秘<b class='flag-5'>抖</b><b class='flag-5'>音</b>電商 API,讓<b class='flag-5'>抖</b><b class='flag-5'>音</b>小店粉絲增長有跡可循

    巧用電商 API,精準(zhǔn)分析商品種草效果

    API,結(jié)合數(shù)據(jù)分析,實(shí)現(xiàn)精準(zhǔn)量化種草效果。文章結(jié)構(gòu)清晰,從基礎(chǔ)概念到實(shí)踐步驟,逐步指導(dǎo)您操作。所有方法基于真實(shí)電商場景,確??煽啃院涂刹僮餍浴?一、電商 API 簡介與接入
    的頭像 發(fā)表于 08-20 15:29 ?734次閱讀
    巧用<b class='flag-5'>抖</b><b class='flag-5'>音</b>電商 API,精準(zhǔn)分析<b class='flag-5'>抖</b><b class='flag-5'>音</b>商品種草效果

    電商 API 接口:開啟小店直播帶貨數(shù)據(jù)新洞察

    深入探討該 API 如何賦能用戶,實(shí)現(xiàn)直播帶貨數(shù)據(jù)的實(shí)時(shí)監(jiān)控、深度分析和決策支持,開啟數(shù)據(jù)驅(qū)動(dòng)的新時(shí)代。 一、電商 API 接口的核心功能
    的頭像 發(fā)表于 08-20 15:20 ?651次閱讀
    <b class='flag-5'>抖</b><b class='flag-5'>音</b>電商 API 接口:開啟<b class='flag-5'>抖</b><b class='flag-5'>音</b>小店直播帶貨數(shù)據(jù)新洞察

    雙電機(jī)分布式驅(qū)動(dòng)汽車高速穩(wěn)定性機(jī)電耦合控制

    力矩,實(shí)現(xiàn)極限工況下的整車高速穩(wěn)定性控制。結(jié)果表明,采用機(jī)電耦合控制,除了可以實(shí)現(xiàn)兩側(cè)分布式驅(qū)動(dòng)系統(tǒng)的動(dòng)力耦合,起到增強(qiáng)車輛高速穩(wěn)定性的作用,還能夠協(xié)調(diào)兩側(cè)驅(qū)動(dòng)系統(tǒng)的轉(zhuǎn)矩輸出,抑制驅(qū)動(dòng)力矩波動(dòng),降低電機(jī)
    發(fā)表于 06-18 16:37

    曙光存儲(chǔ)領(lǐng)跑中國分布式存儲(chǔ)市場

    近日,賽迪顧問發(fā)布《中國分布式存儲(chǔ)市場研究報(bào)告(2025)》,指出2024 年中國分布式存儲(chǔ)市場首次超過集中式存儲(chǔ),規(guī)模達(dá) 198.2 億元,增速 43.7%。
    的頭像 發(fā)表于 05-19 16:50 ?991次閱讀

    分布式光伏電力問題層出不窮?安科瑞分布式光伏運(yùn)維系統(tǒng)來“救場”

    一、分布式光伏電力運(yùn)維,痛點(diǎn)大揭秘? ? 分布式光伏作為實(shí)現(xiàn)綠色能源轉(zhuǎn)型的關(guān)鍵一環(huán),近年來在我國得到了迅猛發(fā)展。國家能源局?jǐn)?shù)據(jù)顯示,截至 2023 年底,中國分布式光伏電站累計(jì)并網(wǎng)容量
    的頭像 發(fā)表于 05-07 17:14 ?654次閱讀
    <b class='flag-5'>分布式</b>光伏電力問題層出不窮?安科瑞<b class='flag-5'>分布式</b>光伏運(yùn)維系統(tǒng)來“救場”

    分布式光伏如何實(shí)現(xiàn)防逆流

    ,對規(guī)劃建設(shè)新型能源體系、達(dá)成“雙碳”目標(biāo)具有重要意義。 針對分布式光伏政策提倡就地消納,不允許并網(wǎng),對于新上的分布式光伏需要設(shè)置防逆流管理,那我們應(yīng)當(dāng)在哪里監(jiān)視呢? 分布式光伏發(fā)電系統(tǒng)的并網(wǎng)點(diǎn),是指
    的頭像 發(fā)表于 03-25 16:03 ?441次閱讀
    <b class='flag-5'>分布式</b>光伏如何<b class='flag-5'>實(shí)現(xiàn)</b>防逆流

    分布式光伏如何實(shí)現(xiàn)防逆流?

    分布式光伏如何實(shí)現(xiàn)防逆流
    的頭像 發(fā)表于 03-24 13:31 ?585次閱讀
    <b class='flag-5'>分布式</b>光伏如何<b class='flag-5'>實(shí)現(xiàn)</b>防逆流?

    分布式云化數(shù)據(jù)庫有哪些類型

    分布式云化數(shù)據(jù)庫有哪些類型?分布式云化數(shù)據(jù)庫主要類型包括:關(guān)系型分布式數(shù)據(jù)庫、非關(guān)系型分布式數(shù)據(jù)庫、新SQL分布式數(shù)據(jù)庫、以列方式存儲(chǔ)數(shù)據(jù)、
    的頭像 發(fā)表于 01-15 09:43 ?850次閱讀

    基于ptp的分布式系統(tǒng)設(shè)計(jì)

    在現(xiàn)代分布式系統(tǒng)中,精確的時(shí)間同步對于確保數(shù)據(jù)一致性、系統(tǒng)穩(wěn)定性和性能至關(guān)重要。PTP(Precision Time Protocol)是一種網(wǎng)絡(luò)協(xié)議,用于在分布式系統(tǒng)中實(shí)現(xiàn)高精度的時(shí)間同步
    的頭像 發(fā)表于 12-29 10:09 ?953次閱讀

    HarmonyOS Next 應(yīng)用元服務(wù)開發(fā)-分布式數(shù)據(jù)對象遷移數(shù)據(jù)文件資產(chǎn)遷移

    設(shè)備文件訪問實(shí)現(xiàn)文件的遷移,難以獲取文件同步完成的時(shí)間。為了保證更高的成功率,文件的遷移不建議繼續(xù)通過該方式實(shí)現(xiàn),推薦使用分布式數(shù)據(jù)對象攜帶資產(chǎn)的方式。開發(fā)者此前通過跨設(shè)備文件訪問實(shí)現(xiàn)
    發(fā)表于 12-24 10:11

    HarmonyOS Next 應(yīng)用元服務(wù)開發(fā)-分布式數(shù)據(jù)對象遷移數(shù)據(jù)權(quán)限與基礎(chǔ)數(shù)據(jù)

    設(shè)備文件訪問實(shí)現(xiàn)文件的遷移,難以獲取文件同步完成的時(shí)間。為了保證更高的成功率,文件的遷移不建議繼續(xù)通過該方式實(shí)現(xiàn),推薦使用分布式數(shù)據(jù)對象攜帶資產(chǎn)的方式。開發(fā)者此前通過跨設(shè)備文件訪問實(shí)現(xiàn)
    發(fā)表于 12-24 09:40