一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

鴻蒙系統(tǒng)中用Java UI開(kāi)發(fā)分布式仿抖音應(yīng)用

OpenHarmony技術(shù)社區(qū) ? 來(lái)源:鴻蒙技術(shù)社區(qū) ? 作者:開(kāi)鴻HOS小鴻 ? 2021-11-01 14:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文使用 Java UI 開(kāi)發(fā)分布式仿抖音應(yīng)用,上下滑動(dòng)切換視頻,評(píng)論功能,設(shè)備遷移功能:記錄播放的視頻頁(yè)和進(jìn)度、評(píng)論數(shù)據(jù)。

效果演示

①上下滑動(dòng)切換視頻、點(diǎn)擊遷移圖標(biāo),彈框選擇在線的設(shè)備,完成視頻數(shù)據(jù)的遷移。

點(diǎn)擊評(píng)論圖標(biāo)查看評(píng)論,編輯評(píng)論內(nèi)容并發(fā)送。點(diǎn)擊遷移圖標(biāo),彈框選擇在線的設(shè)備,完成評(píng)論數(shù)據(jù)的遷移。

項(xiàng)目結(jié)構(gòu)

如下圖:

d2044b64-3ac4-11ec-82a9-dac502259ad0.png

主要代碼

①上下滑動(dòng)頁(yè)面

頁(yè)面切換用到系統(tǒng)組件PageSlider:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-component-pageslider-0000001091933258

默認(rèn)左右切換,設(shè)置為上下方向:setOrientation(Component.VERTICAL);

importohos.aafwk.ability.AbilitySlice;
importohos.aafwk.content.Intent;
importohos.agp.components.*;

importjava.util.ArrayList;
importjava.util.List;

publicclassMainAbilitySliceextendsAbilitySlice{
@Override
publicvoidonStart(Intentintent){
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
//查找滑動(dòng)頁(yè)面組件
PageSliderpageSlider=(PageSlider)findComponentById(ResourceTable.Id_pageSlider);
//設(shè)置滑動(dòng)方向?yàn)樯舷禄瑒?dòng)
pageSlider.setOrientation(Component.VERTICAL);
//集合測(cè)試數(shù)據(jù)
ListlistData=newArrayList<>();
listData.add("第一頁(yè)");
listData.add("第二頁(yè)");
listData.add("第三頁(yè)");

//設(shè)置頁(yè)面適配器
pageSlider.setProvider(newPageSliderProvider(){
/**
*獲取當(dāng)前適配器中可用視圖的數(shù)量
*/
@Override
publicintgetCount(){
returnlistData.size();
}
/**
*創(chuàng)建頁(yè)面
*/
@Override
publicObjectcreatePageInContainer(ComponentContainercontainer,intposition){
//查找布局
Componentcomponent=LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_item_page,null,false);
TexttextContent=(Text)component.findComponentById(ResourceTable.Id_text_item_page_content);
//設(shè)置數(shù)據(jù)
textContent.setText(listData.get(position));
//添加到容器中
container.addComponent(component);
returncomponent;
}
/**
*銷(xiāo)毀頁(yè)面
*/
@Override
publicvoiddestroyPageFromContainer(ComponentContainercontainer,intposition,Objectobject){
//從容器中移除
container.removeComponent((Component)object);
}
/**
*檢查頁(yè)面是否與對(duì)象匹配
*/
@Override
publicbooleanisPageMatchToObject(Componentpage,Objectobject){
returntrue;
}
});

//添加頁(yè)面改變監(jiān)聽(tīng)器
pageSlider.addPageChangedListener(newPageSlider.PageChangedListener(){
/**
*頁(yè)面滑動(dòng)時(shí)調(diào)用
*/
@Override
publicvoidonPageSliding(intitemPos,floatitemPosOffset,intitemPosOffsetPixels){}
/**
*當(dāng)頁(yè)面滑動(dòng)狀態(tài)改變時(shí)調(diào)用
*/
@Override
publicvoidonPageSlideStateChanged(intstate){}
/**
*選擇新頁(yè)面時(shí)回調(diào)
*/
@Override
publicvoidonPageChosen(intitemPos){
//在此方法下,切換頁(yè)面獲取當(dāng)前頁(yè)面的視頻源,進(jìn)行播放
Stringdata=listData.get(itemPos);
}
});
}
}

②播放視頻

視頻播放使用Player:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/media-video-player-0000000000044178

視頻畫(huà)面窗口顯示使用SurfaceProvider:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/faq-media-0000001124842486#section0235506211
importohos.aafwk.ability.AbilitySlice;
importohos.aafwk.content.Intent;
importohos.agp.components.surfaceprovider.SurfaceProvider;
importohos.agp.graphics.SurfaceOps;
importohos.global.resource.RawFileDescriptor;
importohos.media.common.Source;
importohos.media.player.Player;

