こんにちは。エクセルソフトの田淵です。
の続きです。Xamarin.AndroidでAccelerometerの値を取ってみます。Android.Hardware.SensorManager
を使用します。
幸い、Xamarinのサイトにレシピがありましたので、Get Accelerometer Readings - Xamarin を参考にしました。
私が試しに作ったプロジェクトはこちら(GitHub)
できあがりはこんな感じです。
準備
Androidは結構やることが多いです。
まず、ActivityにISensorEventListener
の継承を追加します。ISensorEventListener
には、OnAccuracyChanged
とOnSensorChanged
の実装が必要です。
Visual Studio 2015 なら、Ctrl+.
でインターフェイスを実装してくれるので超便利ですね。
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でSensorType
をAccelerometer
に指定、
引数3Delay
は取得する間隔でNormal
、Ui
、Game
、Fastest
の順に頻度が上がるみたいです。
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の場合はこちら
Xamarin 気になった方は
是非 ダウンロード(直接) / ダウンロード(弊社経由) して触ってみてください。 学習用リソース や JXUG リンクページ に参考資料を纏めてますので併せてどうぞ。
Xamarin の情報が欲しい方はこのブログも購読いただいたりすると嬉しいです。
以上です。