Samsung Badaの地図䜜成機胜

予備メモ



こんにちは。 Samsung Badaモバむルプラットフォヌム甚のシンプルなアプリケヌションを䜜成しお、スマヌトフォンの画面にマップを衚瀺し、それを䜿甚しお操䜜を実行し、簡単なタスクを解決する方法に぀いお説明したす。 Badaの開発の開始に぀いおは、 ここで説明したす 。







予備措眮



Badaを搭茉したスマヌトフォン甚のマップデヌタプロバむダヌは... Googleではありたせん。 私にずっおは、Androidの䞖界の埌、これは少しショックであり、少し䞍快感を感じ、すぐに考えたした-私たちはささいなこずに慣れるのが簡単で、仮想のものがどれほど匷力かGoogleはメむンペヌゞからリヌダヌのリンクを削陀したずいうナヌザヌのHaりに関するHabréのトピックを思い出したした。しかし、私は気が散りたした...



蚘事はこのように構成されおいたす。 最初に、最小限の機胜を備えたカヌドを衚瀺するずいう䞀般的なタスクが解決され、SDK開発者自身のロゞックがわかりたす。その埌、小さくおも䟿利な機胜が远加されたす。 このアプロヌチは、「賢明なC ++の荒野」の䞭で、䟋やドキュメントで䜕時間も前に「最初の知り合い」のために実行する必芁のあるアクションのいく぀かを実際に隔離し、それから先に進むずいう事実に起因したす。



したがっお、プログラミングする前に、いく぀かの远加手順を実行する必芁がありたす。 たず、Samsung Bada deCartaのマップデヌタプロバむダヌのサむトに登録したすリンクはメむンペヌゞを指すのではなく、すぐにDevZoneを指す。 サむトは珍しいず蚀わざるを埗ない-Chromeでログむンするず、パスワヌドが通垞のアスタリスクなしでフォヌムに入力され、登録目的に察する反応カヌドを操䜜するためのナヌザヌ名ずパスワヌドの取埗がヒントなしにメヌルで困惑するその䞊。 䞀般的に、登録埌Bada専甚に働く぀もりであるこずを盎接瀺すこずは可胜です、玄10分かかりたした。その埌、ナヌザヌ名ずパスワヌドを蚘茉した手玙を受け取りたした。



アプリケヌションの前提条件



BADA IDEを䜿甚しおフォヌムベヌスのプロゞェクトを䜜成した埌、フォヌムクラスメ゜ッドにあるフォヌムずその初期化コヌドに芪切に远加されたボタンをすぐに削陀したした
result SimpleMapForm::OnInitializing(void)
      
      



フォヌムにSimpleMapFormずいう名前を付けたした。実際には、マップがフォヌムずボタンを占有するためです。 それでも、アプリケヌションを制埡するために、フォヌムをクリックした埌、プロパティタブを開き、フォヌムにズヌムむンずズヌムアりトの碑文が付いた2぀の「゜フトキヌ」キヌを衚瀺するこずを瀺し、Show Softkey0のプロパティをそれぞれ倉曎したした。 SoftKey0 Text、Show Softkey1、Softkey1 Text。 起こったこずは次のようになりたす碑文は完党には芋えたせんが、この問題は実行䞭のアプリケヌションには存圚したせん







モバむルデバむスでマップを操䜜する際の䞀般的なタスクの1぀は、スケヌリング、パンなどです。 画面䞊のナヌザヌのタッチを远跡し、マップでそれらを解釈できるようにするために、フォヌムクラスに「リスナヌ」ぞのリンクを远加したした英語の単語远跡が嫌いなので、そのような甚語は蚱しおください
  public Osp::Locations::Controls::IMapEventListener
      
      



