今天給大家分享一個有趣的鴻蒙分布式小游戲:你畫我猜。
開發心得(如有錯誤還請大佬及時指正):
-
分布式流轉:一個 APP 應用在設備之間互相拉起遷移,只在一個終端上運行。
- 分布式協同:一個 APP 同時在多個設備上運行,畫面實時共享,數據實時傳輸。
在工程創立之后,首先有個很重要的事情那就是驗權。
①這個分布式協同會用到一個權限接口,去 MainAbilitySlice 里面申請
分布式數據管理 ohos.permission.DISTRIBUTED_DATASYNC 允許不同設備間的數據交換。
voidgrantPermission(){//獲取驗證權限數據交互允許不同設備間的數據交換。
if(verifySelfPermission(DISTRIBUTED_DATASYNC)!=IBundleManager.PERMISSION_GRANTED){
if(canRequestPermission(DISTRIBUTED_DATASYNC)){
requestPermissionsFromUser(newString[]{DISTRIBUTED_DATASYNC},PERMISSION_CODE);
}
}
}
權限接口文檔鏈接:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/security-permissions-available-0000001051089272
②權限申請
開發者需要在 config.json 文件中的“reqPermissions”字段中聲明所需要的權限。
{
"module":{
"reqPermissions":[
{
"name":"ohos.permission.CAMERA",
"reason":"$string:permreason_camera",
"usedScene":
{
"ability":["com.mycamera.Ability","com.mycamera.AbilityBackground"],
"when":"always"
}
},{
...
}
]
}
}
}

