Android 重力感應手機方向
package net.canking.turnmute;import java.util.List; import net.canking.manager.AudioM; import net.canking.turnmute.R.string; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.media.AudioManager; import android.os.Bundle; import android.provider.ContactsContract.CommonDataKinds.Event; import android.app.Activity; import android.content.Context; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.support.v4.app.NavUtils; public class MainActivity extends Activity { private SensorManager mSensorManager; private Button buttonOpen, buttonClose; private TextView tView; private String modeStr; private AudioM audioM; private Sensor sensor; private final SensorEventListener mSensorEventListener = new SensorEventListener() { public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub if(event.sensor.getType() == Sensor.TYPE_ORIENTATION){ float fPitchAngle = event.values[SensorManager.DATA_Y]; if(fPitchAngle<-120){ audioM.setMode(AudioManager.RINGER_MODE_SILENT); tView.setText(getString(R.string.tip)+"靜音"); }else { audioM.setMode(AudioManager.RINGER_MODE_NORMAL); tView.setText(getString(R.string.tip)+"普通"); } } } public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getView(); mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); audioM = new AudioM(MainActivity.this); modeStr = audioM.getAudioManagetMode(); sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); addListener(); } private void getView() { buttonOpen = (Button)findViewById(R.id.open); buttonClose = (Button)findViewById(R.id.close); tView = (TextView)findViewById(R.id.textView1); } private void addListener(){ /*mSensorEventListener = new SensorEventListener() { public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub if(event.sensor.getType() == Sensor.TYPE_ORIENTATION){ float fPitchAngle = event.values[SensorManager.DATA_Y]; if(fPitchAngle<-120){ audioM.setMode(AudioManager.RINGER_MODE_SILENT); tView.setText(getString(R.string.tip)+"靜音"); }else { audioM.setMode(AudioManager.RINGER_MODE_NORMAL); tView.setText(getString(R.string.tip)+"普通"); } } } public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } };*/ buttonOpen.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub mSensorManager.registerListener(mSensorEventListener, sensor, SensorManager.SENSOR_DELAY_NORMAL); } }); buttonClose.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub mSensorManager.unregisterListener(mSensorEventListener); } }); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); tView.setText(getString(R.string.tip)+modeStr); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); MainActivity.this.onDestroy(); MainActivity.this.finish(); } } </pre><br />
重力感應主要是依靠手機的加速度傳感器(accelerometer)來實現 在Android的開發中一共有八種傳感器但是不一定每一款真機都支持這些傳感器。因為很多功能用戶根本不care的所以可能開發商會把某些功能屏蔽掉。還是得根據真機的實際情況來做開發,今天我們主要來討論加速度傳感器的具體實現方式。
傳感器名稱如下:
加速度傳感器(accelerometer)
陀螺儀傳感器(gyroscope)
環境光照傳感器(light)
磁力傳感器(magnetic field)
方向傳感器(orientation)
壓力傳感器(pressure)
距離傳感器(proximity)
溫度傳感器(temperature)
1. 降噪處理,如果做過LBS軟件的大家可能明白偏移修正,在GPS無法正常獲取數據較間斷時地圖不能亂飄,這里Sensor也不例外,除了使用采樣數據平均值獲取外,可以間隔采樣的方法來處理。細節的算法我們將在下節給出示例代碼。
2. 感應器的敏感度,在Android中提供了四種延遲級別分別為
SENSOR_DELAY_FASTEST 最低延遲,一般不是特別敏感的處理不推薦使用,該種模式可能造成手機電力大量消耗,由于傳遞的為原始數據,算法不處理好將會影響游戲邏輯和UI的性能,所以Android開發網不推薦大家使用。
SENSOR_DELAY_GAME 游戲延遲,一般絕大多數的實時性較高的游戲都使用該級別。
int SENSOR_DELAY_NORMAL 標準延遲,對于一般的益智類或EASY級別的游戲可以使用,但過低的采樣率可能對一些賽車類游戲有跳幀現象。
int SENSOR_DELAY_UI 用戶界面延遲,一般對于屏幕方向自動旋轉使用,相對節省電能和邏輯處理,一般游戲開發中我們不使用。
有關Android游戲開發中的Sensor感應示例今天我們將一起來討論,對于目前最新的Android 2.2平臺而言仍然沒有具體的感應判斷邏輯,下面我們一起定義下常用的感應動作事件。首先Android123提醒大家由于是三軸的立體空間感應所以相對于軌跡球、導航鍵的上下左右外,還提供了前后的感應,所以我們定義最基本的六種空間方向。
- public static final int CWJ_UP = 0;
- public static final int CWJ_DOWN = 1;
- public static final int CWJ_LEFT = 2;
- public static final int CWJ_RIGHT = 4;
- public static final int CWJ_FORWARD = 8; //向前
- public static final int CWJ_BACKWARD = 16; //向后
應用實例:已通過測試(只可以自己機器沒感應)