加速度センサーには重力が含まれているので細かい振動はそのままでは検知できない
らしい
参考
niu's development log: 加速度センサーで振動を検知する
Androidで動く携帯Javaアプリ作成入門(51):ウェアラブル時代に見直したいAndroidの加速度/重力センサー、ジャイロスコープ (2/3) - @IT
http://blog.r-learning.co.jp/archives/220
画面
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:id="@+id/layout1"> <TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/text1" android:textSize="32dp" /> </RelativeLayout>
※振っている際の値を読みきれないので少し文字サイズを大きめにしてみる
実装
MainActivity
package jp.mshige1979.app.samplesensor04; import android.app.Activity; import android.graphics.Color; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import org.w3c.dom.Text; public class MainActivity extends Activity { // センサーマネージャー private SensorManager manager; // センサーイベントリスナー private SensorEventListener listener; // テキストビュー TextView textView1 = null; // 今回の加速度 private float fAccell[] = new float[3]; private float gravity[] = { 0.0f, 0.0f, 0.0f }; private float[] linear_acceleration = { 0.0f, 0.0f, 0.0f }; private final float alpha = 0.8f; private RelativeLayout layout1 = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); layout1 = (RelativeLayout)findViewById(R.id.layout1); // センサーマネージャーを取得 manager = (SensorManager)getSystemService(SENSOR_SERVICE); // センサーのイベントリスナーを登録 listener = new SensorEventListener() { // 値変更時 @Override public void onSensorChanged(SensorEvent sensorEvent) { // センサーの種類で値を取得 switch( sensorEvent.sensor.getType()) { // 加速度 case Sensor.TYPE_ACCELEROMETER: fAccell = sensorEvent.values.clone(); gravity[0] = alpha * gravity[0] + (1 - alpha) * fAccell[0]; gravity[1] = alpha * gravity[1] + (1 - alpha) * fAccell[1]; gravity[2] = alpha * gravity[2] + (1 - alpha) * fAccell[2]; linear_acceleration[0] = fAccell[0] - gravity[0]; linear_acceleration[1] = fAccell[1] - gravity[1]; linear_acceleration[2] = fAccell[2] - gravity[2]; //layout1.setBackgroundColor(Color.TRANSPARENT); if(linear_acceleration[0] >= 1.5f){ layout1.setBackgroundColor(Color.BLUE); } if(linear_acceleration[1] >= 1.5f){ layout1.setBackgroundColor(Color.YELLOW); } if(linear_acceleration[2] >= 1.5f){ layout1.setBackgroundColor(Color.GREEN); } String str = ""; str += "加速度センサー(重力あり)\n" + "X:" + Math.abs(fAccell[0]) + "\n" + "Y:" + Math.abs(fAccell[1]) + "\n" + "Z:" + Math.abs(fAccell[2]) + "\n"; str += "\n\n"; str += "加速度センサー(重力除去)\n" + "X:" + Math.abs(linear_acceleration[0]) + "\n" + "Y:" + Math.abs(linear_acceleration[1]) + "\n" + "Z:" + Math.abs(linear_acceleration[2]) + "\n"; textView1.setText(str); break; } } // @Override public void onAccuracyChanged(Sensor sensor, int i) { } }; // text textView1 = (TextView)findViewById(R.id.text1); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @Override protected void onResume() { super.onResume(); // リスナー設定:加速度 manager.registerListener( listener, manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI); } @Override protected void onPause() { super.onPause(); // リスナー解除 manager.unregisterListener(listener); } }
※振った場合に背景の色が変わるようにしてみた。
結果