本文使用 Java UI 開發(fā)分布式仿抖音應(yīng)用,上下滑動切換視頻,評論功能,設(shè)備遷移功能:記錄播放的視頻頁和進度、評論數(shù)據(jù)。
效果演示
①上下滑動切換視頻、點擊遷移圖標(biāo),彈框選擇在線的設(shè)備,完成視頻數(shù)據(jù)的遷移。
②點擊評論圖標(biāo)查看評論,編輯評論內(nèi)容并發(fā)送。點擊遷移圖標(biāo),彈框選擇在線的設(shè)備,完成評論數(shù)據(jù)的遷移。
項目結(jié)構(gòu)
如下圖:
主要代碼
①上下滑動頁面
頁面切換用到系統(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); //查找滑動頁面組件 PageSliderpageSlider=(PageSlider)findComponentById(ResourceTable.Id_pageSlider); //設(shè)置滑動方向為上下滑動 pageSlider.setOrientation(Component.VERTICAL); //集合測試數(shù)據(jù) ListlistData=newArrayList<>(); listData.add("第一頁"); listData.add("第二頁"); listData.add("第三頁"); //設(shè)置頁面適配器 pageSlider.setProvider(newPageSliderProvider(){ /** *獲取當(dāng)前適配器中可用視圖的數(shù)量 */ @Override publicintgetCount(){ returnlistData.size(); } /** *創(chuàng)建頁面 */ @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; } /** *銷毀頁面 */ @Override publicvoiddestroyPageFromContainer(ComponentContainercontainer,intposition,Objectobject){ //從容器中移除 container.removeComponent((Component)object); } /** *檢查頁面是否與對象匹配 */ @Override publicbooleanisPageMatchToObject(Componentpage,Objectobject){ returntrue; } }); //添加頁面改變監(jiān)聽器 pageSlider.addPageChangedListener(newPageSlider.PageChangedListener(){ /** *頁面滑動時調(diào)用 */ @Override publicvoidonPageSliding(intitemPos,floatitemPosOffset,intitemPosOffsetPixels){} /** *當(dāng)頁面滑動狀態(tài)改變時調(diào)用 */ @Override publicvoidonPageSlideStateChanged(intstate){} /** *選擇新頁面時回調(diào) */ @Override publicvoidonPageChosen(intitemPos){ //在此方法下,切換頁面獲取當(dāng)前頁面的視頻源,進行播放 Stringdata=listData.get(itemPos); } }); } }
②播放視頻
視頻播放使用Player:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/media-video-player-0000000000044178
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)聽 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(); //開始播放 mPlayer.play(); }catch(IOExceptione){ e.printStackTrace(); } } /** *視頻窗口改變 */ @Override publicvoidsurfaceChanged(SurfaceOpsholder,intformat,intwidth,intheight){} /** *視頻窗口銷毀 */ @Override publicvoidsurfaceDestroyed(SurfaceOpsholder){} }); } } @Override protectedvoidonStop(){ super.onStop(); //頁面銷毀,釋放播放器 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" } ]
實現(xiàn) IAbilityContinuation 接口,說明:一個應(yīng)用可能包含多個 Page,僅需要在支持遷移的 Page 中通過以下方法實現(xiàn) IAbilityContinuation 接口。
同時,此 Page 所包含的所有 AbilitySlice 也需要實現(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); //申請權(quán)限 if(verifySelfPermission(PERMISSION)!=IBundleManager.PERMISSION_GRANTED){ requestPermissionsFromUser(newString[]{PERMISSION},0); } Buttonbutton=(Button)findComponentById(ResourceTable.Id_button); Texttext=(Text)findComponentById(ResourceTable.Id_text); //點擊遷移 button.setClickedListener(component->{ //查詢分布式網(wǎng)絡(luò)中所有在線設(shè)備(不包括本地設(shè)備)的信息。 ListdeviceList=DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE); if(deviceList.size()>0){ //啟動遷移,指定的設(shè)備ID continueAbility(deviceList.get(0).getDeviceId()); } }); //顯示遷移的數(shù)據(jù) text.setText("遷移的數(shù)據(jù):"+data); } /** *啟動遷移時首次調(diào)用此方法 *@return是否進行遷移 */ @Override publicbooleanonStartContinuation(){ returntrue; } /** *遷移時存入數(shù)據(jù) */ @Override publicbooleanonSaveData(IntentParamsintentParams){ intentParams.setParam("data","測試數(shù)據(jù)"); returntrue; } /** *獲取遷移存入的數(shù)據(jù),在生命周期的onStart之前執(zhí)行 */ @Override publicbooleanonRestoreData(IntentParamsintentParams){ data=(String)intentParams.getParam("data"); returntrue; } /** *遷移完成 */ @Override publicvoidonCompleteContinuation(inti){} }
根據(jù)上面的核心代碼示例,了解實現(xiàn)原理,接下來便可以結(jié)合實際需求完善功能了。
責(zé)任編輯:haq
-
JAVA
+關(guān)注
關(guān)注
19文章
2974瀏覽量
104987 -
鴻蒙系統(tǒng)
+關(guān)注
關(guān)注
183文章
2638瀏覽量
66601 -
HarmonyOS
+關(guān)注
關(guān)注
79文章
1982瀏覽量
30425
原文標(biāo)題:開發(fā)一個鴻蒙版“抖音”,So easy!
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論