[Android] SDK1.5で導入されたSensorEvenetクラス

とりあえず、今まで作成してきたサンプルコードの動作確認を行いました。既存のコードに対して重要そうな変更は、センサー系のインタフェースの変更です。

今までSensorManagerに登録していたSensorListenerがdeprecatedになって、新たにSensorEventListenerが登場するようです。

この変更で大きいのは、座標系の変更です。これは、SensorEventというクラスに定義されています。

1.1までは端末の表示方向によって座標系が切り替わっていました。すなわち、ポートレート表示とランドスケープ表示で軸が切り替わってしまっていたのです。これは、なかなか直感的にわかりにくい感じでした。

1.5からは、スクリーンの表示よらず、端末のデフォルトのオリエンテーションの座標で決まります。携帯端末の画面を見るときに手に持つ方向で考えてみましょう。座標の原点は、左下の角です。X軸は水平方向で右が正の方向です。Y軸は垂直方向で上が正です。Z軸は前後で、画面が向いている方向が正です。2次元で考えると、数学でよく使うXY軸の右上が第一象限の座標です。これは、OpenGL ESの座標系と一緒だそうです。

ちなみに、Android 2D APIsでは、左上が原点です。これは、横書きの文章を読むときの方向と考えるとわかりやすいです。最初の文字が0文字でX軸方向に進みます。2行目、3行目などの行がY軸です。これは、XY軸の右下が第一象限の座標ですね。

ちなに、これって言葉で書くと、とても面倒ですね。図にすると一発なのですが、JavaDocに図を入れるは、結構大変です。で、今回のSensorEventのAPI仕様書をみて、かなり感激してしまいました。なんと、アスキーアートでこれを表現しているのです。それも、G1をモチーフにして。思わず「スゲー」っていっちゃいますね。

ということで、センサー系のアプリを作っている人は、1.5のセンサーAPIは、チェックが必要そうです。