「ちょい地図」に進行方向と速度のリアルタイム表示を ― 2012/02/29 19:30
「ちょい地図」で現在位置の取得をする際に、移動中の場合に現在位置が変わるにつれてどんどん画面表示がずれて行ってしまうのが気になっていました。
そこでなんとか一定速度以上で移動している場合、その移動にリアルタイムに追従させたいと思いいろいろ模索しました。
(注:キャプチャ画面は、iPhone Simulatorのもので、実際に車を走らせてはいませんので...あしからず)
その仕様は
1.移動速度が10km/hを超えると、自動追尾を行う。
2.同時に移動中の方角と速度を取得し、リアルタイムに表示する。
こんな感じです。
重い処理にはしたくなかったので、極力シンプルな計算で済むように考えてみました。(大小比較を用いず、360°を32分割して11.25°で割った商から、あらかじめ配列化した方位の文字列を取得してみた)
■Localizable.strings(Japanese) <- Englishも同様に
"course00" = "北";
"course01" = "北北東"; <- リソースに同じ方位を2個ずつ
"course02" = "北北東";
・
・
"course29" = "北北西";
"course30" = "北北西";
"course31" = "北";
"moving_str" = "%@方向 に時速 %@ km/h で移動中";
■***ViewController.m
- (void)viewDidLoad
{
・
・
// 進行方向(方位)の文字列を配列に格納(11.25°ずつに分ける)
courseArray = [[NSMutableArray alloc] initWithCapacity:0];
for (int i=0; i<=31; i++) {
NSString *tmpStr = [NSString stringWithFormat:@"course%02d", i];
langStr = NSLocalizedString(tmpStr, nil);
[courseArray addObject:langStr];
}
・
・
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
・
・
if (newLocation.speed > 2.7777) { // 時速10km=2.7777m/s
・
・
// 方角を32等分し、それぞれの方位の文字列を取得する。(例:北北東)
NSInteger icourse = (floor)(newLocation.course / 11.25);
NSString *courseStr = [courseArray objectAtIndex:icourse];
// 移動速度を時速に変換し、文字列を作成する。(小数点以下2桁)
NSString *kmStr = [NSString stringWithFormat:@"%0.2f", newLocation.speed * 3600 / 1000];
langStr = NSLocalizedString(@"moving_str", nil);
NSString *tmpStr = [NSString stringWithFormat:langStr, courseStr, kmStr];
・
・
}
これで一応、思っていたようなリアルタイム表示が得られました。
そこでなんとか一定速度以上で移動している場合、その移動にリアルタイムに追従させたいと思いいろいろ模索しました。
(注:キャプチャ画面は、iPhone Simulatorのもので、実際に車を走らせてはいませんので...あしからず)
その仕様は
1.移動速度が10km/hを超えると、自動追尾を行う。
2.同時に移動中の方角と速度を取得し、リアルタイムに表示する。
こんな感じです。
重い処理にはしたくなかったので、極力シンプルな計算で済むように考えてみました。(大小比較を用いず、360°を32分割して11.25°で割った商から、あらかじめ配列化した方位の文字列を取得してみた)
■Localizable.strings(Japanese) <- Englishも同様に
"course00" = "北";
"course01" = "北北東"; <- リソースに同じ方位を2個ずつ
"course02" = "北北東";
・
・
"course29" = "北北西";
"course30" = "北北西";
"course31" = "北";
"moving_str" = "%@方向 に時速 %@ km/h で移動中";
■***ViewController.m
- (void)viewDidLoad
{
・
・
// 進行方向(方位)の文字列を配列に格納(11.25°ずつに分ける)
courseArray = [[NSMutableArray alloc] initWithCapacity:0];
for (int i=0; i<=31; i++) {
NSString *tmpStr = [NSString stringWithFormat:@"course%02d", i];
langStr = NSLocalizedString(tmpStr, nil);
[courseArray addObject:langStr];
}
・
・
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
・
・
if (newLocation.speed > 2.7777) { // 時速10km=2.7777m/s
・
・
// 方角を32等分し、それぞれの方位の文字列を取得する。(例:北北東)
NSInteger icourse = (floor)(newLocation.course / 11.25);
NSString *courseStr = [courseArray objectAtIndex:icourse];
// 移動速度を時速に変換し、文字列を作成する。(小数点以下2桁)
NSString *kmStr = [NSString stringWithFormat:@"%0.2f", newLocation.speed * 3600 / 1000];
langStr = NSLocalizedString(@"moving_str", nil);
NSString *tmpStr = [NSString stringWithFormat:langStr, courseStr, kmStr];
・
・
}
これで一応、思っていたようなリアルタイム表示が得られました。
iPhone実機のローカルデータをiPhone Simulatorに反映 ― 2012/02/24 13:14
今日 iPhone_dev_jp のTwitterを眺めていたら、ピンとくる投稿がありました。
iExplorerの情報です。
iExplorerの情報です。
iExplorerはiTunesが入ったパソコンにインストールすると、実機を普段の接続ケーブルでUSB接続して、iPhone内部のデータをエクスポートすることが出来ます。
それによって、アプリケーションのデータをパソコンに吸い出せます。
今時のクラウド対応のアプリならともかく、iPhone端末ローカルへのデータ保存を行うアプリを開発してる場合、現在実機に入っている情報をそのまま開発環境の iPhone Simulator にコピーしてデバッグを行いたいと常々思っていましたが、iPhoneをJBする以外にその手段が無いだろうと諦めていました。
ところがこのiExplorerを使用すると、実機のアプリの最新のDocumentsフォルダ内のデータを吸い出せるので、後はそのデータを Mac内の iPhone Simulator のデータフォルダにコピーするだけで、全く実機と同様な状態でデバッグが出来るようになりました。
これは、大変有用なヒントをいただきました!
iOSプログラミングの勉強 ― 2012/02/22 15:23
昔作ったWindows用のランチャーソフト「EZ Launcher」のデジタル時計表示をiPhone上でそのまま表示してみようと思いつきコーディングをし始めたら、思いのほか時間がかかってしまいました。
まだまだiOSに対する自分のグラフィック関連の処理のスキルは赤ちゃんレベルです。
まだまだiOSに対する自分のグラフィック関連の処理のスキルは赤ちゃんレベルです。
とりあえず、まがいなりにもなんとか動作するようになりました。
この部分は数字だけではなくアルファベットも表示するため、画像フォントを自前で用意しているので、少し複雑でした。
なんとか動作するようになって一安心です。
WindowsならBitBltでひょい!っと出来るのですが...
これが出来たことで応用がききそうなので、いろいろ考え中です。
(EZ Launcherの時計と、iPhoneシミュレータの時計が狂っているのは、リモートデスクトップで別マシンにつないでいるためです)
超久しぶりに... ― 2011/12/08 08:03
本当に超久しぶりというのが相応しい...
一年以上ぶりにこのブログを書いています。
この一年ちょっとの間、好きなモバイルグッズも以前と同様にいじりながらも、日々ブログに残しながら...というのは意図的にあまりしませんでした。
それに、facebookやTwitterにも時々、気が向くままに投稿したりしてましたので、ブログまで書かなくても書いていない気分にあまりならなかった...というのもありました。
ただ、以前の自分の書き込みを眺めてみると、もう忘れてしまったようなことが結構詳細に残っているため、やっぱり記録としてどこかにやったことをちゃんと残すことは、しておくほうがいいかなぁ...と思ってきました。
と言うわけで、少しずつこのブログにもできる範囲内で記事を書こうと思っています。
今は、愛用している iPhone4 用に、自分が欲しいと思っていたアプリを四苦八苦しながら開発しています。
そのあたりも落ち着いたら、記事にしてみたいなぁと。
一年以上ぶりにこのブログを書いています。
この一年ちょっとの間、好きなモバイルグッズも以前と同様にいじりながらも、日々ブログに残しながら...というのは意図的にあまりしませんでした。
それに、facebookやTwitterにも時々、気が向くままに投稿したりしてましたので、ブログまで書かなくても書いていない気分にあまりならなかった...というのもありました。
ただ、以前の自分の書き込みを眺めてみると、もう忘れてしまったようなことが結構詳細に残っているため、やっぱり記録としてどこかにやったことをちゃんと残すことは、しておくほうがいいかなぁ...と思ってきました。
と言うわけで、少しずつこのブログにもできる範囲内で記事を書こうと思っています。
今は、愛用している iPhone4 用に、自分が欲しいと思っていたアプリを四苦八苦しながら開発しています。
そのあたりも落ち着いたら、記事にしてみたいなぁと。
VMware - 一覧に無い画面解像度を追加する方法 ― 2009/11/28 07:58
もう既出の方法かもしれませんが、自分がいろいろ試していて偶然わかったことなので、自分用にメモしておきます。
VMwareを使っていて、実機を想定した開発を行なう場合、実機の画面解像度で開発したい場合があります。
例えば、最近の横長ディスプレイ 1366x768 のように。
しかし、VMwareの仮想マシン内の画面解像度の一覧にはこのような特殊なものは出てこない場合があります。(親OSの解像度によっては出てくることもあるかもしれませんが...)
この解像度一覧に、自分の欲しい解像度を追加する方法がわかりました。(自分の試したのはVMware内の仮想WindowsXPです)
1.まずVMware上の仮想OSを起動します。
2.起動したらレジストリエディタを開きます。
3.HKLM\System\CurrentControlSet\Control\Video のキーを開きます。
4.その中にさらに数種類のキーがクラス名で存在しています。
(例){70837E58-4999-497C-8F89-4208283A12DF}
その数種類のキーを順番に開いて、「0000」のキーの中の 「Device Description 」の文字列が「VMware SVGA II」のものを探します。
5.同じ場所の中に「Resolution.0」から「Resolution.10」のように値が並んでいます。 これが解像度一覧になります。 (環境により、個数は違う可能性があります)
6.これに新しい解像度を追加します。 たとえば1366x768を追加するには、Resolution.10までリストがあるとすると、新しくバイナリ値でResolution.11を新規作成します。 このバイナリ値の値を「 31 33 36 36 78 37 38 00 」と設定します。 これはアスキーコードとなります。 また最後は常に「00」となっています。
8.これを設定した後で、仮想OSを再起動してみると、画面のプロパティに新しく「1366x768」の解像度が出現しています。
以上です。
ちょっとややこしいみたいに見えますが、やってみるとすぐにできます。
ただ、これがVMwarePlayerでできるかどうかはわかりません。
自分はVMware Workstation をVer.2のころから使い続けています。
なお、上記の変更はレジストリの変更ですので、誤ると最悪起動しなくなったりする恐れがありますので、かならず仮想OSのバックアップをとった上でのテスト環境でまず試す必要があります。
VMwareを使っていて、実機を想定した開発を行なう場合、実機の画面解像度で開発したい場合があります。
例えば、最近の横長ディスプレイ 1366x768 のように。
しかし、VMwareの仮想マシン内の画面解像度の一覧にはこのような特殊なものは出てこない場合があります。(親OSの解像度によっては出てくることもあるかもしれませんが...)
この解像度一覧に、自分の欲しい解像度を追加する方法がわかりました。(自分の試したのはVMware内の仮想WindowsXPです)
1.まずVMware上の仮想OSを起動します。
2.起動したらレジストリエディタを開きます。
3.HKLM\System\CurrentControlSet\Control\Video のキーを開きます。
4.その中にさらに数種類のキーがクラス名で存在しています。
(例){70837E58-4999-497C-8F89-4208283A12DF}
その数種類のキーを順番に開いて、「0000」のキーの中の 「Device Description 」の文字列が「VMware SVGA II」のものを探します。
5.同じ場所の中に「Resolution.0」から「Resolution.10」のように値が並んでいます。 これが解像度一覧になります。 (環境により、個数は違う可能性があります)
6.これに新しい解像度を追加します。 たとえば1366x768を追加するには、Resolution.10までリストがあるとすると、新しくバイナリ値でResolution.11を新規作成します。 このバイナリ値の値を「 31 33 36 36 78 37 38 00 」と設定します。 これはアスキーコードとなります。 また最後は常に「00」となっています。
8.これを設定した後で、仮想OSを再起動してみると、画面のプロパティに新しく「1366x768」の解像度が出現しています。
以上です。
ちょっとややこしいみたいに見えますが、やってみるとすぐにできます。
ただ、これがVMwarePlayerでできるかどうかはわかりません。
自分はVMware Workstation をVer.2のころから使い続けています。
なお、上記の変更はレジストリの変更ですので、誤ると最悪起動しなくなったりする恐れがありますので、かならず仮想OSのバックアップをとった上でのテスト環境でまず試す必要があります。



最近のコメント