Step1 プロジェクトの作成とセンサーの利用
方位磁針の設計として、画面の真ん中に大きな矢印があり、常に矢印が北側を向くアプリを作成していきます。
まずは[ファイル]→[新規]→[Androidプロジェクト]より新規プロジェクトを作成しましょう。 ターゲットやプロパティーは次のように設定します。
プロジェクト名 | CompassApp |
ビルド・ターゲット | Android2.2 |
アプリケーション名 | CompassApp |
パッケージ名 | com.example.compassapp |
アクティビティーの作成 | CameraApp |
最小SDKバージョン | 8 |
細かい指定は画像を参考にしてください。
今回は「CompassApp」に加えて「CompassView」というクラスを作成し、2つのクラスでアプリを構成します。前者にはセンサーの中核的なコードを、後者には矢印を描くコードを加えていきます。
それでは「ComassView」クラスを作成します。
[ファイル]→[新規]→[クラス]より「新規Javaクラス」ダイアログを立ち上げます。名前を「CompassView」、修飾子は「public」として「完了」を押しましょう。これで[src]→[com.example.compassapp]内に「CameraView.java」というファイルが生成されます。
CompassView.javaは上記のように設定します。
まずは「CompassApp」を編集していきましょう。センサーを利用するためには、始めに センサーマネージャを使用します。その後、 List<Sensor>を利用してセンサーマネージャより端末に搭載されているセンサーを取得します。
今回は 方位センサーを利用するため引数に「Sensor.TYPE_ORIENTATION」を設定します。(ここではlistというオブジェクト名をつけています)
orientationというのはセンサーのオブジェクトで、今後センサーの処理を始めたり、止めたりする際に指定するオブジェクトです。
画面表示を指定するsetContentViewは、compassViewとオブジェクト名をつけた後に指定します。
public class CompassApp extends Activity { private SensorManager sensorManager; private Sensor orientation; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); List<Sensor>list; list = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION); orientation = list.get(0); compassView = new CompassView(this); setContentView(compassView);s } } |
次に、アクティビティのサイクルにもあった「onCreate()」の次の処理である「onStart()」、「onResume()」、「onStop()」という流れを一気に書き加えたいと思います。
センサーの利用には、「SensorEventsListener」の実装が必要です。まずはその旨を書き加えます。するとクイックフィックス(赤い波下線)より「onAccuracyChanged()」と「onSensorChanged()」というメソッドが自動生成されますが、これについては後で説明します。
続いて、「onResume()」にてセンサー処理を開始させます。そのためには以下のように 「registerListener」メソッドを利用します。
registerListener(SensorEventListener listener, Sensor sensor, Rate rate); |
第1引数であるlistenerには「this」と指定します。 第2引数には開始するセンサーのオブジェクトを指定します。今回は「orientation」というオブジェクト名をつけたのでそれを指定しています。
最後の第3引数ですが、これには情報通知頻度を設定する値が入ります。速度が早い順に最高速〜UI速度(ユーザーインターフェースに適している速度)と用意されています。
今回はこの中で通常速度の定数、「SENSOR_DELAY_NORMAL」を指定します。
SensorManager.SENSOR_DELAY_FASTEST | 最高速 |
SensorManager.SENSOR_DELAY_GAME | ゲーム速度 |
SensorManager.SENSOR_DELAY_NORMAL | 通常速度 |
SensorManager.SENSOR_DELAY_UI | UI速度 |
下記のコードで ifにてorientationオブジェクトの値の有無を確かめているのはオブジェクトの指定なしに処理が進まないようにする為です。
最後の「onStop()」では、センサー処理の停止を記述します。以下のように「unregisterListener()」メソッドを利用します。
unregisterListener(SensorEventListener listener); |
センサー処理の開始でオブジェクトや速度を指定するのとは違って、停止させるListenerを指定するだけです。
上記の作業を加えたコードは、以下のようになります。
public class CompassApp extends Activity implements SensorEventListener { private SensorManager sensorManager; private Sensor orientation; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); List |
CompassApp.javaの編集も、あと少しです。「SensorEventListener」を先ほど実装した際に、「onAccuracyChanged()」と「onSensorChanged()」というメソッドが自動生成されました。これについて記述を加えます。
まず「onAccuracyChanged()」ですが、センサー精度の変更を行うときに利用するメソッドです。必要なメソッドなのですが、精度を変更する必要はないのでこれについては、何も記述しなくて大丈夫です。 続いて「onSensorChanged()」です。これはセンサーの値が変わったときに呼び出されるメソッドです。今回利用する傾きセンサーには、「0:方位」、「1:ロール」、「2:ヨー」の配列で格納されている0から始まる3つの値が格納されています。(ロール・ヨーに関しては今回は利用しませんので詳しくは解説しませんが、進行方向に対して正面から左右に回転する軸をロール軸、上から俯瞰で見て地面と並行に回転する軸をヨー軸と言います。)
これについては、Android SDKに入っている「API Demos」の中の[OS]→[Sensors]という項目を試すことで実感できると思います。
センサーを利用するときに参考になるデモです。
ここで、センサーの値の「0:方位」を新しく作成した配列sensorValuesのsensorValues[0]に代入しています。「1:ロール」、「2:ヨー」も、利用はしませんが代入しています。その後、代入した値を画面表示を担当する 「CompassView.java」のdrawScreenメソッドに渡します。これについてはStep3で詳しく説明します。
以上でCompassApp.javaの編集は終了です。最終的なコードは以下のようになります。
public class CompassApp extends Activity implements SensorEventListener { private SensorManager sensorManager; private Sensor orientation; private float[] sensorValues = new float[3]; private CompassView compassView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); compassView = new CompassView(this); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); List |
第8回 センサーを使ってみよう(後編)
Step1 プロジェクトの作成とセンサーの利用
Step2 矢印の作成と値の受け渡し
Step3 実際に起動してみましょう