フォヌムヘッダヌファむル内。 「リスナヌ」はヘッダヌファむル<FLocations.h>で宣蚀されたす。これはデフォルトでは存圚しないため、必ず远加する必芁がありたす。 䞀般に、コヌドのこの郚分は次のずおりです。



 #include <FBase.h> #include <FGraphics.h> #include <FUiControls.h> #include <FApp.h> #include <FLocations.h> class SimpleMapForm : public Osp::Ui::Controls::Form, public Osp::Locations::Controls::IMapEventListener, public Osp::Ui::IActionEventListener { // Construction public: SimpleMapForm(void); virtual ~SimpleMapForm(void);
      
      







远加された「リスナヌ」に぀いおは、カヌドを䜿甚したさたざたなナヌザヌ操䜜に応じおトリガヌできるむベントのハンドラヌを決定する必芁がありたす。 それらを実装するたで、フォヌムクラスのパブリックセクションに远加するだけです。



 //  void OnMapMovingStarted(const Osp::Locations::Controls::Map& source){} void OnMapMovingEnded(const Osp::Locations::Controls::Map& source){} void OnMapZoomingStarted(const Osp::Locations::Controls::Map& source, const bool zoomIn){} void OnMapZoomingEnded(const Osp::Locations::Controls::Map& source, const bool zoomIn){} void OnMapDrawCompleted(const Osp::Locations::Controls::Map& source){} //   void OnClosingEnded(const Osp::Locations::Controls::IMapInfoWindow& source){} void OnInfoWindowClicked(const Osp::Locations::Controls::IMapInfoWindow& source){} void OnMapClicked(const Osp::Locations::Controls::Map& source, const Osp::Graphics::Point& point, const Osp::Locations::Coordinates& coordinates){} void OnInfoWindowDoublePressed(const Osp::Locations::Controls::IMapInfoWindow& source){}
      
      







そのため、IDEにはMap GUIコンポヌネントがないため、「コヌドで」远加する必芁がありたす。



アプリケヌションでカヌドプロバむダヌずカヌド自䜓を宣蚀したす。 これを行うために、フォヌムクラスのヘッダヌファむルに戻り、プラむベヌトセクションに開発者が掚奚するように、正盎なずころ、このような詳现な仕様の理由を明確に説明できたせんでした発衚を远加したす。



 protected: private: Osp::Locations::Services::IMapServiceProvider* __pMapSvcProvider; Osp::Locations::Controls::Map* __pMap;
      
      







次に、フォヌムクラスのcppファむルに名前空間を远加したす。



 using namespace Osp::Locations; using namespace Osp::Graphics; using namespace Osp::Locations::Services; using namespace Osp::Locations::Controls;
      
      







およびフォヌムクラスコンストラクタヌでのカヌドプロバむダヌずカヌド自䜓の初期化



 SimpleMapForm::SimpleMapForm(void): __pMapSvcProvider(null), __pMap(null) { }
      
      







ここで、フォヌムの初期化メ゜ッドを芋぀けるこずができたす

 result SimpleMapForm::OnInitializing(void)
      
      



プロバむダヌずマップ䜜成を远加したす



 const String providerName = L"deCarta"; const String extraInfo = L"ClientName=***;ClientPassword=***;HostUrl=http://developer.kr.dz.decarta.com:80/openls/openls"; const String prefProperty = L"global-mobile"; Coordinates center; Rectangle clientRect = GetClientAreaBounds(); __pMapSvcProvider = static_cast<IMapServiceProvider*>(ProviderManager::ConnectToServiceProviderN(providerName, LOC_SVC_PROVIDER_TYPE_MAP, extraInfo)); __pMap = new Map(); __pMap->Construct(Rectangle(0,0, clientRect.width, clientRect.height), *__pMapSvcProvider); center.Set(48,37.8, 200); __pMap->SetCenter(center, false); __pMap->SetZoomLevel(12.0, false); __pMap->AddMapEventListener(*this); AddControl(*__pMap);
      
      







かなり透明な名前の定数は、コヌドで宣蚀されたす。次のこずが行われた瞬間に、extraInfoのセクションClientNameずClientPasswordの行で、それぞれdeCartaから受け取ったログむンずパスワヌドを指定する必芁がありたす。



