栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 前沿技术 > 云计算 > Docker/k8s

HarmonyOS 分布式之仿抖音应用

Docker/k8s 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力



想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

项目介绍

使用Java UI开发分布式仿抖音应用,上下滑动切换视频,评论功能,设备迁移功能:记录播放的视频页和进度、评论数据。

效果演示

1.上下滑动切换视频、点击迁移图标,弹框选择在线的设备,完成视频数据的迁移。



2.点击评论图标查看评论,编辑评论内容并发送。点击迁移图标,弹框选择在线的设备,完成评论数据的迁移。



项目结构



主要代码 1、上下滑动页面

页面切换用到系统组件PageSlider,默认左右切换,设置为上下方向:setOrientation(Component.VERTICAL);

  1. import ohos.aafwk.ability.AbilitySlice; import ohos.aafwk.content.Intent; 
  2. import ohos.agp.components.*;  
  3. import java.util.ArrayList; import java.util.List; 
  4.  public class MainAbilitySlice extends AbilitySlice { 
  5.     @Override     public void onStart(Intent intent) { 
  6.         super.onStart(intent);         super.setUIContent(ResourceTable.Layout_ability_main); 
  7.         // 查找滑动页面组件         PageSlider pageSlider = (PageSlider) findComponentById(ResourceTable.Id_pageSlider); 
  8.         // 设置滑动方向为上下滑动         pageSlider.setOrientation(Component.VERTICAL); 
  9.         // 集合测试数据         List listData=new ArrayList<>(); 
  10.         listData.add("第一页");         listData.add("第二页"); 
  11.         listData.add("第三页");          
  12.         // 设置页面适配器         pageSlider.setProvider(new PageSliderProvider() { 
  13.                          @Override 
  14.             public int getCount() {                 return listData.size(); 
  15.             }              
  16.             @Override             public Object createPageInContainer(ComponentContainer container, int position) { 
  17.                 // 查找布局                 Component component = LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_item_page, null, false); 
  18.                 Text textContent = (Text) component.findComponentById(ResourceTable.Id_text_item_page_content);                 // 设置数据 
  19.                 textContent.setText(listData.get(position));                 // 添加到容器中 
  20.                 container.addComponent(component);                 return component; 
  21.             }              
  22.             @Override             public void destroyPageFromContainer(ComponentContainer container, int position, Object object) { 
  23.                 // 从容器中移除                 container.removeComponent((Component) object); 
  24.             }              
  25.             @Override             public boolean isPageMatchToObject(Component page, Object object) { 
  26.                 return true;             } 
  27.         });  
  28.         // 添加页面改变监听器         pageSlider.addPageChangedListener(new PageSlider.PageChangedListener() { 
  29.                          @Override 
  30.             public void onPageSliding(int itemPos, float itemPosOffset, int itemPosOffsetPixels) {}              
  31.             @Override             public void onPageSlideStateChanged(int state) {} 
  32.                          @Override 
  33.             public void onPageChosen(int itemPos) {                 // 在此方法下,切换页面获取当前页面的视频源,进行播放 
  34.                 String data = listData.get(itemPos);             } 
  35.         });     } 
2、播放视频