importjava.io.IOException;

publicclassMainAbilitySliceextendsAbilitySlice{
//視頻路徑
privatefinalStringvideoPath="resources/rawfile/HarmonyOS.mp4";
//播放器
privatePlayermPlayer;

@Override
publicvoidonStart(Intentintent){
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
//初始化播放器
mPlayer=newPlayer(getContext());
//查找視頻窗口組件
SurfaceProvidersurfaceProvider=(SurfaceProvider)findComponentById(ResourceTable.Id_surfaceProvider);
//設(shè)置視頻窗口在頂層
surfaceProvider.pinToZTop(true);
//設(shè)置視頻窗口操作監(jiān)聽(tīng)
if(surfaceProvider.getSurfaceOps().isPresent()){
surfaceProvider.getSurfaceOps().get().addCallback(newSurfaceOps.Callback(){
/**
*創(chuàng)建視頻窗口
*/
@Override
publicvoidsurfaceCreated(SurfaceOpsholder){
try{
RawFileDescriptorfileDescriptor=getResourceManager().getRawFileEntry(videoPath).openRawFileDescriptor();
Sourcesource=newSource(fileDescriptor.getFileDescriptor(),
fileDescriptor.getStartPosition(),
fileDescriptor.getFileSize()
);
//設(shè)置媒體文件
mPlayer.setSource(source);
//設(shè)置播放窗口
mPlayer.setVideoSurface(holder.getSurface());
//循環(huán)播放
mPlayer.enableSingleLooping(true);
//準(zhǔn)備播放環(huán)境并緩沖媒體數(shù)據(jù)
mPlayer.prepare();
//開(kāi)始播放
mPlayer.play();
}catch(IOExceptione){
e.printStackTrace();
}

}
/**
*視頻窗口改變
*/
@Override
publicvoidsurfaceChanged(SurfaceOpsholder,intformat,intwidth,intheight){}
/**
*視頻窗口銷(xiāo)毀
*/
@Override
publicvoidsurfaceDestroyed(SurfaceOpsholder){}
});
}
}

@Override
protectedvoidonStop(){
super.onStop();
//頁(yè)面銷(xiāo)毀,釋放播放器
if(mPlayer!=null){
mPlayer.stop();
mPlayer.release();
}
}
}

③跨設(shè)備遷移示例

跨設(shè)備遷移使用IAbilityContinuation 接口

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-page-cross-device-0000001051072880

在 entry 下的 config.json 配置權(quán)限:

"reqPermissions":[
{
"name":"ohos.permission.DISTRIBUTED_DATASYNC"
},
{
"name":"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"
},
{
"name":"ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"
}
]

實(shí)現(xiàn) IAbilityContinuation 接口,說(shuō)明:一個(gè)應(yīng)用可能包含多個(gè) Page,僅需要在支持遷移的 Page 中通過(guò)以下方法實(shí)現(xiàn) IAbilityContinuation 接口。

同時(shí),此 Page 所包含的所有 AbilitySlice 也需要實(shí)現(xiàn)此接口。

importohos.aafwk.ability.AbilitySlice;
importohos.aafwk.ability.IAbilityContinuation;
importohos.aafwk.content.Intent;
importohos.aafwk.content.IntentParams;
importohos.agp.components.Button;
importohos.agp.components.Text;
importohos.bundle.IBundleManager;
importohos.distributedschedule.interwork.DeviceInfo;
importohos.distributedschedule.interwork.DeviceManager;

importjava.util.List;

publicclassMainAbilitySliceextendsAbilitySliceimplementsIAbilityContinuation{
privateStringdata="";
StringPERMISSION="ohos.permission.DISTRIBUTED_DATASYNC";

@Override
publicvoidonStart(Intentintent){
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
//申請(qǐng)權(quán)限
if(verifySelfPermission(PERMISSION)!=IBundleManager.PERMISSION_GRANTED){
requestPermissionsFromUser(newString[]{PERMISSION},0);
}
Buttonbutton=(Button)findComponentById(ResourceTable.Id_button);
Texttext=(Text)findComponentById(ResourceTable.Id_text);

//點(diǎn)擊遷移
button.setClickedListener(component->{
//查詢分布式網(wǎng)絡(luò)中所有在線設(shè)備(不包括本地設(shè)備)的信息。
ListdeviceList=DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
if(deviceList.size()>0){
//啟動(dòng)遷移,指定的設(shè)備ID
continueAbility(deviceList.get(0).getDeviceId());
}
});
//顯示遷移的數(shù)據(jù)
text.setText("遷移的數(shù)據(jù):"+data);
}
/**
*啟動(dòng)遷移時(shí)首次調(diào)用此方法
*@return是否進(jìn)行遷移
*/
@Override
publicbooleanonStartContinuation(){
returntrue;
}
/**
*遷移時(shí)存入數(shù)據(jù)
*/
@Override
publicbooleanonSaveData(IntentParamsintentParams){
intentParams.setParam("data","測(cè)試數(shù)據(jù)");
returntrue;
}
/**
*獲取遷移存入的數(shù)據(jù),在生命周期的onStart之前執(zhí)行
*/
@Override
publicbooleanonRestoreData(IntentParamsintentParams){
data=(String)intentParams.getParam("data");
returntrue;
}
/**
*遷移完成
*/
@Override
publicvoidonCompleteContinuation(inti){}
}

