Androidアプリの開発をしよう05 センサー①
加速度センサを使う
実機があると便利です
目次
センサについて
Android端末には各種センサが搭載されています。
センサから得たデータを取得たアプリの作成雨をすることが出来ます。
端末が置かれた環境からデータの取得をすれば、アプリん幅が広がっていきます。
加速度センサ
まずはじめに加速度を検知するアプリを利用してみましょう。
実際にセンサを扱うので、実機があったほうが便利ですが、エミュレータでも動作確認は可能です。
このアプリには画像が必要です。皆さんで準備いただくか、画像の時に使ったドロイド君を利用してください。
エミュレータでのテスト方法は後述します。
加速度センサを利用したプログラム
では、早速加速度センサを利用した以下のプログラムを実行してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Gravity; import android.widget.ImageView; import android.widget.LinearLayout; public class MainActivity extends AppCompatActivity implements SensorEventListener{ ImageView iView; SensorManager sManager; Sensor sensor; float value; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout lLayout = new LinearLayout(this); lLayout.setOrientation(LinearLayout.VERTICAL); lLayout.setGravity(Gravity.CENTER); setContentView(lLayout); //画像の準備 iView = new ImageView(this); iView.setImageResource(R.drawable.droid); iView.setImageAlpha(100); lLayout.addView(iView); } protected void onResume() { super.onResume(); //センサマネージャの取得 sManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); //センサの取得 sensor = sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); //センサを検知するリスナの登録 sManager.registerListener(this,sensor,SensorManager.SENSOR_DELAY_NORMAL); } protected void onPause() { super.onPause(); //リスナの解除 sManager.unregisterListener(this); } @Override //センサの変化があった場合に処理を行うリスナ public void onSensorChanged(SensorEvent event) { // ⬇加速度センサの場合の処理 if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){ float tmp =event.values[0] + event.values[1] + event.values[2]; if((tmp - value) > 3){ //加速度が大きくなったときの処理 iView.setImageAlpha(255); }else{ //加速度がそれ以下の処理 iView.setImageAlpha(100); } value =tmp; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {} } |
実行例は以下のようになります。
この状態で端末を動かすと、ドロイド君が濃く(透明度が下がる)なります。
またエミュレータにおいても、設定画面にあるこのバーを動かすことによって、擬似的に加速度を得ることが可能です。
プログラムの解説
センサを扱うには、まずセンサを管理するセンサマネージャ(SensorManager)を取得します。
このため、アクティビティのgetSystemService()メソッドで指定したセンサオブジェクトを取得できます。
実際にセンサを利用するにはセンサ変更イベントを検知して処理するリスナを定義します。
このリスナはSensorEventListenerインターフェースを実装するものとします。
アクティビティのonResume()メソッド内でのリスナ登録をonPause()メソッド内のリスナで解除をします。
解除をしないとバッテリの消耗が激しくなるので注意が必要です。
なお、登録を行う際にはセンサの検知速度を指定する必要があります。
検知速度が早くなるほどバッテリの消耗が激しくなります。
リスナ内ではセンサから得た3方向に関する値が一定値(3)を超えた場合のみ画像が濃くなるように設定しています。
それ以外では、薄くなる設定にしています。
センサの検知速度
種類 | 速度 |
---|---|
SENSOR_DELAY_FAST | 早い |
SENSOR_DELAY_GAME | ゲームに適する |
SENSOR_DELAY_UI | ユーザーインターフェースに好適 |
SENSOR_DELAY_NORMAL | 通常 |
さいごに
先程書いたようにエミュレータでも動作確認は出来ますが、実感が少ないため実機でのテストをおすすめします。
またこれから様々なセンサを使ったアプリをテストしていきたいと思います。