视频播放使用Player,视频画面窗口显示使用SurfaceProvider。

  1. import ohos.aafwk.ability.AbilitySlice; import ohos.aafwk.content.Intent; 
  2. import ohos.agp.components.surfaceprovider.SurfaceProvider; import ohos.agp.graphics.SurfaceOps; 
  3. import ohos.global.resource.RawFileDescriptor; import ohos.media.common.Source; 
  4. import ohos.media.player.Player;  
  5. import java.io.IOException;  
  6. public class MainAbilitySlice extends AbilitySlice {     // 视频路径 
  7.     private final String videoPath = "resources/rawfile/HarmonyOS.mp4";     // 播放器 
  8.     private Player mPlayer;  
  9.     @Override     public void onStart(Intent intent) { 
  10.         super.onStart(intent);         super.setUIContent(ResourceTable.Layout_ability_main); 
  11.         // 初始化播放器         mPlayer = new Player(getContext()); 
  12.         // 查找视频窗口组件         SurfaceProvider surfaceProvider = (SurfaceProvider) findComponentById(ResourceTable.Id_surfaceProvider); 
  13.         // 设置视频窗口在顶层         surfaceProvider.pinToZTop(true); 
  14.         // 设置视频窗口操作监听         if (surfaceProvider.getSurfaceOps().isPresent()) { 
  15.             surfaceProvider.getSurfaceOps().get().addCallback(new SurfaceOps.Callback() {                  
  16.                 @Override                 public void surfaceCreated(SurfaceOps holder) { 
  17.                     try {                         RawFileDescriptor fileDescriptor = getResourceManager().getRawFileEntry(videoPath).openRawFileDescriptor(); 
  18.                         Source source = new Source(fileDescriptor.getFileDescriptor(),                                 fileDescriptor.getStartPosition(), 
  19.                                 fileDescriptor.getFileSize()                         ); 
  20.                         // 设置媒体文件                         mPlayer.setSource(source); 
  21.                         // 设置播放窗口                         mPlayer.setVideoSurface(holder.getSurface()); 
  22.                         // 循环播放                         mPlayer.enableSingleLooping(true); 
  23.                         // 准备播放环境并缓冲媒体数据                         mPlayer.prepare(); 
  24.                         // 开始播放                         mPlayer.play(); 
  25.                     } catch (IOException e) {                         e.printStackTrace(); 
  26.                     }  
  27.                 }                  
  28.                 @Override                 public void surfaceChanged(SurfaceOps holder, int format, int width, int height) {} 
  29.                                  @Override 
  30.                 public void surfaceDestroyed(SurfaceOps holder) {}             }); 
  31.         }     } 
  32.      @Override 
  33.     protected void onStop() {         super.onStop(); 
  34.         // 页面销毁,释放播放器         if (mPlayer != null) { 
  35.             mPlayer.stop();             mPlayer.release(); 
  36.         }     } 
3、跨设备迁移示例

跨设备迁移使用IAbilityContinuation接口。

1、在entry下的config.json配置权限

  1. "reqPermissions": [       { 
  2.         "name": "ohos.permission.DISTRIBUTED_DATASYNC"       }, 
  3.       {         "name": "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO" 
  4.       },       { 
  5.         "name": "ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"       } 
  6.     ] 

2、实现IAbilityContinuation接口,说明:一个应用可能包含多个Page,仅需要在支持迁移的Page中通过以下方法实现IAbilityContinuation接口。同时,此Page所包含的所有AbilitySlice也需要实现此接口。

  1. import ohos.aafwk.ability.AbilitySlice; import ohos.aafwk.ability.IAbilityContinuation; 
  2. import ohos.aafwk.content.Intent; import ohos.aafwk.content.IntentParams; 
  3. import ohos.agp.components.Button; import ohos.agp.components.Text; 
  4. import ohos.bundle.IBundleManager; import ohos.distributedschedule.interwork.DeviceInfo; 
  5. import ohos.distributedschedule.interwork.DeviceManager;  
  6. import java.util.List;  
  7. public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuation {     private String data = ""; 
  8.     String PERMISSION = "ohos.permission.DISTRIBUTED_DATASYNC";  
  9.     @Override     public void onStart(Intent intent) { 
  10.         super.onStart(intent);         super.setUIContent(ResourceTable.Layout_ability_main); 
  11.         // 申请权限         if (verifySelfPermission(PERMISSION) != IBundleManager.PERMISSION_GRANTED) { 
  12.             requestPermissionsFromUser(new String[]{PERMISSION}, 0);         } 
  13.         Button button = (Button)findComponentById(ResourceTable.Id_button);         Text text = (Text)findComponentById(ResourceTable.Id_text); 
  14.                  // 点击迁移 
  15.         button.setClickedListener(component -> {             // 查询分布式网络中所有在线设备(不包括本地设备)的信息。 
  16.             List deviceList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);             if (deviceList.size()>0) { 
  17.                 // 启动迁移,指定的设备ID                 continueAbility(deviceList.get(0).getDeviceId()); 
  18.             }         }); 
  19.         // 显示迁移的数据         text.setText("迁移的数据:"+data); 
  20.     }          @Override 
  21.     public boolean onStartContinuation() {         return true; 
  22.     }      
  23.     @Override     public boolean onSaveData(IntentParams intentParams) { 
  24.         intentParams.setParam("data","测试数据");         return true; 
  25.     }      
  26.     @Override     public boolean onRestoreData(IntentParams intentParams) { 
  27.         data= (String) intentParams.getParam("data");         return true; 
  28.     }      
  29.     @Override     public void onCompleteContinuation(int i) {} 

根据上面的核心代码示例,了解实现原理,接下来便可以结合实际需求完善功能了。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com



 

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/796756.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号