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

Xamarin 日本語情報

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

Xamarin.AndroidでAccelerometerを使うには?

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

ytabuchi.hatenablog.com

の続きです。Xamarin.AndroidでAccelerometerの値を取ってみます。Android.Hardware.SensorManagerを使用します。

幸い、Xamarinのサイトにレシピがありましたので、Get Accelerometer Readings - Xamarin を参考にしました。

私が試しに作ったプロジェクトはこちら(GitHub)

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

f:id:ytabuchi:20151128233035g:plain:w300

準備

Androidは結構やることが多いです。

まず、ActivityにISensorEventListenerの継承を追加します。ISensorEventListenerには、OnAccuracyChangedOnSensorChangedの実装が必要です。

f:id:ytabuchi:20151128215207p:plain:w450

Visual Studio 2015 なら、Ctrl+.インターフェイスを実装してくれるので超便利ですね。

f:id:ytabuchi:20151128220717p:plain:w450

ActivityクラスでsyncLock ObjectとSensorManagerインスタンス化しておきます。

static readonly object syncLock = new object();
SensorManager sensorManager;

OnCreateメソッドでSenserManagerをGetします。

sensorManager = (SensorManager)GetSystemService(SensorService);

SensorManagerは山程あるセンサーを全部管理してるみたいなので、OnResumeメソッドで、Accelerometerを取得するように指定します。

sensorManager.RegisterListener(this, sensorManager.GetDefaultSensor(SensorType.Accelerometer), SensorDelay.Ui);

引数1はリスナーでActivityで処理してるのでthis、引数2でSensorTypeAccelerometerに指定、 引数3Delayは取得する間隔でNormalUiGameFastestの順に頻度が上がるみたいです。

Android Javaの場合の書き方はAndroid Sensors 復習 #1 加速度センサ | Developers.IOを参考にしました。基本は同じですね。

Accelerometerの値を取得した際の処理

これで準備が出来ましたので、OnSensorChangedに取得した際の処理を追加していきます。

取得するSensorのタイプをAccelerometerにしているので、引数SensorEvent e[0]がX軸、[1]がY軸、[2]がZ軸です。

今回は、スマホの画面を上にした状態を水平として、上下左右に傾けた時にAbsoluteLayoutの中央に配置したTextViewを画面内で動かしたかったので、次のようなコードを書きました。

sensorText.Text = string.Format("X = {0:N4}\nY = {1:N4}", e.Values[0], e.Values[1]);

// Viewをはみ出さないようにAccelerometerの値によってTextViewを移動
if (nowX - e.Values[0] * 10 > 0 && nowX - e.Values[0] * 10 < layoutW - textW)
    sensorText.SetX(nowX - e.Values[0] * 10);

if (nowY + e.Values[1] * 10 > 0 && nowY + e.Values[1] * 10 < layoutH - textH)
    sensorText.SetY(nowY + e.Values[1] * 10);

Androidは、右に傾けるとX軸がマイナス、下に傾けるとY軸がプラスの値になります。

    -Y
+X   +   -X
    +Y

※次は iOS のエントリー書きますが、iOSは+-が逆でしたw

iOSの場合はこちら

ytabuchi.hatenablog.com

Xamarin 気になった方は

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

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

以上です。