読者です 読者をやめる 読者になる 読者になる

Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

Xamarin.iOSでAccelerometerを使うには?

Xamarin Xamarin.iOS

こんにちは。エクセルソフトの田淵です。

ytabuchi.hatenablog.com

の続きです。無事、iOSの画面サイズが取れましたのでXamarin.iOSでAccelerometerの値を取得し、スマホの傾きでLabelをフラフラと動かしてみたいと思います。CoreMotion.CMMotionManagerを使用します。

こちらも幸いにもXamarinのレシピ Use CoreMotion with Accelerometer - Xamarin がありましたので、まるっと参考にしています。

サンプルプロジェクトは こちら(GitHub)

できあがりはこんな感じです

f:id:ytabuchi:20151128211300g:plain:w300

準備

CMMotionManagerをメンバー変数として指定する。位でしょうか。

CMMotionManager motionManager;

メンバー変数として持っておかないと、ガベージコレクションされて止まりますので注意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 の場合はこちら

ytabuchi.hatenablog.com

Xamarin 気になった方は

是非 ダウンロード(直接) / ダウンロード(弊社経由) して触ってみてください。 学習用リソースJXUG リンクページ に参考資料を纏めてますので併せてどうぞ。

Xamarin の情報が欲しい方はこのブログも購読いただいたりすると嬉しいです。

以上です。