因為物體在位移時會對某個空間產生速度,透過速度的大小可以去抓取手機的方向,那怎麼知道手機的左、右、上和下的數值在X以及Y軸要怎麼表示?
透過300次資料比對後,畫出這張示意圖。手機垂直時,XY軸數值就如下方所表示的,水平的我還沒有去測試過,不過我想應該一樣的。
物體加速度時會產生所謂的反作用力,反作用力出現時,我們可以透過時間長短去抵銷,或是透過移動範圍去解決反作用力這令人頭痛的問題。
package com.example.getangle; import android.app.Activity; 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.WindowManager; import android.widget.TextView; public class MainActivity extends Activity implements SensorEventListener { SensorManager manager; Sensor sensor; static float[] values = new float[3]; static float[] init = new float[] { 0.0f, 0.0f, 0.0f }; static float x, y, z; TextView textView; long lastUpdateTime = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); manager = (SensorManager) getSystemService(SENSOR_SERVICE); sensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); textView = (TextView) findViewById(R.id.text); } @Override protected void onPause() { unRegister(); super.onPause(); } @Override protected void onResume() { super.onResume(); register(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public void onAccuracyChanged(Sensor arg0, int arg1) { } public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { if (init[0] == 0 && init[1] == 0 && init[2] == 0) { init[0] = event.values[0]; init[1] = event.values[1]; init[2] = event.values[2]; } values = event.values; x = init[0] - values[0]; y = init[1] - values[1]; z = init[2] - values[2]; } long currentUpdateTime = System.currentTimeMillis(); // 取得目前系統時間 long timeInterval = currentUpdateTime - lastUpdateTime; // 時間秒數=目前系統時間-值變化的時間 if (timeInterval < 300) // 判斷目前時間是否小於300毫秒 lastUpdateTime = currentUpdateTime; // 值變化時間=當前時間 else { if (x < -5) { textView.setText("左邊"); } else if (x > 5) { textView.setText("右邊"); } else if (x > -5 && x < 5) { if (y > 5) { textView.setText("上"); } else if (y < -5) { textView.setText("下"); } } else { textView.setText(""); } } // y+ // x+ - // - } private final void register() { manager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); } private final void unRegister() { manager.unregisterListener(this); x = 0; y = 0; z = 0; } }
圖片來源:
http://www.sogi.com.tw/product/productinfo.aspx?pno=8172