羅針盤制作秘話 第4回
羅針盤制作秘話 第4回。
今回は、現在地から有名なランドマークまでの
距離と方角がわかる「ランドマーク機能」を実装した
@ux_design_tokyo(UDT)氏の開発苦労話を基に記事を作成しました。
——–
UDTも山田同様、Androidの情報の無さに苦戦していた。
UDTは、数少ない情報を集めつつ
実際にプログラムで再現しながら
開発を進めていった。
まずは画像の描画にはじまり、
加速度センサーと方位センサーを利用して、
描画した地平線の画像をセンサーに合わせて移動した。
この実装については、傾きと方位の値が取得できれば
Android独自の知識はあまり必要なく、実際に動くアプリ
もでき、実装は順調に進んでいるかのように思えた。
しかし、トライアンドエラーの開発方法にも限界があった。
Androidの仕組みを理解する前に実装を行っていたため、
画面遷移という初歩的なことにさえ躓いてしまったのだ。
実際に、例をあげると、Androidの画面が
Stackされていく仕組みを理解していなかったため、
永遠に画面が連なるアプリを作ってしまったこともあった。
Androidの基礎を学ぶ為、メンバーで日本語訳したAPI
リファレンスの読み合わせを行い基礎知識を学習した。
そういった失敗や学習を繰り返しつつも、
UDTはランドマーク機能の実装に入った。
ランドマーク機能は、三角関数を利用し、
現在地から目的のランドマークまでの距離を算出する。
三角関数のままでは算出される距離は直線だが
実際の地面は球面のため、正しい距離は求められない。
そのため、
球体の距離を求めるために必要な
球面三角法を利用しなければならない。
UDTは三角球面法を使ったことがなかったため
一から勉強し、実装し完成させた。
(以下が当時勉強の際に使用したノートである)
しかし、ここで衝撃の事実が発覚する。
実は、
三角球面法を利用した球体の距離算出方法は
APIが存在していたのだ。
APIを利用していれば工数は短縮できたはず…。
UDTは事前にAPIを調べることの大切さを
身をもって実感したのだった。
(自分で作ったプログラムで得た値と
APIで作成した値がまったく一緒だったので
ちょっとした達成感はあったという。)
三角球面法と並行して悩まされたのが
Androidのレイアウト方法だ。
プロパティはあるがすべて英語表記のうえ、
意味も抽象的でわかりにくく、
読んだだけでは
プロパティとレイアウトの関連性がわからなかった。
当時は、画面の両端に画像を右揃え・左揃えで
配置するという一見簡単そうなレイアウトにさえ苦戦した。
このレイアウトは、プロパティで領域を二つに区切り、
そのうえで右揃え・左揃えを指定する作業が必要だった。
こういった基礎的なことを理解するため、
実際にプロパティを試していき、
レイアウトを確認する作業をすることになった。
この確認作業を行い、レイアウト方法を掴むのに
何日も作業日数がかかったのだった。
その他にも
アプリが落ちてしまったり、
Androidの状態遷移※1の説明がわからなかったり、
悩むことは多かった。
どこが詰まった?と質問すると
全部詰まったという返答が返ってきたぐらいである。
アプリが落ちてしまう問題については
逼迫されたメモリを解放※2するため、
使わなくなったインスタンス変数に
意図的にnullを入れ解決した。
※1
Homeボタンを押したときや、電話がかかってきたとき等
アプリの状態が変わることを状態遷移という。
API上の説明では抽象的でわかりにくかったため、
実機でどういった状態のとき
どのメソッドが呼ばれるのかを実際に確認しなければ
わからなかった。
※2
アプリケーションが処理を行う上で必要になる変数やリソース(画像など)は、
端末のRAM領域に確保される。しかし、RAM領域が逼迫されてしまうと
アプリケーションが動作できなくなってしまうために、確保した変数や
リソースの削除が必要になる。この不要な変数、リソースの削除を解放という。
以上のように、開発に多くの問題を抱えつつも、
それらをすべて解決し、
UDTはついにランドマーク機能を実装し終え、
現在地からはるか遠くのエッフェル塔までの距離が
簡単にわかるようになったのである。
ランドマークのひとつに「Google本社」がある。
ランドマーク選定時、
Androidということで半分ジョークで
マウンテンビューを入れてみた。
————
(次回 羅針盤開発秘話 第5回は5月28日(金)投稿予定です。
コンパス・水平器機能を実装した戸井氏に話を伺います。)
