HarmonyOSが配布するTikTok風アプリ

HarmonyOSが配布するTikTok風アプリ

[[430075]]

詳細については、以下をご覧ください。

51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ

https://harmonyos..com

プロジェクト紹介

Java UI を使用して、分散型 TikTok のようなアプリケーションを開発します。上下にスライドしてビデオを切り替える機能、コメント機能、デバイス移行機能、再生されたビデオ ページと進行状況、コメント データを記録します。

効果のデモンストレーション

1. 上下にスワイプしてビデオを切り替え、移行アイコンをクリックし、ポップアップウィンドウでオンラインデバイスを選択して、ビデオデータの移行を完了します。

2. コメントアイコンをクリックしてコメントを表示し、コメントの内容を編集して送信します。移行アイコンをクリックするとポップアップウィンドウが表示されるので、オンラインデバイスを選択してコメントデータの移行を完了します。

プロジェクト構造

メインコード

1. ページを上下にスライドします

ページ切り替えには、システム コンポーネント PageSlider を使用します。これは、デフォルトで左右に切り替わり、上下に設定されています: setOrientation(Component.VERTICAL);

  1. ohos.aafwk.ability.AbilitySlice をインポートします。
  2. ohos.aafwk.content.Intent をインポートします。
  3. ohos.agp.components.* をインポートします。
  4.  
  5. java.util.ArrayList をインポートします。
  6. java.util.List をインポートします。
  7.  
  8. パブリッククラス MainAbilitySlice は AbilitySlice を拡張します {
  9. @オーバーライド
  10. パブリックvoid onStart(インテント インテント) {
  11. super.onStart(インテント);
  12. UIContent をスーパーに設定します。
  13. // スライディングページコンポーネントを見つける
  14. ページスライダー pageSlider = (PageSlider) findComponentById(ResourceTable.Id_pageSlider);
  15. // スライド方向を上下に設定する
  16. pageSlider.setOrientation(Component.VERTICAL);
  17. //テストデータの収集
  18. リスト<文字列> listData=新しいArrayList<>();
  19. listData.add ( "最初のページ" );
  20. listData.add ( "2ページ目" );
  21. listData.add ( "ページ3" );
  22.          
  23. // ページアダプタを設定する
  24. pageSlider.setProvider(新しいPageSliderProvider() {
  25. /**
  26. * 現在のアダプタで利用可能なビューの数を取得します
  27. */
  28. @オーバーライド
  29. 公共 整数getCount() {
  30. listData.size ()を返します
  31. }
  32. /**
  33. * ページを作成する
  34. */
  35. @オーバーライド
  36. パブリックオブジェクトcreatePageInContainer(ComponentContainerコンテナ、 int位置) {
  37. // レイアウトを見つける
  38. コンポーネント コンポーネント = LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_item_page, null , false );
  39. テキスト textContent = (テキスト) component.findComponentById(ResourceTable.Id_text_item_page_content);
  40. //データを設定する
  41. textContent.setText(listData.get(position));
  42. // コンテナに追加
  43. コンテナにコンポーネントを追加します。
  44. コンポーネントを返します
  45. }
  46. /**
  47. * ページを破棄する
  48. */
  49. @オーバーライド
  50. public void destroyPageFromContainer(ComponentContainer コンテナ、 int位置、Object オブジェクト) {
  51. // コンテナから削除
  52. container.removeComponent((コンポーネント) オブジェクト);
  53. }
  54. /**
  55. * ページがオブジェクトと一致しているかどうかを確認する
  56. */
  57. @オーバーライド
  58. public boolean isPageMatchToObject(コンポーネントページ、オブジェクトオブジェクト) {
  59. 戻る 真実;
  60. }
  61. });
  62.  
  63. // ページ変更リスナーを追加
  64. pageSlider.addPageChangedListener(新しいPageSlider.PageChangedListener() {
  65. /**
  66. * ページがスライドするときに呼び出されます
  67. */
  68. @オーバーライド
  69. パブリックvoid onPageSliding( int itemPos, float itemPosOffset, int itemPosOffsetPixels) {}
  70. /**
  71. * ページのスライド状態が変わったときに呼び出されます
  72. */
  73. @オーバーライド
  74. パブリックvoid onPageSlideStateChanged( int state) {}
  75. /**
  76. * 新しいページが選択されたときのコールバック
  77. */
  78. @オーバーライド
  79. パブリックvoid onPageChosen( int itemPos) {
  80. // このメソッドでは、ページを切り替えて現在のページのビデオソースを取得し、再生します
  81. 文字列データ = listData.get(itemPos);
  82. }
  83. });
  84. }
  85. }

