Samsung Bada用の簡単なアプリケーションを作成するための段階的な説明

予備メモ



こんにちは。 まず、新年のお祝いを申し上げ、すぐに仕事に取り掛かります。 この記事では、韓国のサムスンがリリースしたモバイルデバイスのオペレーティングシステムであるBadaの簡単なプログラムの作成に焦点を当てます。 事前に言っておきたいのは、コードの最適性とハーモニーについての長い議論をせずに、単純なアプリケーションを作成するための簡単なレシピであることです。

Habréには、 これこれなど 、Badaに特化した非常に包括的な記事が既にありますが、初心者向けのアプリケーションを作成するための段階的な説明はありません。 誰が気にする-私は猫をお願いします。





執筆のトピックは偶然発生しました-友人は測地会社でGPSを使用して土地の境界を確立することに積極的に取り組んでいます。 作品の詳細(それがどこから来たのかは良い質問です)は、得られた測地座標(緯度と経度の意味を明確にします)を受け取った直後に長方形に変換する必要があることです。 同社には8時間の営業日に耐えられるラップトップがなく、計画されていませんが、友人が最近、Badaオペレーティングシステムを使用してサムスンからウクライナで積極的に宣伝されているサムスンからスマートフォンを購入した後、質問が続きました-あなたの携帯電話用のゲームをダウンロードできる場合、解決できるアプリケーションがあります純粋に記述されたエンジニアリングの問題? もちろん、そのようなアプリケーションは見つかりませんでした。私はこれを既知の料金で書くという申し出を受け取りました。



ツールキット


Bada用のアプリケーションを開発するには、Bada SDK 1.2.0を使用します 。これは、Bada開発者サイトに登録しダウンロードできます。 このプロセスには複雑なことは何もありませんが、ダウンロードするファイルを選択する段階では、SDKのみをダウンロードすることで正直に「バカ」にしました。いわゆる言語パックはありません。 SDKを自動的にインストールした後に発生します。 ただし、インストール段階で何かがおかしくなり、言語パックをロードせずにインストールが続行されたため、アプリケーションをビルド(ビルド)することができず、さらには実行できませんでした。

SDKと言語パックをダウンロードした後、それらを1か所に配置する必要があります。SDKのインストール時または変更時に、インストーラーは言語パックを選択して自分でインストールします。



実際にアプリケーションを作成する




開発環境は、使用されるC ++プログラミング言語であるEclipseに基づいています。 まず、明らかな[ファイル]-> [新規]-> [bada Application Project]コマンドを使用して、新しいアプリケーションを作成します。 表示されるウィンドウで、[プロジェクト名]フィールドでプロジェクトの名前を決定し、[プロジェクトタイプ]リストでアプリケーションタイプを選択する必要があります-bada Form Based Application。



次に、環境では、アプリケーションの対象となるデバイスの技術的なパラメーター(画面解像度、GPSの可用性など)を決定するように求められます。 これらのパラメーターは、特別なマニフェストファイルManifest.xmlで定義されます。このファイルは、SDKファイルから選択したり、Bada Developers Webサイトから作成およびダウンロードしたり、独自に作成したりできます。 さらに苦労することなく、サンプルのフォルダーからマニフェストファイルを使用しました。サンプルはSDKと共にインストールされます。これは、アプリケーションが余計なものを必要とせず、画面解像度のみが重要だったためです。



次に、環境からSDKのルートディレクトリを指定するように求められますが、これは問題ではないはずです。 選択後、デバイスモデルの名前とそのAPIがリストに表示されます。これは、今後プログラミングに使用されます。



次の手順では、デフォルトのフォーム名を決定します。これは、アプリケーションの起動直後に表示されます。 この名前で* .hおよび* .cppファイルが生成されます。



次に、この機能が追加された場合、自動スケーリングと最適な画面解像度をサポートするかどうかを決定する必要があります。 アプリケーションはさまざまな解像度のさまざまなデバイスで動作し、やり直す必要がないため、これが最善であると理解しています。



設定の長いチェーン内の次のリンクは、アプリケーションIDの定義です。保護されたフォルダーの読み取りと書き込みが必要な場合にアプリケーションの機能を認証します。 これは必要なかったので、この手順は省略しました。



名前、ベンダー、および説明アプリケーションの明らかなプロパティの定義が終わりに近づいています。



そして今、ほぼ終わりです-これは開発に必要な構成の定義です:すべてをデフォルトのままにすることをお勧めします、そして今最も重要な構成はシミュレーターデバッグです-これはデバイスシミュレーターでコードをデバッグする機能です、ターゲットリリース-それをダウンロードする前にアプリケーションをコンパイルするための構成実際のデバイス。



最後の手順は、[概要]ウィンドウのすべての設定についてまとめられた情報です。この情報をもう一度読み、すべてが正しく選択されていることを確認できます。