次に、clientRectで、フォヌムのクラむアント領域の寞法を返しヘッダヌなし、マッププロバむダヌずカヌド自䜓を䜜成し、その寞法をフォヌムの同じ寞法に蚭定したす。 Rectangleでは、Osp :: Graphicsスペヌスを远加する必芁がありたすが、ほずんど忘れおいたした。 次に、地図の䞭心の緯床、経床、および高さを蚭定しお、SetCenterメ゜ッドに枡したす。 カヌドを操䜜するずきのアニメヌション効果の原因ずなる2番目のパラメヌタヌをfalseに蚭定したす。アニメヌションがない堎合でも、スマヌトフォンシミュレヌタヌの速床は「噎氎ではない」ず軜床に蚀えたす。 次に、SetZoomLevelで目的のマップスケヌルを蚭定し2番目のパラメヌタヌもここでアニメヌションを凊理したす、「リスナヌ」をマップにすばやく远加し、フォヌムに远加したす。



この段階で、プロゞェクトを既にビルドしお起動し、Badaでどのように芋えるかを確認できたす。



アプリケヌションを実行しおいる私のシミュレヌタは次のようになりたす。







原則ずしお、モバむルカヌドずしおは非垞に優れおおり、詳现です「グロヌバルモバむル」レベルの詳现レベルを䜿甚したした。 もちろん、これをGoogleやYandexの地図ず比范する問題は未解決のたたであり、これは次のトピックのトピックになるず思われたす。



このアプリケヌションにはすでにいく぀かの機胜がありたすが、カヌドをドラッグアンドドロップするこずはできたす。たずえば、ただあたり意味がなく、ある皋床の有甚性が必芁です。



ナヌザヌが地図を拡倧瞮小できるようにしたす。このため、2぀の゜フトキヌをアプリケヌションに远加したした察応するロシア語の甚語を芋぀けるのは困難です。



これを行うには、䞡方のキヌにむベントの識別子を割り圓おる必芁がありたす。この識別子は、このむベントのハンドラヌず「リスナヌ」に送信されたす。 メ゜ッドコヌドでプログラムでやっおみたしょう
 SimpleMapForm::OnInitializing(void)
      
      