2. ビデオを再生する

ビデオは Player を使用して再生され、ビデオ ウィンドウは SurfaceProvider を使用して表示されます。

  1. ohos.aafwk.ability.AbilitySlice をインポートします。
  2. ohos.aafwk.content.Intent をインポートします。
  3. ohos.agp.components.surfaceprovider.SurfaceProvider をインポートします。
  4. ohos.agp.graphics.SurfaceOps をインポートします。
  5. ohos をインポートします。グローバル.resource.RawFileDescriptor;
  6. ohos.media.common.Source をインポートします。
  7. ohos.media.player.Player をインポートします。
  8.  
  9. java.io.IOException をインポートします。
  10.  
  11. パブリッククラス MainAbilitySlice は AbilitySlice を拡張します {
  12. // ビデオパス
  13. プライベート最終文字列ビデオパス = "resources/rawfile/HarmonyOS.mp4" ;
  14. //プレーヤー
  15. プライベートプレーヤー mPlayer;
  16.  
  17. @オーバーライド
  18. パブリックvoid onStart(インテント インテント) {
  19. super.onStart(インテント);
  20. UIContent をスーパーに設定します。
  21. // プレーヤーを初期化する
  22. mPlayer = 新しいプレーヤー(getContext());
  23. // ビデオウィンドウコンポーネントを見つける
  24. サーフェスプロバイダー surfaceProvider = (サーフェスプロバイダー) findComponentById(ResourceTable.Id_surfaceProvider);
  25. // ビデオウィンドウを最前面に設定する
  26. サーフェスプロバイダー。ZTop にピンを置きます ( true );
  27. // ビデオウィンドウ操作監視を設定する
  28. (surfaceProvider.getSurfaceOps().isPresent())の場合{
  29. サーフェスプロバイダー.getSurfaceOps().get().addCallback(新しいサーフェスOps.Callback() {
  30. /**
  31. * ビデオウィンドウを作成する
  32. */
  33. @オーバーライド
  34. パブリックvoid サーフェス作成済み(SurfaceOps ホルダー) {
  35. 試す {
  36. RawFileDescriptor ファイル記述子 = getResourceManager().getRawFileEntry(videoPath).openRawFileDescriptor();
  37. ソースソース = new Source(fileDescriptor.getFileDescriptor(),
  38. ファイル記述子.getStartPosition()、
  39. ファイル記述子.getFileSize()
  40. );
  41. // メディアファイルを設定する
  42. mPlayer.setSource(ソース);
  43. // 再生ウィンドウを設定する
  44. mPlayer.setVideoSurface(holder.getSurface());
  45. // ループ再生
  46. mPlayer.enableSingleLooping( true );
  47. // 再生環境を準備し、メディアデータをバッファリングする
  48. mPlayerを準備します
  49. // 再生を開始
  50. mPlayer.play();
  51. } キャッチ (IOException e) {
  52. e.printStackTrace();
  53. }
  54.  
  55. }
  56. /**
  57. * ビデオウィンドウの変更
  58. */
  59. @オーバーライド
  60. パブリックvoid surfaceChanged(SurfaceOps ホルダー、 int形式、 int幅、 int高さ) {}
  61. /**
  62. * ビデオウィンドウが破壊されました
  63. */
  64. @オーバーライド
  65. パブリックvoid サーフェス破棄 (SurfaceOps ホルダー) {}
  66. });
  67. }
  68. }
  69.  
  70. @オーバーライド
  71. 保護されたvoid onStop() {
  72. スーパーのonStop();
  73. //ページを破棄してプレーヤーを解放する
  74. mPlayer != null の場合{
  75. mPlayerを停止します。
  76. mPlayer をリリースします。
  77. }
  78. }
  79. }

