DUICUO

HarmonyOS オープンソースサードパーティコンポーネント - EmojiRain

[[419734]]

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

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

https://harmonyos..com

背景

これはHarmonyOSベースの絵文字パックの非常にコンパクトな実装です。WeChatで「Happy Birthday」や「Mwah」といった単語を送信した際に発生するアニメーションに似た効果が得られます。

機能デモンストレーション

EmojiRain コンポーネントは、HarmonyOS システムをベースに、コントロール プロパティをカスタマイズして実装されており、Java コード設定もサポートしています。


原理分析


図に示すように、絵文字コントロール Image の初期位置は画面の上部にあり、EmojiRainLayout が画面全体を埋め尽くします。

絵文字が落ち始める前に、指定された絵文字セットから対応する要素を取得し、落ちたときの要素の開始位置、終了位置、幅、高さを計算します。

次に、位置座標と高さに基づいて対応するアニメーション オブジェクトを作成し、Animator.CurveType.ACCELERATE_DECELERATE アニメーション インターポレータを設定します。

ドロップする絵文字の数に基づいて Image 要素を準備した後、addComponent() を呼び出して EmojiRainLayout に Image を追加し、画面を覆う効果を実現します。

最後に、加速と減速のアニメーション効果が実行され、絵文字の雨モードが起動します。

  1. //RxJava を使用してアニメーションの実行間隔、実行順序、実行対象を制御します。
  2. サブスクリプション subscription = Observable.interval(mDropFrequency, TimeUnit.MILLISECONDS)
  3. .take(mDuration / mDropFrequency)
  4. .flatMap(フロー -> Observable.range(0, mEmojiPer))
  5. .map(画像 -> mEmojiPool.acquire())
  6. .filter(ep -> ep != null )
  7. .observeOn(OhosSchedulers.mainThread())
  8. .subscribe(this::startDropAnimationForSingleEmoji、Throwable::printStackTrace);
  9. mSubscriptions.add (サブスクリプション);
  10.  
  11. // 画像のアニメーションオブジェクトを作成する
  12. アニメータープロパティ animatorProperty = emoji.createAnimatorProperty();
  13. //アニメーションの継続時間を設定する
  14. アニメータープロパティ.setDuration(( int )
  15. (mDropAverageDuration * Randoms.floatAround(1, RELATIVE_DROP_DURATION_OFFSET)));
  16. フロートstartX = Randoms.getStartX();
  17. フロートのendX = Randoms.getStopX();
  18. //アニメーションの開始座標と終了座標を指定する
  19. animatorProperty.moveFromX(startX).moveToX(endX).moveFromY(-imageHeight).moveToY(mWindowHeight);
  20. animatorProperty.setCurveType(Animator.CurveType.ACCELERATE_DECELERATE);
  21. アニメータープロパティの開始();
  22.  
  23. // 画像を初期化し、比例スケールされた高さと幅をランダムに割り当て、画像読み込みモードを指定します。
  24. 画像 emoji = new Image(getContext());
  25. emoji.setImageElement(emojiDrawable);
  26. emoji.setScaleMode(Image.ScaleMode.CENTER);
  27. ダブルポジティブ = Randoms.positiveGaussian() * 0.6;
  28. 最終的な int幅 = ( int ) (emoji_standard_size * (1.0 + positive));
  29. 最終的なint の高さ = ( int ) (emoji_standard_size * (1.0 + positive));
  30. 最終的なLayoutConfigパラメータ = 新しいLayoutConfig(幅、高さ);
  31. params.setMarginTop(-height);
  32. params.setMarginLeft(( int ) (-0.5F * 幅));
  33. emoji.setLayoutConfig(パラメータ);

使用方法

パラメータ設定

あたり

  • 各ウェーブでドロップされる絵文字のデフォルトの数は 6 です。

間隔

  • 落下アニメーションの合計継続時間は、デフォルトでは 8000 ミリ秒です。

ドロップ期間

  • 各絵文字の平均ドロップ時間、デフォルトは2400ミリ秒

ドロップ頻度

  • ドロップ頻度、つまり 2 回のドロップ間の時間間隔は、デフォルトで 500 ミリ秒に設定されます。

レイアウトでは、EmojiRainLayout は StackLayout を継承しており、ネイティブの StackLayout と同じように使用できます。

  1. <com.luolc.emojirain.EmojiRainLayout
  2. xmlns:ohos= "http://schemas.huawei.com/res/ohos"  
  3. xmlns:app= "http://schemas.huawei.com/res/ohos-auto"  
  4. xmlns:tools= "http://schemas.android.com/tools"  
  5. ohos:height= "match_parent"  
  6. ohos:width= "match_parent"  
  7. app:dropDuration= "2400"  
  8. app:dropFrequency= "500"  
  9. app:duration= "7200"  
  10. app:per= "10" >
  11.  
  12. <テキスト
  13. ohos:height= "match_content"  
  14. ohos:width= "match_content"  
  15. ohos:text= "こんにちは世界!" />
  16.  
  17. </com.luolc.emojirain.EmojiRainLayout>
  1. パブリッククラス MainAbilitySlice は AbilitySlice を拡張します {
  2.  
  3. プライベート EmojiRainLayout mContainer;
  4.  
  5. @オーバーライド
  6. 保護されたvoid onStart(インテントインテント) {
  7. super.onStart(インテント);
  8. super.setUIContent(ResourceTable.Layout_ability_main);
  9.  
  10. //ビューをバインドする 
  11. mContainer = (EmojiRainLayout) findComponentById(ResourceTable.Id_group_emoji_container);
  12.  
  13. //絵文字ソースを追加する
  14. mContainer.addEmoji(ResourceTable.Media_emoji_1_3);
  15. mContainer.addEmoji(ResourceTable.Media_emoji_2_3);
  16. mContainer.addEmoji(ResourceTable.Media_emoji_3_3);
  17. mContainer.addEmoji(ResourceTable.Media_emoji_4_3);
  18. mContainer.addEmoji(ResourceTable.Media_emoji_5_3);
  19.  
  20. //フローごとに絵文字を設定しますデフォルトは6です。
  21. mContainer.setPer(10);
  22.  
  23. //合計継続時間ミリ秒単位設定しますデフォルトは8000 です。
  24. mContainer.setDuration(7200);
  25.  
  26. //平均ドロップ期間をミリ秒単位設定しますデフォルトは2400 です。
  27. mContainer.setDropDuration(2400);
  28.  
  29. //セット ドロップ頻度ミリ秒)、デフォルトは500
  30. mContainer.setDropFrequency(500);
  31. }
  32. }

落ち始める

  1. mContainer.startDropping();

落ちるのをやめる

  1. mContainer.stopDropping();

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

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

https://harmonyos..com