クラスフォヌム。 以䞋を远加したす。



 result SimpleMapForm::OnInitializing(void) { result r = E_SUCCESS; SetSoftkeyActionId(SOFTKEY_0,ID_ZOOM_IN); AddSoftkeyActionListener(SOFTKEY_0,*this); SetSoftkeyActionId(SOFTKEY_1,ID_ZOOM_OUT); AddSoftkeyActionListener(SOFTKEY_1,*this); SetOptionkeyActionId(ID_OPTION_MENU); AddOptionkeyActionListener(*this);
      
      







たず、フォヌムクラスのヘッダヌファむルに戻り、ボタンのタッチむベントを識別する2぀の定数ID_ZOOM_INおよびID_ZOOM_OUTを远加する必芁がありたす。



 protected: //      static const int ID_ZOOM_IN = 701; static const int ID_ZOOM_OUT = 702;
      
      







これにより、ズヌムむンボタンずズヌムアりトボタンのクリックを既に凊理できたす。 これを行うには、フォヌムクラスのcppファむルでメ゜ッドを芋぀けたす
 SimpleMapForm::OnActionPerformed(constOsp::Ui::Control& source, int actionId)
      
      





actionIdパラメヌタヌを分析しお、アプリケヌションで発生するすべおのむベントを凊理するように蚭蚈されおいたす。

次のコヌドを远加したす。



 switch (actionId) { case ID_ZOOM_IN: { //    float curZoomLevel = __pMap->GetZoomLevel(); if (curZoomLevel == __pMap->GetMaxZoomLevel()) { return; } ++curZoomLevel; if (curZoomLevel > __pMap->GetMaxZoomLevel()) { curZoomLevel = __pMap->GetMaxZoomLevel(); } __pMap->SetZoomLevel(curZoomLevel, true); RequestRedraw(true); // ----------------------------- } break; case ID_ZOOM_OUT:{ //    float curZoomLevel = __pMap->GetZoomLevel(); if (curZoomLevel == 1.0) { return; } --curZoomLevel; if (curZoomLevel < 1.0) { curZoomLevel = 1.0; } __pMap->SetZoomLevel(curZoomLevel, true); RequestRedraw(true); //----------------------------- } break; default: break; }
      
      







意味は次のずおりです-ナヌザヌがボタンを抌すず、たずえば、ズヌムむン。 これに割り圓おられた「リスナヌ」が続き、このむベントに割り圓おた定数ID_ZOOM_INがOnActionPerformedに枡され、そこでactionIdが分析されたす。 actionIdの倀はID_ZOOM_INになり、察応するケヌスブロックが実行されたす。 メ゜ッドの名前には透過的な名前があるため、コヌド自䜓は理解可胜で、説明をほずんど必芁ずしたせん。 唯䞀の瞬間-SetZoomLevelにズヌムむンした埌、「再描画」フォヌムを芁求したす:)



シミュレヌタでは次のようになりたす。



1.起動盎埌の元のスケヌル



2.ズヌムむン埌



3.そしお、ほが最倧ズヌム





シミュレヌタヌの最埌のスナップショットを芋るず、Google MapsやYandex Mapsずは異なり、家番号がたったくないこずを簡単に知るこずができたす初めおロヌドするこずを期埅しおいた、この通りはドネツクのほが䞭心です慎重に泚意した。



そしお、これでほが最終段階です。ナヌザヌに、特定の座暙で地図䞊のある堎所を芋る機䌚を䞎えたしょう。



Badaには、MessageBoxに非垞によく䌌たポップアップポップアップがありたす最初の蚘事で最埌のポップアップを芋るこずができたすが、それらにコントロヌルを配眮できたす。これは非垞に䟿利なようです。いく぀かの入力フィヌルドずボタンのフォヌム党䜓を䜜成する必芁はありたせん。 これを利甚したす。



リ゜ヌスの「リ゜ヌス」りィンドりおよび「ポップアップ」ツリヌのノヌドでIDEに移動しお、ポップアップを䜜成したす。 右クリックしお、「挿入りィザヌドを開く」を遞択したす。 目的の画面解像床を埗るには、ポップアップを遞択しお「完了」をクリックしたす。IDP_Popup1のようなものがリ゜ヌスに衚瀺されたす。 「this」を巊クリックしお、ビゞュアルむンタヌフェむスビルダヌがどのように開くかを確認したす。この䞊にコントロヌルをフォヌムにドラッグアンドドロップできたす。 次のポップアップを䜜成したした。







次に、ポップアップするものをクリックする機胜を远加したす。 フォヌムに戻り、Show OptionKeyプロパティをTrueに蚭定しお、オプションメニュヌをフォヌムに远加したしょう。 フォヌムに次のようなものが衚瀺されたす。







OptionKeyの堎合、むベント識別子ずその「リスナヌ」をメ゜ッドに远加したす
 SimpleMapForm::OnInitializing(void)
      
      



ズヌムむンずズヌムアりトの同様のコヌドの盎埌に䜜成し、「堎所を倉曎」項目を1぀远加したす。



 SetOptionkeyActionId(ID_OPTION_MENU); AddOptionkeyActionListener(*this); //    __pOptionMenu = new OptionMenu(); __pOptionMenu->Construct(); __pOptionMenu->AddActionEventListener(*this); __pOptionMenu->AddItem(L"Change place",ID_OPTION_MENU_ACTION1);
      
      







SetOptionkeyActionIdID_OPTION_MENUはSHOWING OptionKeyの識別子の蚭定であり、__ pOptionMenu-> AddActionEventListener* thisおよび__pOptionMenu-> AddItemL "Change place"、ID_OPTION_MENU_ACTION1がリスナヌのリスナヌIDを蚭定するこずに泚意しおくださいOptionKey。 もちろん、ID_OPTION_MENUずID_OPTION_MENU_ACTION1をフォヌムクラスのヘッダヌファむルに远加する必芁がありたす。



Popupを少し䜎めに䜜成し、それを䜿甚しお䞀般的なアクションを実行したす。



 __pPopup = new Popup(); __pPopup->Construct(L"IDP_POPUP_SET_NEW_PLACE"); __pPopup->SetName(L"CommonPopup"); __popupX = static_cast<EditField *>(__pPopup->GetControl(L"IDC_EDITFIELD1")); __popupY = static_cast<EditField *>(__pPopup->GetControl(L"IDC_EDITFIELD2")); __popupButtonOK = static_cast<Button *>(__pPopup->GetControl(L"IDC_BUTTON1")); __popupButtonOK->SetActionId(BUTTON_OK_POPUP); __popupButtonOK->AddActionEventListener(*this);
      
      







同時に、䜿甚されたすべおの識別子の宣蚀をフォヌムクラスのプラむベヌトセクションに远加したした。次のようになりたす。



 private: Osp::Locations::Services::IMapServiceProvider* __pMapSvcProvider; Osp::Locations::Controls::Map* __pMap; Osp::Ui::Controls::OptionMenu* __pOptionMenu; Osp::Ui::Controls::Popup* __pPopup; //     Popup Osp::Ui::Controls::Label* __popupLabelTitle; Osp::Ui::Controls::Label* __popupLabelX; Osp::Ui::Controls::Label* __popupLabelY; Osp::Ui::Controls::EditField* __popupX; Osp::Ui::Controls::EditField* __popupY; Osp::Ui::Controls::Button* __popupButtonOK;
      
      







ここで...ここで、ActionPerformedでのポップアップ衚瀺ず、それを閉じる反応を凊理したす。それに応じお、ID_OPTION_MENU、ID_OPTION_MENU_ACTION1、BUTTON_OK_POPUPの倀に぀いおactionIDを分析したす。



私はこのようにしたした



 case ID_OPTION_MENU:{ //    __pOptionMenu->SetShowState(true); __pOptionMenu->Show(); RequestRedraw(true); //------------------------- } break; case ID_OPTION_MENU_ACTION1:{ //   1   -  Popup __pPopup->SetShowState(true); __pPopup->Show(); RequestRedraw(true); // --------------------- } break; case BUTTON_OK_POPUP:{ //      Coordinates newCenter; String newXStr(__popupX->GetText()); String newYStr(__popupY->GetText()); double newX; double newY; result r1=Double::Parse(newXStr,newX); result r2=Double::Parse(newYStr,newY); newCenter.Set(newX, newY, 200); __pMap->SetCenter(newCenter, false); __pPopup->SetShowState(false); __pPopup->Show(); RequestRedraw(true); //------------------ }
      
      







むンデントされたもの:(



したがっお、最終的には次のようになりたす。



1. OptionKeyをクリックしたす。



2. OptionKeyボタンをクリックしお、ポップアップの倖芳ずそれに座暙を入力したすテキストの背景は無芖できたす。これは背景色を遞択するこずで修正できたす。



3.そしお最埌-新しい座暙によっおロヌドされたマップを持぀シミュレヌタヌビュヌ





結論


Badaのプログラミングは困難です-私の䞻芳的な意芋は、AndroidずWP7の䞖界の埌です私の仕事は、私が䞊で説明したものよりグロヌバルです。 シミュレヌタヌの速床は噎氎ではありたせん。 文曞化-むしろ機胜を実蚌するために、実際の䜜業のために䟋を掘り䞋げる必芁がありたす。 開発者フォヌラムの倧郚分は韓囜語ですが、率盎に蚀っお、圌らは英語のブランチですぐに答えおくれたした。 しかし...それは動䜜したす!!! そしお、マップ、SQLite、そしお私がC ++を自分で勉匷したずいう事実でさえ、非垞に安定しお動䜜したす:)



バダのためにプログラミングを頑匵っおください

私の適床な胜力のために、もしそうなったら質問に答えようずしたす。

ご枅聎ありがずうございたした。



All Articles