App Inventorでの開発時、時計の表示は大まかにこんな感じで行っていました。
<1秒毎に実行されるタイマースタート
↓
現在時刻取得
↓
時・分・秒分割表示
↓
タイマー終了>
時計だけの場合は、これで概ね問題はなかったのですが、これと平行して距離の計算を行うようにしてからは、まともに1秒毎に時計表示が更新されない、というか1秒以内に更新が間に合わなくなってしまい、2~3秒おきの表示になってしまいました。これはかなり問題でしたね。
ということで、今回はJAVA&Eclipseでまずは時計を作ってみます。
Androidには、もともと
・アナログ時計
・デジタル時計
というものが備わっています。簡単にいうと、【画面のここに”デジタル時計”を表示】と配置してあげると、勝手に端末の時計を表示してくれるというものです。
ただ、これだけでは一回表示した後に更新されません。従ってやはりApp Inventorのときと同じように、1秒毎に現在時刻を取得して表示してあげることで、時分秒が表示されるデジタル時計として使用することができます。
ここで、一つ重要な事項が後々発見しました。時系列はズレますが、時計の利用時、特にラリーのように秒単位で必要な時計を作る際には重要な問題ですので、ここで挙げておきます。
それは、
Androidは時計の秒合わせができない
いろいろ技を駆使すればできないこともないのですが、一般的ではなく、たとえば普通の時計やパソコンの時計みたいに、ワンタッチで時報と秒を合わせるということはできません。今の機種はどうだかわかりませんが、少なくとも私が持っているSH-03Cではできません。
これに気が付く、というか今までの携帯が勝手に秒まで合わせてくれていたため、てっきり秒まで合っているものだと思い込んでいてしまい、つい最近まで考えもしない問題でした。
端末で秒を合わせられないのであれば、端末から時刻を取得しても意味がなく、一瞬、
このアプリ終わった・・・・
と途方に暮れました。しかし、そうも言ってられないということで、対策をいろいろ考えます。まず
・分単位での修正は端末で可能
これにより、分より上の修正は端末で適当にやってもらうことにします。ということで、アプリ側では秒のみ
の修正を考えることにしました。
秒の修正をどうするか?
アプリのプログラミングでも対策はできるのですが、これは裏技的な話になってしまい、アプリ利用者が知らないうちに裏技をさせられている、ということになってしまいます。これはまずいですので、却下。
そこで、考えた結果の対策が
もう一個時計作っちゃいなよ
というもの。つまり、システム時計とは別にアプリ専用の時計を併走させてしまおうというものです。このアプリ専用の時計は、アプリのプログラム上でしか動いていないため、もし時計をいじっても端末そのものには何の作用もしません。
ASE Rally Monitorには設定画面があり、いくつかの設定項目についてはメモリーしておくことができます。その一つとして、基準時計との誤差を設定しておくことで、アプリ内の時計を常時補正するようにしました。
システム時計を使わずに、アプリに独自の時計を併走させることで、秒の補正ができるようになりました。ラリー競技においては、大会公式時計が必ずしも国の基準時間とぴったり合っているとは限りません。
国内だけであれば良いのですが、アプリはすでに世界各国でご利用いただいております。中には基準時計そのものがあいまいな地域があるかもしれません。そんなときに、この方式であれば、常に最初の段階で大会公式時計と合わせることができます。
いちいちスタート前に合わせる必要がありますが、下手に端末を信用するよりは、確実かな?と思いますので、我慢していただければ良いなと思います。
ということで、時計については、完成しました。あとは、距離計測をしても問題なければ良いのですが・・・。
0 件のコメント:
コメントを投稿