3. デバイス間の移行例

デバイス間の移行では、IAbilityContinuation インターフェースが使用されます。

1. config.jsonのエントリで権限を設定する

  1. 「必要な権限」 : [
  2. {
  3. 「名前」 : 「ohos.permission.DISTRIBUTED_DATASYNC」  
  4. },
  5. {
  6. 「名前」 : 「ohos.permission.GET_DISTRIBUTED_DEVICE_INFO」  
  7. },
  8. {
  9. 「名前」 : 「ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE」  
  10. }
  11. ]

2. IABilityContinuation インターフェースを実装します。注: アプリケーションには複数のページが含まれる場合があります。次の方法で移行をサポートするページに IABilityContinuation インターフェイスを実装するだけで済みます。同時に、このページに含まれるすべての AbilitySlices もこのインターフェースを実装する必要があります。

  1. ohos.aafwk.ability.AbilitySlice をインポートします。
  2. ohos.aafwk.ability.IAbilityContinuation をインポートします。
  3. ohos.aafwk.content.Intent をインポートします。
  4. ohos.aafwk.content.IntentParams をインポートします。
  5. ohos.agp.components.Button をインポートします。
  6. ohos.agp.components.Text をインポートします。
  7. ohos.bundle.IBundleManager をインポートします。
  8. ohos.distributedschedule.interwork.DeviceInfo をインポートします。
  9. ohos.distributedschedule.interwork.DeviceManager をインポートします。
  10.  
  11. java.util.List をインポートします。
  12.  
  13. パブリッククラス MainAbilitySlice は AbilitySlice を拡張し、IAbilityContinuation を実装します {
  14. プライベート文字列データ = "" ;
  15. 文字列 PERMISSION = "ohos.permission.DISTRIBUTED_DATASYNC" ;
  16.  
  17. @オーバーライド
  18. パブリックvoid onStart(インテント インテント) {
  19. super.onStart(インテント);
  20. UIContent をスーパーに設定します。
  21. // 権限を申請する
  22. (verifySelfPermission(PERMISSION) != IBundleManager.PERMISSION_GRANTED)の場合 {
  23. requestPermissionsFromUser(新しい文字列[]{PERMISSION}, 0);
  24. }
  25. ボタン button = (Button)findComponentById(ResourceTable.Id_button);
  26. テキスト text = (Text)findComponentById(ResourceTable.Id_text);
  27.          
  28. // クリックして移行
  29. button.setClickedListener(コンポーネント -> {
  30. // 分散ネットワーク内のすべてのオンライン デバイス (ローカル デバイスを除く) の情報を照会します。
  31. リスト<DeviceInfo> deviceList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
  32. (デバイスリストのサイズ()>0)の場合{
  33. // 移行を開始し、デバイスIDを指定します
  34. 継続能力(デバイスリスト.get(0).getDeviceId());
  35. }
  36. });
  37. // 移行したデータを表示する
  38. text.setText( "移行データ: " +data);
  39. }
  40. /**
  41. * このメソッドは移行を開始するときに初めて呼び出されます
  42. * @return移行するかどうか
  43. */
  44. @オーバーライド
  45. パブリックブールonStartContinuation() {
  46. 戻る 真実;
  47. }
  48. /**
  49. * 移行中にデータを保存する
  50. */
  51. @オーバーライド
  52. パブリックブールonSaveData(IntentParamsintentParams) {
  53. intentParams.setParam( "データ" , "テストデータ" );
  54. 戻る 真実;
  55. }
  56. /**
  57. * 移行に保存されたデータを取得し、ライフサイクルのonStartの前に実行する
  58. */
  59. @オーバーライド
  60. パブリックブールonRestoreData(IntentParamsintentParams) {
  61. data= (文字列) intentParams.getParam( "data" );
  62. 戻る 真実;
  63. }
  64. /**
  65. * 移行完了
  66. */
  67. @オーバーライド
  68. パブリックvoid onCompleteContinuation( int i) {}
  69. }

