こんにちは。エクセルソフトの田淵です。
の続きです。無事、iOSの画面サイズが取れましたのでXamarin.iOSでAccelerometerの値を取得し、スマホの傾きでLabelをフラフラと動かしてみたいと思います。CoreMotion.CMMotionManager
を使用します。
こちらも幸いにもXamarinのレシピ Use CoreMotion with Accelerometer - Xamarin がありましたので、まるっと参考にしています。
サンプルプロジェクトは こちら(GitHub)
できあがりはこんな感じです
準備
CMMotionManagerをメンバー変数として指定する。位でしょうか。
CMMotionManager motionManager;
@ytabuchi @omanuke 何か、田淵さんのやりそうなことをエスパーすると、CMMotionManager をメンバー変数として持たずに、メソッドの内部とかでnew してローカル変数に代入しちゃったりしていませんか? GC で改修されて動きが止まるとか・・・。
— Takashi Kawasaki (@espresso3389) 2015, 11月 26
メンバー変数として持っておかないと、ガベージコレクションされて止まりますので注意w
Accelerometerの値を取得した際の処理
iOSネイティブの書き方は 【Tips】iOSで加速度センサーを使用する - CoreMotion - koogawa blog を参考にしました。
motionManager.StartAccelerometerUpdates
でAccelerometerの変更を取得できます。
iOSネイティブではハンドラを指定して、その後で取得開始としていますが、C#なのでそのままラムダ式に突っ込めますね。
motionManager.StartAccelerometerUpdates(NSOperationQueue.CurrentQueue, (data, error) => { // ここに処理を記述 // data(CoreMotion.CMAccelerometerData)でハンドラを処理します });
data.Acceleration.X
でX軸、data.Acceleration.Y
でY軸、data.Acceleration.Z
でZ軸を取得できます。今回は、スマホの画面を上にした状態を水平として、上下左右に傾けた時にViewの中央に配置したLabelを画面内で動かしたかったので、次のようなコードを書きました。
sensorText.Text = string.Format("X = {0:N4}\nY = {1:N4}", data.Acceleration.X, data.Acceleration.Y); // 現在の位置を取得 nowX = sensorText.Frame.X; nowY = sensorText.Frame.Y; // Viewをはみ出さないようにAccelerometerの値によってLabelを移動 if (nowX + (nfloat)data.Acceleration.X * 10 > 0 && nowX + (nfloat)data.Acceleration.X * 10 < layoutW - textW) textLoc.X = nowX + (nfloat)data.Acceleration.X * 10; if (nowY - (nfloat)data.Acceleration.Y * 10 > 0 && nowY - (nfloat)data.Acceleration.Y * 10 < layoutH - textH) textLoc.Y = nowY - (nfloat)data.Acceleration.Y * 10; // Frameを再定義(しないと位置が変わらない) sensorText.Frame = textLoc;
Accelerometerを取得する間隔は、motionManager.AccelerometerUpdateInterval
で指定します。
出来上がってしまえば簡単なんですが、オブジェクトの位置を変える時もFrame
を変数に入れて、CGRect
で新しい場所を指定して、Frame
に変数を戻す(?)とかさっぱり意味の分からない処理をしないといけなくて、iOSって難しいですね。
できればXamarin.Formsだけ触っていたいですw
これで JCUGC 仙台の元ネタが出来ました。仙台ではコレを Xamarin.Forms で動かしてみたいと思います!まだ参加される方が少ないですが、是非見に来てください。
Android の場合はこちら
Xamarin 気になった方は
是非 ダウンロード(直接) / ダウンロード(弊社経由) して触ってみてください。 学習用リソース や JXUG リンクページ に参考資料を纏めてますので併せてどうぞ。
Xamarin の情報が欲しい方はこのブログも購読いただいたりすると嬉しいです。
以上です。