{
"name":"ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"//允許獲取分布式組網內設備的狀態變化。
},
{
"name":"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"//允許獲取分布式組網內的設備列表和設備信息。
},
{
"name":"ohos.permission.GRT_BUNDLE_INFO"//查詢其他應用的信息。
},
{
"name":"ohos.permission.INTERNET"//允許使用網絡socket。
}
應用權限列表文檔鏈接:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/security-permissions-guidelines-0000000000029886
再看頁面結構:
在 resources 下面的:-
graphic:頁面樣式效果調配
-
layoput:此 demo 的 java UI 頁面布局結構
主頁面入口布局代碼 ability_main:
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical"
ohos:background_element="$graphic:background_button">
<Text
ohos:height="match_content"
ohos:width="match_content"
ohos:top_margin="150px"
ohos:layout_alignment="horizontal_center"
ohos:text="你好鴻蒙_你畫我猜"
ohos:text_size="38fp"
/>
<Image
ohos:id="$+id:imageComponent"
ohos:height="200vp"
ohos:width="1080"
ohos:top_margin="150px"
ohos:image_src="$media:HM"
/>
<Button
ohos:id="$+id:help_btn"
ohos:height="100vp"
ohos:width="300vp"
ohos:background_element="$graphic:background_button"
ohos:layout_alignment="horizontal_center"
ohos:left_padding="15vp"
ohos:right_padding="15vp"
ohos:text="進入游戲"
ohos:text_size="30vp"
ohos:top_margin="20vp">
Button>
DirectionalLayout>
游戲匹配頁面布局 math_game:
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">
<Button
ohos:id="$+id:help_btn"
ohos:height="match_content"
ohos:width="500px"
ohos:background_element="$graphic:background_begin"
ohos:layout_alignment="horizontal_center"
ohos:left_padding="15vp"
ohos:right_padding="15vp"
ohos:text="匹配對手"
ohos:text_size="30vp"
ohos:top_margin="200vp">
Button>
<Image
ohos:id="$+id:imageComponent"
ohos:height="200vp"
ohos:width="1080"
ohos:top_margin="100px"
ohos:image_src="$media:NHWC"
/>
DirectionalLayout>
MainAbilitySlice:
packagecom.huawei.codelab.slice;
importstaticohos.security.SystemPermission.DISTRIBUTED_DATASYNC;
importcom.huawei.codelab.ResourceTable;
importcom.huawei.codelab.utils.CommonData;
importcom.huawei.codelab.utils.LogUtil;
importohos.aafwk.ability.AbilitySlice;
importohos.aafwk.content.Intent;
importohos.aafwk.content.Operation;
importohos.agp.components.Component;
importohos.bundle.IBundleManager;
publicclassMainAbilitySliceextendsAbilitySlice{
privatestaticfinalStringTAG=CommonData.TAG+MainAbilitySlice.class.getSimpleName();
privatestaticfinalintPERMISSION_CODE=10000000;
@Override
publicvoidonStart(Intentintent){
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
grantPermission();
initView();
}
voidgrantPermission(){//獲取驗證權限數據交互允許不同設備間的數據交換。
if(verifySelfPermission(DISTRIBUTED_DATASYNC)!=IBundleManager.PERMISSION_GRANTED){
if(canRequestPermission(DISTRIBUTED_DATASYNC)){
requestPermissionsFromUser(newString[]{DISTRIBUTED_DATASYNC},PERMISSION_CODE);
}
}
}
//
privatevoidinitView(){
findComponentById(ResourceTable.Id_help_btn).setClickedListener(newButtonClick());
}
privatevoidmathGame(){//數學游戲
LogUtil.info(TAG,"ClickResourceTableId_math_game");
IntentmathGameIntent=newIntent();
OperationoperationMath=newIntent.OperationBuilder().withBundleName(getBundleName())
.withAbilityName(CommonData.ABILITY_MAIN)
.withAction(CommonData.MATH_PAGE)
.build();
mathGameIntent.setOperation(operationMath);
startAbility(mathGameIntent);
}
//進入游戲
privateclassButtonClickimplementsComponent.ClickedListener{
@Override
publicvoidonClick(Componentcomponent){
mathGame();
}
}
}
MathGameAbilitySlice:
packagecom.huawei.codelab.slice;
importcom.huawei.codelab.ResourceTable;
importcom.huawei.codelab.devices.SelectDeviceDialog;
importcom.huawei.codelab.utils.CommonData;
importcom.huawei.codelab.utils.LogUtil;
importohos.aafwk.ability.AbilitySlice;
importohos.aafwk.content.Intent;
importohos.aafwk.content.Operation;
importohos.agp.components.Button;
importohos.agp.components.Component;
importohos.data.distributed.common.KvManagerConfig;
importohos.data.distributed.common.KvManagerFactory;
importohos.distributedschedule.interwork.DeviceInfo;
importohos.distributedschedule.interwork.DeviceManager;
importjava.util.ArrayList;
importjava.util.List;
publicclassMathGameAbilitySliceextendsAbilitySlice{
privatestaticfinalStringTAG=CommonData.TAG+MathGameAbilitySlice.class.getSimpleName();
privateButtonhelpBtn;
privateListdevices=newArrayList<>();
@Override
publicvoidonStart(Intentintent){
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_math_game);
initView();
}
privatevoidinitView(){
if(findComponentById(ResourceTable.Id_help_btn)instanceofButton){
helpBtn=(Button)findComponentById(ResourceTable.Id_help_btn);
}
helpBtn.setClickedListener(newButtonClick());
}
privatevoidgetDevices(){
if(devices.size()>0){
devices.clear();
}
ListdeviceInfos=
DeviceManager.getDeviceList(ohos.distributedschedule.interwork.DeviceInfo.FLAG_GET_ONLINE_DEVICE);
LogUtil.info(TAG,"MathGameAbilitySlicedeviceInfossizeis:"+deviceInfos.size());
devices.addAll(deviceInfos);
showDevicesDialog();
}
privatevoidshowDevicesDialog(){
newSelectDeviceDialog(this,devices,deviceInfo->{
startLocalFa(deviceInfo.getDeviceId());
startRemoteFa(deviceInfo.getDeviceId());
}).show();
}
privatevoidstartLocalFa(StringdeviceId){
LogUtil.info(TAG,"startLocalFa......");
Intentintent=newIntent();
intent.setParam(CommonData.KEY_REMOTE_DEVICEID,deviceId);
intent.setParam(CommonData.KEY_IS_LOCAL,true);
Operationoperation=newIntent.OperationBuilder().withBundleName(getBundleName())
.withAbilityName(CommonData.ABILITY_MAIN)
.withAction(CommonData.DRAW_PAGE)
.build();
intent.setOperation(operation);
startAbility(intent);
}
privatevoidstartRemoteFa(StringdeviceId){
LogUtil.info(TAG,"startRemoteFa......");
StringlocalDeviceId=
KvManagerFactory.getInstance().createKvManager(newKvManagerConfig(this)).getLocalDeviceInfo().getId();
Intentintent=newIntent();
intent.setParam(CommonData.KEY_REMOTE_DEVICEID,localDeviceId);
intent.setParam(CommonData.KEY_IS_LOCAL,false);
Operationoperation=newIntent.OperationBuilder().withDeviceId(deviceId)
.withBundleName(getBundleName())
.withAbilityName(CommonData.ABILITY_MAIN)
.withAction(CommonData.DRAW_PAGE)
.withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
.build();
intent.setOperation(operation);
startAbility(intent);
}
privateclassButtonClickimplementsComponent.ClickedListener{
@Override
publicvoidonClick(Componentcomponent){
getDevices();//啟動機器匹配
}
}
}
責任編輯:haq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
鴻蒙系統
+關注
關注
183文章
2642瀏覽量
70074 -
HarmonyOS
+關注
關注
80文章
2156瀏覽量
36246
原文標題:鴻蒙版你畫我猜,請接招!
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
分布式迭代求解策略:分布式混合電推進系統飛發一體化設計與能量管理協同優化方法
隨著全球航空業對綠色環保要求的不斷提高,分布式混合電推進系統作為傳統航空動力向全電飛行器過渡的關鍵技術,展現出巨大的發展潛力。本文圍繞半渦電分布式推進系統的動態實時建模與控制方法展開系統研究。
TiDB分布式數據庫運維實踐
TiDB 是 PingCAP 開發的開源分布式關系型數據庫,兼容 MySQL 5.7 協議,底層存儲基于 TiKV(分布式 KV 存儲)和 RocksDB。它解決的核心問題是:當單機 MySQL 無法承載數據量或寫入壓力時,提供一
分布式 IO 選型注意事項
定義? 分布式IO是一種脫離傳統集中式 IO 柜,將輸入 / 輸出模塊分散部署在工業現場設備附近,通過工業總線(如 Profinet、EtherNet/IP、Modbus TCP 等)與 PLC、MES 等控制系統實現數據交互的工業控制設備。其核心架構由 “主站 +
SC-3568HA:解鎖鴻蒙全權限API與分布式能力的工業控制平臺
傳統嵌入式開發面臨硬件碎片化、高權限功能缺失、分布式協同復雜及自動化測試不足等痛點。SC-3568HA開發板基于鴻蒙系統,通過統一內核抽象層和硬件驅動框架解決兼容問題,開放全量系統AP
深入理解分布式共識算法 Raft
“不可靠的網絡”、“不穩定的時鐘”和“節點的故障”都是在分布式系統中常見的問題,在文章開始前,我們先來看一下:如果在分布式系統中網絡不可靠會發生什么樣的問題。 有以下 3 個服務構成的
如何解決分布式光伏計量難題?
分布式光伏成增長主力 據《2025-2030年中國分布式光伏行業市場前景預測及未來發展趨勢研究報告》顯示,2024年中國分布式光伏新增裝機118.18GW,同比增長23%,占光伏新增裝機總量的43
【節能學院】Acrel-1000DP分布式光伏監控系統在奉賢平高食品 4.4MW 分布式光伏中應用
摘要:在“雙碳”和新型電力系統建設背景下,分布式光伏接入比例不斷提高,對配電網電壓、調度運行及調峰等環節造成強烈沖擊。本文設計包含平臺層、設備層二層架構體系的分布式光伏管控平臺,以及小容量工商業
分布式光伏發電監測系統技術方案
分布式光伏發電監測系統技術方案 柏峰【BF-GFQX】一、系統目標 :分布式光伏發電監測系統旨在通過智能化的監測手段,實現對分布式光伏電站的全方位、高精度、實時化管理。該系統能
一鍵部署無損網絡:EasyRoCE助力分布式存儲效能革命
分布式存儲的性能瓶頸往往在于網絡。如何構建一個高帶寬、超低時延、零丟包的無損網絡,是釋放分布式存儲全部潛力、賦能企業關鍵業務(如實時數據庫、AI訓練、高性能計算)的關鍵挑戰。
分布式光伏總出問題?安科瑞分布式光伏監控系統來“救場”
一、分布式光伏的痛點大揭秘 在 “雙碳” 目標的大力推動下,分布式光伏作為綠色能源領域的重要力量,正以前所未有的速度蓬勃發展,越來越多的企業和家庭選擇安裝分布式光伏系統。然而,隨著
雙電機分布式驅動汽車高速穩定性機電耦合控制
和控制器的工作強度。
純分享帖,需要者可點擊附件免費獲取完整資料~~~*附件:雙電機分布式驅動汽車高速穩定性機電耦合控制.pdf【免責聲明】本文系網絡轉載,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請第一時間告知,刪除內容!
發表于 06-18 16:37
鴻蒙5開發寶藏案例分享---一多開發實例(游戲)
十年前藏的現金一樣驚喜?。┻@些藏在文檔深處的\"武功秘籍\",能幫我們輕松實現分布式游戲、跨端協同這些聽起來很酷的功能。快上車,帶你解鎖鴻蒙開發的正確姿勢!
發表于 06-03 18:22
曙光存儲領跑中國分布式存儲市場
近日,賽迪顧問發布《中國分布式存儲市場研究報告(2025)》,指出2024 年中國分布式存儲市場首次超過集中式存儲,規模達 198.2 億元,增速 43.7%。
分布式光纖傳感的用途
生態災難。這些場景中,一種名為"分布式光纖傳感"的技術正悄然編織著一張無形的感知網絡,用光信號的"語言"實時翻譯著環境的細微變化。 一、技術原理:光與物質的"對話"
分布式光伏電力問題層出不窮?安科瑞分布式光伏運維系統來“救場”
一、分布式光伏電力運維,痛點大揭秘? ? 分布式光伏作為實現綠色能源轉型的關鍵一環,近年來在我國得到了迅猛發展。國家能源局數據顯示,截至 2023 年底,中國
分享一個有趣的鴻蒙分布式小游戲
評論