上記のコアコード例に従って、実装の原則を理解し、実際のニーズに応じて機能を改善できます。

詳細については、以下をご覧ください。

51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ

https://harmonyos..com

<<:  ZooKeeperの分散構成については、この記事を読んでください

>>:  エッジコンピューティングをクラウドコンピューティングアーキテクチャに統合することの利点と欠点

推薦する

アマゾン ウェブ サービスは、文部科学省の需給マッチング雇用・教育プロジェクトに選ばれ、クラウド人材の育成と科学研究の進歩を継続的に支援します。

アマゾン ウェブ サービスは11月3日、教育部大学学生局の需給マッチング就職教育プロジェクト第2期に...

インターネットが伝統的なビジネスを変える:占いソフトウェアがオンライン葬儀に料金を請求

占い、性格分析、ゆるキャラ、生贄など伝統的なビジネスは、インターネット上でどのように生き残ることがで...

人生を大切にしてSEOから離れましょう

長い間、SEO について語っていませんでした。基本的に、私を知っている人は、SEO に携わっている人...

今年、ライブストリーミングが急に人気になったのはなぜでしょうか?

ニッチな韓国のスキンケアブランドであるヘノは中国ではあまり知られていないが、主力の洗顔料はアンカーの...

共同購入の参加費が初めて公開:出品料は3,000元から10,000元

これまで共同購入業界では「口に出せない秘密」とされてきた参加費が、初めて公表された。記者は昨日、6月...

Baidu の 7.14 ブラックフライデー事件についての簡単な議論

昨夜、多くのウェブマスターがため息をついたかもしれません。「夜は長くて眠れない」。百度は昨夜、もう一...

エンタープライズハイブリッドクラウドの将来はどうなるのでしょうか?

NetJets の最高技術責任者 Troy Gibson 氏は、企業ビジョンとしてクラウドをターゲッ...

ブラックジューン後のウェブサイト最適化はどこで行うべきでしょうか?

ブラックジューン後、ウェブサイトの最適化はどこへ向かうべきでしょうか?この疑問に悩む人は多いのではな...

#おすすめ# Hostgator: 17周年、仮想ホストの前代未聞の割引、年間17ドル+ドメイン名無料

Hostgator、この仮想ホスティングブランドは、業界の誰もがよく知っているはずですよね?創業17...

瑞康製薬とアマゾン ウェブ サービスが戦略的協力協定を締結し、医薬品流通業界のデジタル変革のベンチマークを構築

アマゾン ウェブ サービスは、国内医薬品流通業界の大手企業である瑞康製薬と戦略的協力契約を締結したと...

クラウドコンピューティング技術がもたらす変化

クラウド コンピューティングは、ビジネスと IT に対する人々の理解を変え、組織の運営方法や人々の働...

確実にコピー:数千万のトラフィックを処理する大規模分散システムアーキテクチャの設計

この記事は、大規模な分散 Web サイト アーキテクチャの学習に関する技術的な概要です。この記事では...

ゼロデイ攻撃はハイブリッドクラウドにとって大きな問題である

新しい調査によると、ハイブリッド クラウド環境はゼロデイ攻撃に対して特に脆弱です。 「ゼロデイ脆弱性...

業界ウェブサイト構築コンテンツレイアウト

私はA5で業界ウェブサイト構築に関する「業界ウェブサイト構築のキーワードレイアウト」、「業界ウェブサ...