最終設定の後、プロジェクトエクスプローラに将来のアプリケーションが表示されます。これをクリックすると、リソースウィンドウでリソースファイルが開き、次のウィンドウが表示されます。



画像



[プロパティ]タブでフォーム(および通常はコントロール)をクリックすると、タイトルのテキスト、背景色、ソフトキーの存在と名前など、アプリケーションの明白なプロパティを変更できます。



環境が親切に生成した既製のボタンをすぐに転送し、下に移動して、Calculateを書き込みました。 GUIエディターを使用すると、自分のタスクに適した次のインターフェイスを簡単に取得できます(コントロールをフォームに転送してプロパティを設定するプロセスは問題を引き起こさないと思います)。 明らかなラベルが入力フィールドのラベルとして使用され、編集フィールドが入力フィールドとして使用されました。 ラベルは、編集が提供されていないため、計算の結果を表示するためにも使用されました。



画像



今、実際のコーディング。



実行中のアプリケーションはいくつかの段階を経ます(ヘルプは非常に詳細です。詳細はここで確認できます)。現在、主にアプリケーションの初期化段階に関心があります。プロジェクト。



デフォルトでは、このメソッドは次のようになります。



result Form1::OnInitializing(void) { result r = E_SUCCESS; // TODO: Add your initialization code here // Get a button via resource ID __pButtonOk = static_cast<Button *>(GetControl(L"IDC_BUTTON_OK")); if (__pButtonOk != null) { __pButtonOk->SetActionId(ID_BUTTON_OK); __pButtonOk->AddActionEventListener(*this); } return r; }
      
      





ここでは、__ pButtonOkという識別子を持つボタンを作成しました。これは環境によって生成されました。 incフォルダーにはフォームのヘッダーファイルがあり、2番目の[クリア]ボタンに対応する保護セクションに新しいフィールドを追加する必要があります。また、ボタンのイベントID(Idアクション)を整数定数として追加します。 OnActionPerformedメソッドにプッシュされます。 また、計算に必要な特別な定数もここに追加しました。



私はこのようにしました:

 protected: static const int ID_BUTTON_OK = 101; // new action ID for button CLEAR static const int ID_BUTTON_CLEAR=102; // geodetic constants static const int a=6378137; static const float alfa=1/298.257223563; Osp::Ui::Controls::Button *__pButtonOk; // new field: button Osp::Ui::Controls::Button *__pButtonClear; // new fields: edits and labels Osp::Ui::Controls::EditField *__pB_deg; Osp::Ui::Controls::EditField *__pB_min; Osp::Ui::Controls::EditField *__pB_sec; Osp::Ui::Controls::EditField *__pL_deg; Osp::Ui::Controls::EditField *__pL_min; Osp::Ui::Controls::EditField *__pL_sec; Osp::Ui::Controls::EditField *__pH; Osp::Ui::Controls::Label *__pX; Osp::Ui::Controls::Label *__pY;
      
      







OnInitializing(void)メソッドで、Clearボタンを作成し、IDアクションと「イベントリスナー」リスナーを割り当てることができます。 EditFieldとLabelでも同じことを行いますが、ユーザーアクションへの反応は単純なアプリケーション(IDC_BUTTON1、IDC_EDITFIELD1など-ボタンのNameプロパティの値)では提供されないため、Idアクションとイベントリスナーは追加しません。



  __pButtonOk = static_cast<Button *>(GetControl(L"IDC_BUTTON_OK")); __pButtonClear = static_cast<Button *>(GetControl(L"IDC_BUTTON1")); if (__pButtonOk != null) { __pButtonOk->SetActionId(ID_BUTTON_OK); __pButtonOk->AddActionEventListener(*this); } if (__pButtonClear != null) { __pButtonClear->SetActionId(ID_BUTTON_CLEAR); __pButtonClear->AddActionEventListener(*this); } // Get fields and labels __pB_deg = static_cast<EditFields *>(GetControl(L"IDC_EDITFIELD1")); __pB_min = static_cast<EditFields *>(GetControl(L"IDC_EDITFIELD2")); __pB_sec = static_cast<EditFields *>(GetControl(L"IDC_EDITFIELD3")); __pL_deg = static_cast<EditFields *>(GetControl(L"IDC_EDITFIELD4")); __pL_min = static_cast<EditFields *>(GetControl(L"IDC_EDITFIELD5")); __pL_sec = static_cast<EditFields *>(GetControl(L"IDC_EDITFIELD6")); __pH = static_cast<EditField *>(GetControl(L"IDC_EDITFIELD7"));
      
      







この段階では、アプリケーションをすでに起動して、データがシミュレータにどのように入力されているかを確認できますが、ボタンクリックイベントが処理されるまで、もちろんメリットはありません。



この問題を解決するには、OnActionPerformedフォームクラスメソッド(const Osp :: Ui :: Control&source、int actionId)を使用します。 ご覧のとおり、2番目のパラメーターは上記のアクションIDです。 アプリケーションが実行されると、ボタンクリックイベントが「リスン」され、それに割り当てられたアクションIDがOnActionPerformed(const Osp :: Ui :: Control&source、int actionId)に渡されます。 そのような識別子に処理が提供されている場合、実行されます。



OnActionPerformedには、actionIdパラメーターを分析するためのスイッチプリセットがあります。これを使用すると便利です。 次に、このメソッドのコードに詳細なコメントを提供できるようにします。



 void Form1::OnActionPerformed(const Osp::Ui::Control& source, int actionId) { const int MAX_BUFF_SIZE = 512; switch(actionId) { case ID_BUTTON_OK: //     Calculate { //    ,      ... String B_deg_str(__pB_deg->GetText()); String B_min_str(__pB_min->GetText()); String B_sec_str(__pB_sec->GetText()); //... String L_deg_str(__pL_deg->GetText()); String L_min_str(__pL_min->GetText()); String L_sec_str(__pL_sec->GetText()); // ...  String H_str(__pH->GetText()); double B_deg,B_min,B_sec; double L_deg,L_min,L_sec; double H; //          result r1=Double::Parse(B_deg_str,B_deg); result r2=Double::Parse(B_min_str,B_min); result r3=Double::Parse(B_sec_str,B_sec); result r4=Double::Parse(L_deg_str,L_deg); result r5=Double::Parse(L_min_str,L_min); result r6=Double::Parse(L_sec_str,L_sec); result r7=Double::Parse(H_str,H); //  double b_in_decimal=B_deg+B_min/60+B_sec/3600; double l_in_decimal=L_deg+L_min/60+L_sec/3600; double eSqr=2*alfa-(alfa*alfa); double N=a/Math::Sqrt(1-eSqr*(Math::Sin(b_in_decimal))*(Math::Sin(b_in_decimal))); double X=(N+H)*Math::Cos(b_in_decimal)*Math::Cos(l_in_decimal); double Y=(N+H)*Math::Cos(b_in_decimal)*Math::Sin(l_in_decimal); String strX; String strY; //        strX.Format(MAX_BUFF_SIZE,L"%f",X); strY.Format(MAX_BUFF_SIZE,L"%f",Y); //     Label __pX->SetText(L"X="+strX);__pY->SetText(L"Y="+strY); __pX->Draw();__pY->Draw(); __pX->Show();__pY->Show(); } break; case ID_BUTTON_CLEAR: { //     Clear //      OK  CANCEL   -   ? MessageBox *pMessageBox = new MessageBox(); pMessageBox->Construct(L"MessageBox", L"Clear all fields?" , MSGBOX_STYLE_OKCANCEL ,9000); int ModalResult; pMessageBox->ShowAndWait(ModalResult); //   , ... if (ModalResult==MSGBOX_RESULT_OK) { // ...      Label __pB_deg->Clear(); __pB_min->Clear(); __pB_sec->Clear(); __pL_deg->Clear(); __pL_min->Clear(); __pL_sec->Clear(); __pH->Clear(); __pX->SetText(L"X=");__pY->SetText(L"Y="); } //  MessageBox delete pMessageBox; } break; default: break; } }
      
      







実行中のプログラムを使用したシミュレーターの外観は次のとおりです。



画像



彼はMessageBoxを使用しています。



画像



それがすべてのようです。 私は、このプログラムが対象とする友人と4人の同僚の正気を願うので、このアプリケーションは報道の広さやすべての文言の正確さをまったく装っていないことに注意してください。たとえば、「愚か者からの保護」はまったくありません。

最近では、バダの開発のための別のアプリケーションが受信されました-ATMや預金ターミナルなどの最も近いオブジェクトを検索して地図上に表示する必要があります。 このトピックが誰にとっても興味深いものであれば、喜んで私の経験を共有します。



誰がプログラムで次に何をすべきかについて質問がある場合、これはBada Developer Webサイトの記事で詳細に説明されています。プログラミングはさらに複雑なトピックなので、これには触れません。



アプリケーションのソースはこちらから入手できます



ホスティングに問題がある場合は、ご容赦ください:)



UPD:申し訳ありませんが、追加するのを忘れました-フォームクラスのすべての追加フィールド(__pB_deg、_pB_minなど)は、次のようにフォームコンストラクターで初期化する必要があります。



 Form1::Form1(void): __pB_deg(null),__pB_min(null),__pB_sec(null), __pL_deg(null),__pL_min(null),__pL_sec(null), __pH(null), __pX(null),__pY(null) { }
      
      






All Articles