本文使用 Java UI 開發分布式仿抖音應用,上下滑動切換視頻,評論功能,設備遷移功能:記錄播放的視頻頁和進度、評論數據。
效果演示
①上下滑動切換視頻、點擊遷移圖標,彈框選擇在線的設備,完成視頻數據的遷移。
②點擊評論圖標查看評論,編輯評論內容并發送。點擊遷移圖標,彈框選擇在線的設備,完成評論數據的遷移。
項目結構
如下圖:
主要代碼
①上下滑動頁面
頁面切換用到系統組件PageSlider:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-component-pageslider-0000001091933258
默認左右切換,設置為上下方向: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); //設置滑動方向為上下滑動 pageSlider.setOrientation(Component.VERTICAL); //集合測試數據 ListlistData=newArrayList<>(); listData.add("第一頁"); listData.add("第二頁"); listData.add("第三頁"); //設置頁面適配器 pageSlider.setProvider(newPageSliderProvider(){ /** *獲取當前適配器中可用視圖的數量 */ @Override publicintgetCount(){ returnlistData.size(); } /** *創建頁面 */ @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); //設置數據 textContent.setText(listData.get(position)); //添加到容器中 container.addComponent(component); returncomponent; } /** *銷毀頁面 */ @Override publicvoiddestroyPageFromContainer(ComponentContainercontainer,intposition,Objectobject){ //從容器中移除 container.removeComponent((Component)object); } /** *檢查頁面是否與對象匹配 */ @Override publicbooleanisPageMatchToObject(Componentpage,Objectobject){ returntrue; } }); //添加頁面改變監聽器 pageSlider.addPageChangedListener(newPageSlider.PageChangedListener(){ /** *頁面滑動時調用 */ @Override publicvoidonPageSliding(intitemPos,floatitemPosOffset,intitemPosOffsetPixels){} /** *當頁面滑動狀態改變時調用 */ @Override publicvoidonPageSlideStateChanged(intstate){} /** *選擇新頁面時回調 */ @Override publicvoidonPageChosen(intitemPos){ //在此方法下,切換頁面獲取當前頁面的視頻源,進行播放 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); //設置視頻窗口在頂層 surfaceProvider.pinToZTop(true); //設置視頻窗口操作監聽 if(surfaceProvider.getSurfaceOps().isPresent()){ surfaceProvider.getSurfaceOps().get().addCallback(newSurfaceOps.Callback(){ /** *創建視頻窗口 */ @Override publicvoidsurfaceCreated(SurfaceOpsholder){ try{ RawFileDescriptorfileDescriptor=getResourceManager().getRawFileEntry(videoPath).openRawFileDescriptor(); Sourcesource=newSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartPosition(), fileDescriptor.getFileSize() ); //設置媒體文件 mPlayer.setSource(source); //設置播放窗口 mPlayer.setVideoSurface(holder.getSurface()); //循環播放 mPlayer.enableSingleLooping(true); //準備播放環境并緩沖媒體數據 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(); } } }
③跨設備遷移示例
跨設備遷移使用IAbilityContinuation 接口:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-page-cross-device-0000001051072880
在 entry 下的 config.json 配置權限:
"reqPermissions":[ { "name":"ohos.permission.DISTRIBUTED_DATASYNC" }, { "name":"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO" }, { "name":"ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE" } ]
實現 IAbilityContinuation 接口,說明:一個應用可能包含多個 Page,僅需要在支持遷移的 Page 中通過以下方法實現 IAbilityContinuation 接口。
同時,此 Page 所包含的所有 AbilitySlice 也需要實現此接口。
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); //申請權限 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->{ //查詢分布式網絡中所有在線設備(不包括本地設備)的信息。 ListdeviceList=DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE); if(deviceList.size()>0){ //啟動遷移,指定的設備ID continueAbility(deviceList.get(0).getDeviceId()); } }); //顯示遷移的數據 text.setText("遷移的數據:"+data); } /** *啟動遷移時首次調用此方法 *@return是否進行遷移 */ @Override publicbooleanonStartContinuation(){ returntrue; } /** *遷移時存入數據 */ @Override publicbooleanonSaveData(IntentParamsintentParams){ intentParams.setParam("data","測試數據"); returntrue; } /** *獲取遷移存入的數據,在生命周期的onStart之前執行 */ @Override publicbooleanonRestoreData(IntentParamsintentParams){ data=(String)intentParams.getParam("data"); returntrue; } /** *遷移完成 */ @Override publicvoidonCompleteContinuation(inti){} }
根據上面的核心代碼示例,了解實現原理,接下來便可以結合實際需求完善功能了。
責任編輯:haq
-
JAVA
+關注
關注
19文章
2970瀏覽量
104838 -
鴻蒙系統
+關注
關注
183文章
2636瀏覽量
66430 -
HarmonyOS
+關注
關注
79文章
1979瀏覽量
30274
原文標題:開發一個鴻蒙版“抖音”,So easy!
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論