根據(jù)上面的核心代碼示例,了解實(shí)現(xiàn)原理,接下來(lái)便可以結(jié)合實(shí)際需求完善功能了。

責(zé)任編輯:haq

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

    關(guān)注

    20

    文章

    2989

    瀏覽量

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

    關(guān)注

    183

    文章

    2642

    瀏覽量

    68092
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2126

    瀏覽量

    33053

原文標(biāo)題:開(kāi)發(fā)一個(gè)鴻蒙版“抖音”,So easy!

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    Ceph分布式存儲(chǔ)系統(tǒng)解析

    在當(dāng)今數(shù)據(jù)爆炸的時(shí)代,企業(yè)對(duì)存儲(chǔ)系統(tǒng)的需求日益增長(zhǎng),傳統(tǒng)的集中式存儲(chǔ)已經(jīng)無(wú)法滿足大規(guī)模數(shù)據(jù)處理的要求。分布式存儲(chǔ)系統(tǒng)應(yīng)運(yùn)而生,而Ceph作為開(kāi)源分布式存儲(chǔ)
    的頭像 發(fā)表于 07-14 11:15 ?167次閱讀

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

    摘要:為了利用所設(shè)計(jì)的雙電機(jī)防滑差速驅(qū)動(dòng)系統(tǒng)來(lái)提高分布式驅(qū)動(dòng)汽車(chē)的動(dòng)力學(xué)性能,在前期同軸耦合驅(qū)動(dòng)控制理論研究的基礎(chǔ)上,開(kāi)展該車(chē)的高速穩(wěn)定性機(jī)電耦合控制研究。建立并驗(yàn)證包含所設(shè)計(jì)驅(qū)動(dòng)系統(tǒng)在內(nèi)的
    發(fā)表于 06-18 16:37

    安科瑞Acrel-1000DP分布式光伏監(jiān)控系統(tǒng)在嘉興亨泰分布式光伏項(xiàng)目中的應(yīng)用

    摘要 分布式光伏發(fā)電系統(tǒng)其核心特點(diǎn)是發(fā)電設(shè)備靠近用電負(fù)荷中心,通常安裝在屋頂、建筑立面或閑置空地上,截至2025年,分布式光伏發(fā)電系統(tǒng)在全球和中國(guó)范圍內(nèi)取得了顯著發(fā)展,成為能源轉(zhuǎn)型和可
    的頭像 發(fā)表于 04-10 13:17 ?307次閱讀
    安科瑞Acrel-1000DP<b class='flag-5'>分布式</b>光伏監(jiān)控<b class='flag-5'>系統(tǒng)</b>在嘉興亨泰<b class='flag-5'>分布式</b>光伏項(xiàng)目中的應(yīng)用

    分布式光伏發(fā)運(yùn)維系統(tǒng)實(shí)際應(yīng)用案例分享

    安科瑞劉鴻鵬 摘?要 分布式光伏發(fā)電系統(tǒng)其核心特點(diǎn)是發(fā)電設(shè)備靠近用電負(fù)荷中心,通常安裝在屋頂、建筑立面或閑置空地上,截至2025年,分布式光伏發(fā)電系統(tǒng)在全球和中國(guó)范圍內(nèi)取得了顯著發(fā)展,
    的頭像 發(fā)表于 04-09 14:46 ?366次閱讀
    <b class='flag-5'>分布式</b>光伏發(fā)運(yùn)維<b class='flag-5'>系統(tǒng)</b>實(shí)際應(yīng)用案例分享

    淺談分布式光伏系統(tǒng)在工業(yè)企業(yè)的設(shè)計(jì)及應(yīng)用

    主要對(duì)工業(yè)廠區(qū)屋頂分布式光伏發(fā)電系統(tǒng)的設(shè)計(jì)及應(yīng)用進(jìn)行研究,為工業(yè)廠區(qū)能源供應(yīng)提供一種全新的解決思路和技術(shù)支持。介紹了工業(yè)廠區(qū)屋頂分布式光伏系統(tǒng)及其優(yōu)勢(shì),分析了工業(yè)廠區(qū)屋頂
    的頭像 發(fā)表于 03-21 14:24 ?430次閱讀
    淺談<b class='flag-5'>分布式</b>光伏<b class='flag-5'>系統(tǒng)</b>在工業(yè)企業(yè)的設(shè)計(jì)及應(yīng)用

    【「鴻蒙操作系統(tǒng)設(shè)計(jì)原理與架構(gòu)」閱讀體驗(yàn)】02-華為鴻蒙設(shè)計(jì)理念

    多種不同類型的 HarmonyOS 設(shè)備上,大大節(jié)省了開(kāi)發(fā)時(shí)間和成本 。 分布式 UI 框架是 DevEco Studio 的另一大亮點(diǎn),它為開(kāi)發(fā)者提供了一套統(tǒng)一的
    發(fā)表于 02-23 16:16

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

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

    AIGC入門(mén)及鴻蒙入門(mén)

    JDK、配置SDK等。 3. 開(kāi)發(fā)實(shí)踐: 學(xué)習(xí)鴻蒙系統(tǒng)的架構(gòu)和API,了解其組件化、分布式等特性。 通過(guò)官方文檔和社區(qū)資源,學(xué)習(xí)和掌握鴻蒙應(yīng)
    發(fā)表于 01-13 10:32

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

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

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

    提供了async版本供該場(chǎng)景使用。 當(dāng)前,wantParams中“sessionId”字段在遷移流程中被系統(tǒng)占用,建議開(kāi)發(fā)者在wantParams中定義其他key值存儲(chǔ)該分布式數(shù)據(jù)對(duì)象生成的id,避免
    發(fā)表于 12-24 10:11

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

    提供了async版本供該場(chǎng)景使用。 當(dāng)前,wantParams中“sessionId”字段在遷移流程中被系統(tǒng)占用,建議開(kāi)發(fā)者在wantParams中定義其他key值存儲(chǔ)該分布式數(shù)據(jù)對(duì)象生成的id,避免
    發(fā)表于 12-24 09:40

    名單公布!【書(shū)籍評(píng)測(cè)活動(dòng)NO.53】鴻蒙操作系統(tǒng)設(shè)計(jì)原理與架構(gòu)

    的底層設(shè)計(jì)邏輯出發(fā),針對(duì)不同關(guān)鍵子系統(tǒng)的目標(biāo)功能和實(shí)現(xiàn)路徑做實(shí)際分析解讀,幫助開(kāi)發(fā)者理解鴻蒙操作系統(tǒng)的底層邏輯,開(kāi)發(fā)更適合
    發(fā)表于 12-16 15:10

    安科瑞Acrel-1000DP分布式光伏監(jiān)控系統(tǒng)在8.3MWp分布式光伏發(fā)電中的應(yīng)用

    安科瑞分布式光伏監(jiān)控系統(tǒng)在上海汽車(chē)變速器有限公司 8.3MWp分布式光伏發(fā)電項(xiàng)目中的應(yīng)用
    發(fā)表于 12-16 15:03 ?0次下載

    分布式輸電線路故障定位中的分布式是指什么

    所謂分布式指的是產(chǎn)品的部署方式,是相對(duì)于集中式而言的。 一、部署方式 分散安裝:分布式輸電線路故障定位系統(tǒng)中的采集裝置需要安裝在輸電線路的多個(gè)位置,通常是每隔一定距離設(shè)置一個(gè)監(jiān)測(cè)點(diǎn),以確保對(duì)整條線路
    的頭像 發(fā)表于 10-16 11:39 ?688次閱讀
    <b class='flag-5'>分布式</b>輸電線路故障定位中的<b class='flag-5'>分布式</b>是指什么

    安科瑞分布式光伏監(jiān)控系統(tǒng)的應(yīng)用

    隨著“雙碳”目標(biāo)的提出,開(kāi)發(fā)利用可再生能源已成為必然趨勢(shì)。新能源發(fā)電作為能源利用的一種重要形式,已經(jīng)受到越來(lái)越多的關(guān)注。相對(duì)于大容量、高電壓、遠(yuǎn)距離輸送的集中發(fā)電方式,分布式光伏具有容量小、電壓
    的頭像 發(fā)表于 08-14 08:41 ?604次閱讀
    安科瑞<b class='flag-5'>分布式</b>光伏監(jiān)控<b class='flag-5'>系統(tǒng)</b>的應(yīng)用