国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

HarmonyOS 分布式之仿抖音應(yīng)用

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

[[430075]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

項(xiàng)目介紹

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

效果演示

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

2.點(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)

主要代碼

1、上下滑動(dòng)頁面

頁面切換用到系統(tǒng)組件PageSlider,默認(rèn)左右切換,設(shè)置為上下方向:setOrientation(Component.VERTICAL);

  1. import ohos.aafwk.ability.AbilitySlice; 
  2. import ohos.aafwk.content.Intent; 
  3. import ohos.agp.components.*; 
  4.  
  5. import java.util.ArrayList; 
  6. import java.util.List; 
  7.  
  8. public class MainAbilitySlice extends AbilitySlice { 
  9.     @Override 
  10.     public void onStart(Intent intent) { 
  11.         super.onStart(intent); 
  12.         super.setUIContent(ResourceTable.Layout_ability_main); 
  13.         // 查找滑動(dòng)頁面組件 
  14.         PageSlider pageSlider = (PageSlider) findComponentById(ResourceTable.Id_pageSlider); 
  15.         // 設(shè)置滑動(dòng)方向?yàn)樯舷禄瑒?dòng) 
  16.         pageSlider.setOrientation(Component.VERTICAL); 
  17.         // 集合測(cè)試數(shù)據(jù) 
  18.         List<String> listData=new ArrayList<>(); 
  19.         listData.add("第一頁"); 
  20.         listData.add("第二頁"); 
  21.         listData.add("第三頁"); 
  22.          
  23.         // 設(shè)置頁面適配器 
  24.         pageSlider.setProvider(new PageSliderProvider() { 
  25.             /** 
  26.              * 獲取當(dāng)前適配器中可用視圖的數(shù)量 
  27.              */ 
  28.             @Override 
  29.             public int getCount() { 
  30.                 return listData.size(); 
  31.             } 
  32.             /** 
  33.              * 創(chuàng)建頁面 
  34.              */ 
  35.             @Override 
  36.             public Object createPageInContainer(ComponentContainer container, int position) { 
  37.                 // 查找布局 
  38.                 Component component = LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_item_page, nullfalse); 
  39.                 Text textContent = (Text) component.findComponentById(ResourceTable.Id_text_item_page_content); 
  40.                 // 設(shè)置數(shù)據(jù) 
  41.                 textContent.setText(listData.get(position)); 
  42.                 // 添加到容器中 
  43.                 container.addComponent(component); 
  44.                 return component; 
  45.             } 
  46.             /** 
  47.              * 銷毀頁面 
  48.              */ 
  49.             @Override 
  50.             public void destroyPageFromContainer(ComponentContainer container, int position, Object object) { 
  51.                 // 從容器中移除 
  52.                 container.removeComponent((Component) object); 
  53.             } 
  54.             /** 
  55.              * 檢查頁面是否與對(duì)象匹配 
  56.              */ 
  57.             @Override 
  58.             public boolean isPageMatchToObject(Component page, Object object) { 
  59.                 return true
  60.             } 
  61.         }); 
  62.  
  63.         // 添加頁面改變監(jiān)聽器 
  64.         pageSlider.addPageChangedListener(new PageSlider.PageChangedListener() { 
  65.             /** 
  66.              * 頁面滑動(dòng)時(shí)調(diào)用 
  67.              */ 
  68.             @Override 
  69.             public void onPageSliding(int itemPos, float itemPosOffset, int itemPosOffsetPixels) {} 
  70.             /** 
  71.              * 當(dāng)頁面滑動(dòng)狀態(tài)改變時(shí)調(diào)用 
  72.              */ 
  73.             @Override 
  74.             public void onPageSlideStateChanged(int state) {} 
  75.             /** 
  76.              * 選擇新頁面時(shí)回調(diào) 
  77.              */ 
  78.             @Override 
  79.             public void onPageChosen(int itemPos) { 
  80.                 // 在此方法下,切換頁面獲取當(dāng)前頁面的視頻源,進(jìn)行播放 
  81.                 String data = listData.get(itemPos); 
  82.             } 
  83.         }); 
  84.     } 

2、播放視頻

視頻播放使用Player,視頻畫面窗口顯示使用SurfaceProvider。

  1. import ohos.aafwk.ability.AbilitySlice; 
  2. import ohos.aafwk.content.Intent; 
  3. import ohos.agp.components.surfaceprovider.SurfaceProvider; 
  4. import ohos.agp.graphics.SurfaceOps; 
  5. import ohos.global.resource.RawFileDescriptor; 
  6. import ohos.media.common.Source; 
  7. import ohos.media.player.Player; 
  8.  
  9. import java.io.IOException; 
  10.  
  11. public class MainAbilitySlice extends AbilitySlice { 
  12.     // 視頻路徑 
  13.     private final String videoPath = "resources/rawfile/HarmonyOS.mp4"
  14.     // 播放器 
  15.     private Player mPlayer; 
  16.  
  17.     @Override 
  18.     public void onStart(Intent intent) { 
  19.         super.onStart(intent); 
  20.         super.setUIContent(ResourceTable.Layout_ability_main); 
  21.         // 初始化播放器 
  22.         mPlayer = new Player(getContext()); 
  23.         // 查找視頻窗口組件 
  24.         SurfaceProvider surfaceProvider = (SurfaceProvider) findComponentById(ResourceTable.Id_surfaceProvider); 
  25.         // 設(shè)置視頻窗口在頂層 
  26.         surfaceProvider.pinToZTop(true); 
  27.         // 設(shè)置視頻窗口操作監(jiān)聽 
  28.         if (surfaceProvider.getSurfaceOps().isPresent()) { 
  29.             surfaceProvider.getSurfaceOps().get().addCallback(new SurfaceOps.Callback() { 
  30.                 /** 
  31.                  * 創(chuàng)建視頻窗口 
  32.                  */ 
  33.                 @Override 
  34.                 public void surfaceCreated(SurfaceOps holder) { 
  35.                     try { 
  36.                         RawFileDescriptor fileDescriptor = getResourceManager().getRawFileEntry(videoPath).openRawFileDescriptor(); 
  37.                         Source source = new Source(fileDescriptor.getFileDescriptor(), 
  38.                                 fileDescriptor.getStartPosition(), 
  39.                                 fileDescriptor.getFileSize() 
  40.                         ); 
  41.                         // 設(shè)置媒體文件 
  42.                         mPlayer.setSource(source); 
  43.                         // 設(shè)置播放窗口 
  44.                         mPlayer.setVideoSurface(holder.getSurface()); 
  45.                         // 循環(huán)播放 
  46.                         mPlayer.enableSingleLooping(true); 
  47.                         // 準(zhǔn)備播放環(huán)境并緩沖媒體數(shù)據(jù) 
  48.                         mPlayer.prepare(); 
  49.                         // 開始播放 
  50.                         mPlayer.play(); 
  51.                     } catch (IOException e) { 
  52.                         e.printStackTrace(); 
  53.                     } 
  54.  
  55.                 } 
  56.                 /** 
  57.                  * 視頻窗口改變 
  58.                  */ 
  59.                 @Override 
  60.                 public void surfaceChanged(SurfaceOps holder, int format, int width, int height) {} 
  61.                 /** 
  62.                  * 視頻窗口銷毀 
  63.                  */ 
  64.                 @Override 
  65.                 public void surfaceDestroyed(SurfaceOps holder) {} 
  66.             }); 
  67.         } 
  68.     } 
  69.  
  70.     @Override 
  71.     protected void onStop() { 
  72.         super.onStop(); 
  73.         // 頁面銷毀,釋放播放器 
  74.         if (mPlayer != null) { 
  75.             mPlayer.stop(); 
  76.             mPlayer.release(); 
  77.         } 
  78.     } 

3、跨設(shè)備遷移示例

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

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

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

2、實(shí)現(xiàn)IAbilityContinuation接口,說明:一個(gè)應(yīng)用可能包含多個(gè)Page,僅需要在支持遷移的Page中通過以下方法實(shí)現(xiàn)IAbilityContinuation接口。同時(shí),此Page所包含的所有AbilitySlice也需要實(shí)現(xiàn)此接口。

  1. import ohos.aafwk.ability.AbilitySlice; 
  2. import ohos.aafwk.ability.IAbilityContinuation; 
  3. import ohos.aafwk.content.Intent; 
  4. import ohos.aafwk.content.IntentParams; 
  5. import ohos.agp.components.Button; 
  6. import ohos.agp.components.Text; 
  7. import ohos.bundle.IBundleManager; 
  8. import ohos.distributedschedule.interwork.DeviceInfo; 
  9. import ohos.distributedschedule.interwork.DeviceManager; 
  10.  
  11. import java.util.List; 
  12.  
  13. public class MainAbilitySlice extends AbilitySlice implements IAbilityContinuation { 
  14.     private String data = ""
  15.     String PERMISSION = "ohos.permission.DISTRIBUTED_DATASYNC"
  16.  
  17.     @Override 
  18.     public void onStart(Intent intent) { 
  19.         super.onStart(intent); 
  20.         super.setUIContent(ResourceTable.Layout_ability_main); 
  21.         // 申請(qǐng)權(quán)限 
  22.         if (verifySelfPermission(PERMISSION) != IBundleManager.PERMISSION_GRANTED) { 
  23.             requestPermissionsFromUser(new String[]{PERMISSION}, 0); 
  24.         } 
  25.         Button button = (Button)findComponentById(ResourceTable.Id_button); 
  26.         Text text = (Text)findComponentById(ResourceTable.Id_text); 
  27.          
  28.         // 點(diǎn)擊遷移 
  29.         button.setClickedListener(component -> { 
  30.             // 查詢分布式網(wǎng)絡(luò)中所有在線設(shè)備(不包括本地設(shè)備)的信息。 
  31.             List<DeviceInfo> deviceList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE); 
  32.             if (deviceList.size()>0) { 
  33.                 // 啟動(dòng)遷移,指定的設(shè)備ID 
  34.                 continueAbility(deviceList.get(0).getDeviceId()); 
  35.             } 
  36.         }); 
  37.         // 顯示遷移的數(shù)據(jù) 
  38.         text.setText("遷移的數(shù)據(jù):"+data); 
  39.     } 
  40.     /** 
  41.      * 啟動(dòng)遷移時(shí)首次調(diào)用此方法 
  42.      * @return 是否進(jìn)行遷移 
  43.      */ 
  44.     @Override 
  45.     public boolean onStartContinuation() { 
  46.         return true
  47.     } 
  48.     /** 
  49.      * 遷移時(shí)存入數(shù)據(jù) 
  50.      */ 
  51.     @Override 
  52.     public boolean onSaveData(IntentParams intentParams) { 
  53.         intentParams.setParam("data","測(cè)試數(shù)據(jù)"); 
  54.         return true
  55.     } 
  56.     /** 
  57.      * 獲取遷移存入的數(shù)據(jù),在生命周期的onStart之前執(zhí)行 
  58.      */ 
  59.     @Override 
  60.     public boolean onRestoreData(IntentParams intentParams) { 
  61.         data= (String) intentParams.getParam("data"); 
  62.         return true
  63.     } 
  64.     /** 
  65.      * 遷移完成 
  66.      */ 
  67.     @Override 
  68.     public void onCompleteContinuation(int i) {} 

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

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-11-16 09:38:10

鴻蒙HarmonyOS應(yīng)用

2018-07-17 08:14:22

分布式分布式鎖方位

2021-12-13 11:07:10

鴻蒙HarmonyOS應(yīng)用

2021-01-21 09:45:36

鴻蒙HarmonyOS分布式

2020-11-06 12:12:35

HarmonyOS

2025-06-13 07:30:51

2021-05-28 09:52:00

鴻蒙HarmonyOS應(yīng)用

2022-03-06 21:43:05

Citus架構(gòu)PostgreSQL

2019-02-13 13:41:07

MemCache分布式HashMap

2019-09-26 15:43:52

Hadoop集群防火墻

2018-12-14 10:06:22

緩存分布式系統(tǒng)

2021-12-10 15:06:56

鴻蒙HarmonyOS應(yīng)用

2021-12-02 10:11:44

鴻蒙HarmonyOS應(yīng)用

2021-07-23 08:57:32

鴻蒙HarmonyOS應(yīng)用

2019-10-10 09:16:34

Zookeeper架構(gòu)分布式

2021-07-22 10:20:21

鴻蒙HarmonyOS應(yīng)用

2023-01-09 11:23:03

系統(tǒng)

2019-06-19 15:40:06

分布式鎖RedisJava

2017-09-01 05:35:58

分布式計(jì)算存儲(chǔ)

2023-05-29 14:07:00

Zuul網(wǎng)關(guān)系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久热在线中文字幕色999舞| 韩国中文免费在线视频| 欧美日韩国产首页| 欧美日韩一区二区欧美激情| 亚洲男女自偷自拍| 中文一区在线播放| 亚洲精品av在线播放| 国产日韩欧美综合| 日韩一二三区视频| 91精品国产99| 亚洲日穴在线视频| 欧美一级二级三级乱码| 国产一级二级在线| 免费视频观看成人| 玖玖玖国产精品| 欧美一级视频精品观看| 国产精品mp4| 激情视频国产| jizz18欧美18| 99r精品视频| 亚洲欧洲美洲在线综合| 亚洲福利在线看| 91精品在线影院| 国产对白在线播放| www.av亚洲| 黄色另类av| 国产精品夫妻自拍| 欧美日本高清一区| 免费av网址在线| 麻豆一区在线| 国产欧美一区二区三区在线看蜜臀 | 外国电影一区二区| 成人午夜av在线| 日韩专区中文字幕| 午夜视频你懂的| 日韩区欧美区| 色妹子一区二区| 亚洲欧美国产精品桃花| 欧美爱爱视频| 欧美中文在线观看国产| 老司机aⅴ毛片免费观看| 另类ts人妖一区二区三区| 午夜精品一区在线观看| 色播亚洲婷婷| 伊人久久亚洲| 69精品人人人人| 日韩中文字幕三区| 午夜精品久久| 一道本无吗dⅴd在线播放一区 | а天堂中文在线官网| 成人av在线播放网址| 欧美在线亚洲在线| 91国偷自产一区二区三区观看| 免费观看v片在线观看| 久久狠狠婷婷| 久久精品中文字幕一区二区三区| 7777在线视频| 国产精品qvod| 日韩一区二区三| 欧美综合影院| 日韩一区国产二区欧美三区| 色是在线视频| 欧美日韩亚洲精品内裤| 一区二区三区av在线| 欧美日韩国产在线观看网站| 天天影视欧美综合在线观看| xxxxx成人.com| 日韩午夜av| 欧美自拍大量在线观看| 色噜噜狠狠色综合网| 亚洲精选在线视频| 国产精品自拍合集| 99精品视频免费全部在线| 天天爽夜夜爽一区二区三区| 亚洲精品影院在线观看| 欧美久久精品午夜青青大伊人| 日韩精品午夜| 国内揄拍国内精品少妇国语| 国产91精品久久久| 97久久中文字幕| 亚洲午夜在线电影| 性生交免费视频| 亚洲精品短视频| 久久久天天操| 亚洲小说区图片| 91精品国产麻豆国产自产在线 | 亚洲午夜精品一区 二区 三区| 2019亚洲男人天堂| 亚洲欧洲日韩在线| 在线资源免费观看| 欧美在线观看一区二区| 欧美私人网站| 精品对白一区国产伦| 国产亚洲欧美中文| 国产在线视频欧美一区二区三区| 色婷婷色综合| 色视频在线观看免费| 91精品视频网| 久久99精品久久久久久久久久久久 | 欧美日韩国产成人| 亚洲激情五月婷婷| 日韩成人影视| 日韩在线观看免费高清| 日本一区二区三区高清不卡| 99精品国产九九国产精品| 石原莉奈一区二区三区高清在线| 欧美性猛交xxxx偷拍洗澡| 精品视频在线一区二区| 久久香蕉国产线看观看av| 午夜激情综合网| 国产最新精品免费| 成人女性文胸| 亚洲精品99久久久久中文字幕| 亚洲人成伊人成综合网小说| 久久国产精品99国产| а天堂中文最新一区二区三区| 亚洲私人影吧| 国色天香2019中文字幕在线观看| 疯狂欧美牲乱大交777| 国产一区二区福利| 天天综合网91| 日韩av综合| 69堂免费精品视频在线播放| 91免费在线视频| 日韩网站免费观看高清| 日本精品视频一区二区三区| 91丨porny丨中文| 日日夜夜精品一区| 逼特逼视频在线| 国产 欧美 日本| 7777精品伊人久久久大香线蕉| 亚洲免费视频网站| 亚洲一区二区网站| 亚洲综合中文| 中文在线一区| 久久av高潮av| 国产乱淫av片杨贵妃| 久久综合中文| 日本中文字幕在线观看| 不卡视频一区| 欧美videosex性欧美黑吊| 亚洲国产欧美久久| 亚洲综合精品| 黄av在线播放| 亚洲精品中文字幕在线| 精品国产免费人成在线观看| 裸体一区二区| 激情视频网站在线播放色| 在线精品一区二区| 一本色道久久综合亚洲二区三区| 欧美日韩的一区二区| 亚洲国产老妈| 久久www视频| 亚洲香蕉伊综合在人在线视看| 视频欧美精品| 欧美精品99久久| 国产69精品久久久久9999| 中文字幕一区二区在线播放| 区一区二视频| 日韩成人三级视频| 久久成人精品视频| 一区二区三区在线免费观看| 天天做综合网| 超碰在线99| 久久精品影视大全| 日本一区二区动态图| 久久日一线二线三线suv| 国产在线观看免费麻豆| 一本久道中文无码字幕av| 欧美精品123区| 国产精品s色| 粉嫩一区二区三区四区公司1| 视频一区中文字幕精品| 色天天久久综合婷婷女18| 99久久婷婷国产综合精品青牛牛 | 国模无码视频一区二区三区| 国产色婷婷亚洲99精品小说| 99v久久综合狠狠综合久久| 午夜日韩av| 日韩国产一区| 成人av综合网| 1204国产成人精品视频| 国际精品欧美精品| 日本a级片电影一区二区| 日韩午夜激情视频| 丰满岳妇乱一区二区三区| 欧美性猛交xxxx乱大交3| 欧美性xxxx极品hd欧美风情| 91美女片黄在线观看91美女| 中文字幕中文字幕一区| 国产精品美女视频| 国产区在线看| 久久66热re国产| 久久夜精品va视频免费观看| 亚洲一区二区少妇| 亚洲欧美一区二区不卡| 亚洲欧美日韩中文字幕一区二区三区| 国产精品久久久久久久第一福利| 亚洲欧美日韩在线| 欧美福利电影网|