[[430078]] 詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ https://harmonyos..com I. はじめに1024 Focus Together ゲームは、画面上に N x N の正方形 (4x4 など、合計 16 個) を描き、1 から順に生成された数字 (1 から 16 など、合計 16 個の数字) で正方形を埋めるゲームです。ゲームをプレイする際、プレイヤーは指を使って、小さい数字から大きい数字の順番(1 から 16 など)の位置を指し示す必要があります。すべての数字を押すと、使用した時間(秒単位)が表示されます。かかる時間が短いほど、集中力が高まります。注意力を集中、分散、制御する能力を養うことができます。視覚範囲を広げる;ビデオを高速化する。視覚の安定性、人物の識別、方向検索能力が向上します。このゲームは、注意力をトレーニングするための最もシンプルで効果的かつ科学的な方法です。目標数値を探すときは、細心の注意を払う必要があります。この短時間で高強度の集中プロセスを繰り返し練習することで、脳の集中機能が継続的に強化され、向上します。注目度はどんどん高まっています。 同時に、1024 Focus Together ゲームでは Hongmeng 分散コラボレーション テクノロジーが採用されています。子どもの集中力や持久力を鍛える際は、大人も一緒にトレーニングに付き添うことができます。 Hongmeng システムの携帯電話が 2 台、または携帯電話とタブレットがあれば、大人も子供も同時にゲームを楽しむことができます。たとえば、大人が携帯電話の 1 台でいくつかの小さな数字を押してから、分散コラボレーション アイコンをクリックして、もう一方の携帯電話で 1024 Focus Together ゲームを開きます。大人が押さなかった数字を子供は押し続けることができ、最後に使用した時間が表示されます。 2. 達成効果開発ツール環境でのビデオ: https://www.bilibili.com/video/BV1B34y1m7M5?spm_id_from=333.999.0.0 携帯電話+携帯電話環境でのビデオ:https://www.bilibili.com/video/BV1kh411b7QM?spm_id_from=333.999.0.0 携帯電話 + タブレット環境でのビデオ: https://www.bilibili.com/video/BV1ov411M7sq?spm_id_from=333.999.0.0
3. プロジェクトを作成するDevEco-Studio 開発ツールの最新バージョンがインストールされているものとします。 「ファイル」->「新規」->「新しいプロジェクト」をクリックすると、「HarmonyOS プロジェクトの作成」ウィンドウがポップアップ表示されます。ここでは、空の Java テンプレートを選択します。前のビデオ再生の例では、JS を使用してインターフェースを記述しました。このゲームインターフェースは Java で書かれています。 JS を使用すると、インターフェースの記述が速くなり、デバッグも速くなります。
4. メインインターフェースの開発ソース コードを示す前に、まずどの JAVA コンポーネントが使用されているかを紹介します。 DirectionalLayout、TableLayout、DependentLayout、Button、Image、Text、ListContainer、CommonDialog など、Java UI リファレンス ドキュメントを参考にしてお好みのアプリケーションを作成できます。 まず、パブリック クラスの Java コードを紹介します。これらのパブリック クラスを使用すると、パブリック クラス ファイルを直接コピーし、将来同様の機能を備えたアプリケーションを作成するときに使用できます。 LogUtil ログ印刷クラス: - パブリッククラスLogUtil {
- プライベート静的最終 HiLogLabel LABEL_LOG = 新しい HiLogLabel(3, 0xD000F00, "1024Game" );
- プライベート静的最終文字列 LOG_FORMAT = "%{public}s: %{public}s" ;
-
- プライベートLogUtil() {
-
- }
- 公共 静的voidデバッグ(Stringクラス名、Stringメッセージ) {
- HiLog.debug(LABEL_LOG、LOG_FORMAT、クラス名、メッセージ);
- }
- 公共 静的void情報(文字列クラス名、文字列メッセージ) {
- HiLog.info(LABEL_LOG、LOG_FORMAT、クラス名、メッセージ);
- }
- 公共 静的void info(Class<?> classType, final String format, Object... args) {
- 文字列 buffMsg = String.format(Locale.ROOT, format, args);
- HiLog.info(LABEL_LOG、LOG_FORMAT、classType == null ? "null" : classType.getSimpleName()、buffMsg);
- }
- 公共 静的voidエラー(文字列タグ、文字列メッセージ) {
- HiLog.error(LABEL_LOG、LOG_FORMAT、タグ、メッセージ);
- }
- }
SelectDeviceDialog デバイス選択ダイアログボックス: - パブリッククラスSelectDeviceDialog{
- プライベート静的最終int DIALOG_WIDTH = 840;
- プライベート静的最終int DIALOG_HEIGHT = 900;
- プライベート CommonDialog commonDialog;
-
- パブリックSelectDeviceDialog(Contextコンテキスト、List<DeviceInfo>デバイス、SelectResultListenerリスナー) {
- initView(コンテキスト、デバイス、リスナー);
- }
- プライベート void initView(Context コンテキスト、List<DeviceInfo> デバイス、SelectResultListener リスナー) {
- // 共通ダイアログボックスを作成する
- commonDialog = 新しい CommonDialog(コンテキスト);
- // 配置を中央に設定
- commonDialog.setAlignment(LayoutAlignment.CENTER);
- // ダイアログのサイズを設定する
- commonDialog.setSize(DIALOG_WIDTH, DIALOG_HEIGHT);
- // ダイアログボックスを自動的に閉じるように設定する
- commonDialog.setAutoClosable( true );
- // XMLレイアウトファイルを読み込む
- コンポーネントダイアログレイアウト =
- LayoutScatter.getInstance(context).parse(ResourceTable.Layout_dialog_select_device, null 、 false );
- // ダイアログの内容を設定する
- commonDialog.setContentCustomComponent(ダイアログレイアウト);
- // リストコンテナを見つける
- (dialogLayout.findComponentById(ResourceTable.Id_list_devices) のインスタンス ListContainer) {
- // リストコンテナオブジェクトを取得する
- ListContainer デバイスListContainer =
- (リストコンテナー) dialogLayout.findComponentById(ResourceTable.Id_list_devices);
- // デバイスリストアダプタ
- DevicesListAdapter devicesListAdapter = 新しい DevicesListAdapter(デバイス、コンテキスト);
- // デバイスリストコンテナアイテムプロバイダを設定する
- デバイスリストコンテナにアイテムプロバイダーを設定します。
- // デバイスリスト項目のクリックイベントを設定する
- devicesListContainer.setItemClickedListener((listContainer, コンポーネント, 位置, id) -> {
- //選択したデバイス情報をコールバックする
- リスナー.callBack(デバイス.get(位置));
- // ダイアログを閉じる
- 共通ダイアログを非表示にします。
- });
- }
- dialogLayout.findComponentById(ResourceTable.Id_cancel).setClickedListener(コンポーネント -> {
- // ダイアログを閉じる
- 共通ダイアログを非表示にします。
- });
- }
- //ダイアログを表示する
- パブリックボイドショー(){
- 共通ダイアログを表示します。
- }
- /**
- * 内部インターフェース、デバイス選択後のコールバックイベント
- */
- パブリックインターフェースSelectResultListener {
- void コールバック(デバイス情報デバイス情報);
- }
- }
DevicesListAdapter デバイス リスト アダプター: - パブリッククラスDevicesListAdapterはBaseItemProviderを拡張します{
- // 0から添え字を始める
- プライベート静的最終int SUBSTRING_START = 0;
- // 終了添え字は4です
- プライベート静的最終int SUBSTRING_END = 4;
- //デバイス情報リスト
- プライベート List<DeviceInfo> deviceInfoList;
- // 現在のコンテキスト
- プライベートコンテキストコンテキスト;
-
- // パラメータ付きコンストラクタ
- パブリックDevicesListAdapter(List<DeviceInfo> deviceInfoList、コンテキスト context) {
- this.deviceInfoList = デバイス情報リスト;
- this.context = コンテキスト;
- }
- @オーバーライド
- 公共 整数getCount() {
- deviceInfoList == nullを返しますか? 0 : デバイス情報リスト。サイズ();
- }
- @オーバーライド
- パブリックオブジェクトgetItem( int i) {
- 戻り値はオプションです。 (deviceInfoList.get(i))の
- }
- @オーバーライド
- パブリックlong getItemId( int i) {
- iを返します。
- }
- @オーバーライド
- パブリックコンポーネント getComponent( int i, コンポーネント コンポーネント, コンポーネントコンテナ コンポーネントコンテナ) {
- // デバイスビューの内部クラスを定義する
- ビューホルダー viewHolder = null ;
- // コンポーネントを定義する
- コンポーネント mComponent = コンポーネント;
- // コンポーネントが空の場合
- mComponent == null の場合{
- // デバイスリスト項目レイアウトXMLを見つける
- mComponent = LayoutScatter.getInstance(context).parse(ResourceTable.Layout_item_device_list, null 、 false );
- // デバイスビュークラスを初期化する
- ビューホルダー = 新しいビューホルダー();
- // コンポーネントレイアウトにデバイス名テキストコンポーネントが含まれているかどうかを判断します
- if (mComponent.findComponentById(ResourceTable.Id_device_name) インスタンスのテキスト) {
- // デバイス リスト項目レイアウト XML のデバイス名ファイル コンポーネントを取得し、それを内部クラス デバイス ビューのデバイス名属性キャッシュに割り当てます。
- viewHolder.devicesName = (テキスト) mComponent.findComponentById(ResourceTable.Id_device_name);
- }
- // コンポーネントレイアウトにデバイスIDテキストコンポーネントが含まれているかどうかを判断します
- if (mComponent.findComponentById(ResourceTable.Id_device_id) インスタンスのテキスト) {
- // デバイス リスト項目レイアウト XML のデバイス ID ファイル コンポーネントを取得し、それを内部クラス デバイス ビューのデバイス ID 属性キャッシュに割り当てます。
- viewHolder.devicesId = (テキスト) mComponent.findComponentById(ResourceTable.Id_device_id);
- }
- mComponent.setTag(viewHolder);
- }それ以外{
- // コンポーネントがnullでなく、タグに内部クラスデバイスビューが含まれている場合
- if (mComponent.getTag() インスタンスの ViewHolder) {
- // コンポーネントタグからデバイスビューを取得します
- viewHolder = (ViewHolder) mComponent.getTag();
- }
- }
- // デバイスビューが空でない場合
- ビューホルダーがnullの場合
- // デバイス名の内容を設定する
- viewHolder.devicesName.setText(deviceInfoList.get(i).getDeviceName());
- 文字列デバイスID = deviceInfoList.get(i).getDeviceId();
- デバイスID = デバイスID。部分文字列(SUBSTRING_START, SUBSTRING_END) + "******"
- +デバイスID.substring (デバイスID.length() - SUBSTRING_END);
- // デバイス名IDを設定する
- viewHolder.devicesId.setText(デバイスID);
- }
- mComponentを返します。
- }
- /**
- * 内部クラス、デバイスビュー
- */
- プライベート静的クラス ViewHolder {
- //デバイス名
- プライベートテキストデバイス名;
- // デバイスID
- プライベートテキストデバイスID;
- }
- }
MainAbilitySlice メインインターフェース関数の説明:メイン インターフェイスの主な機能は、テーブル レイアウトを使用して、3x3、4x4、5x5、6x6、7x7、8x8、9x9 の 7 つのボタンを生成することです。それらをクリックするとゲーム インターフェイスにジャンプし、対応する数字ボタンを初期化し、スライスを使用してジャンプしてパラメータを渡します。ソースコードには詳細なコメントがあります。興味のある方は gitee にアクセスしてソースコードを閲覧できます。 PlayAbilitySliceゲームインターフェース機能の説明:ゲーム インターフェイスの主な機能は、テーブル レイアウトを使用して、対応するメイン インターフェイスから渡されるパラメーター ボタンを生成することです。数字はランダムな順序で表示され、GameServiceAbility ゲーム サービスは分散協調方式で呼び出されます。各数字ボタンをクリックすると、イベントをサブスクライブすることで現在の数字と関連する変数が受信され、対応するデータが更新されます。ソースコードには詳細な注釈が付いています。関心のあるパートナーは、gitee にアクセスしてソース コードを表示できます。 GameServiceAbilityゲームサービスの説明:ゲーム サービスの主な機能は、リクエストがアビリティに対するものである場合、パラメータを受信した後、他のインターフェイスに流れてパラメータを渡すことです。その他のリクエストの場合は、パラメータを受け取った後、パブリック イベントを通じて公開され、このイベントをサブスクライブする Ability がデータを更新できるようになります。ソースコードには詳細なコメントがあります。関心のあるパートナーは、gitee にアクセスしてソース コードを表示できます。 今のところはこれですべてです。 config.json ファイルで権限を設定することを忘れないでください。モジュールの下に追加します。 - 「必要な権限」 : [
- {
- 「名前」 : 「ohos.permission.GET_DISTRIBUTED_DEVICE_INFO」
- },
- {
- 「名前」 : 「ohos.permission.DISTRIBUTED_DATASYNC」
- },
- {
- 「名前」 : 「ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE」
- },
- {
- 「名前」 : 「ohos.permission.READ_USER_STORAGE」
- },
- {
- 「名前」 : 「ohos.permission.WRITE_USER_STORAGE」
- },
- {
- 「名前」 : 「ohos.permission.GET_BUNDLE_INFO」
- }
- ]
同時に、ゲーム インターフェースの入り口でも動的な認証が必要です。 - プライベート静的void grantPermission(コンテキストコンテキスト) {
- LogUtil.info(TAG, "grantPermission" );
- (context.verifySelfPermission(DISTRIBUTED_DATASYNC) != IBundleManager.PERMISSION_GRANTED) の場合 {
- コンテキストがDISTRIBUTED_DATASYNCである場合には、
- context.requestPermissionsFromUser(新しい文字列[] {DISTRIBUTED_DATASYNC}、PERMISSION_CODE);
- }
- }
- }
V. 結論興味のある方はソースコードをダウンロードして確認してみてください。プロジェクトコードは基本的にコメント化されています。ゲームのルールはとても簡単です。インターフェース上の数字を順番にクリックするだけです。時間が短いほど、注意力が集中します。ソースコードはgiteeコードクラウドに同期されます。 詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ https://harmonyos..com |