編輯:關於Android編程
android動作傳感器
Android平台支持一些用於監視設備動作的傳感器(這樣的傳感器共有5個)。其中兩個(加速傳感器和陀螺儀傳感器)是純的硬件傳感器。另外三個(重力傳感器、線性加速傳感器和旋轉向量傳感器)可能是硬件傳感器,也可能是軟件傳感器。例如,在一些Android設備中,這些基於軟件的傳感器會從加速和磁力傳感器中獲取數據,但在另一些Android設備中也可能從陀螺儀傳感器中獲取數據。也就是說,同一種基於軟件的傳感器在不同的Android設備中回傳的數據可能來自不同的硬件傳感器。所以基於軟件的同一種傳感器在不同的設備中可能精確度、使用范圍有所不同。大多數高端Android設備都會有加速傳感器,還有一些擁有陀螺儀傳感器。
動作傳感器對於監測設備的移動非常有用,例如,傾斜、震動、旋轉和擺動都屬於動作傳感器的監測范圍。設備的移動通常是對用戶輸入的直接反應。例如,用戶正在游戲中飙車,或控制游戲中的一個小球)。除此之外,設備所處的物理環境也會反應在設備的動作上,例如,用戶正常駕駛汽車,而這是Android設備正安靜地躺在旁邊的座椅上,盡管設備沒有移動,但會隨著車的行駛而不斷震動,而且設備也會隨著汽車的移動而移動。
對於第一種情況,可以對設備本身的相對位置進行監測。而對於第二種情況,需要考慮到設備以外的參照系。動作傳感器本身一般並不會用於監測設備的位置,關於設備的位置需要用其他類型的傳感器進行監測,例如,磁場傳感器。
所有的動作傳感器都會返回三個浮點數的值(通過長度為3的數組返回),但對於不同的傳感器,這三個只的意義不同。例如,對於加速傳感器,會返回三個坐標軸的數據。對於陀螺儀傳感器,會返回三個坐標軸的旋轉角速度。
設備從左到右推動,X軸加速度為正值。
設備朝著自己推動,Y軸加速度為正值。
如果朝著天空以A m/s^2的加速度推動,那麼Z軸的加速度為A + 9.81,所以如果計算實際的加速度(抵消重力加速度),需要減9.81。
view:
pupublic class MainActivity extends ActionBarActivity implements SensorEventListener{
private TextView sensor=null;
private SensorManager mSensorManager;
private TextView gravityTV=null;
private float[] gravity=new float[3];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensor= (TextView) findViewById(R.id.sensor);
mSensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),//加速度傳感器,
SensorManager.SENSOR_DELAY_UI);//SensorManager.SENSOR_DELAY_UI采樣頻率
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),//重力傳感器,
SensorManager.SENSOR_DELAY_FASTEST);//SensorManager.SENSOR_DELAY_UI采樣頻率
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),//鄰近傳感器
SensorManager.SENSOR_DELAY_UI);
}
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);//卸載所有的傳感器
}
//傳感度狀態發生變化
@Override
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER: //加速度傳感器
//減雜音(干擾)
final float alpha=(float)0.8;
gravity[0]=alpha*gravity[0]+(1-alpha)*event.values[0];
gravity[1]=alpha*gravity[1]+(1-alpha)*event.values[1];
gravity[2]=alpha*gravity[2 ]+(1-alpha)*event.values[2];
String accelerometer=String.valueOf("X:"+(event.values[0]-gravity[0])+"\nY:"+
(event.values[1]-gravity[1])+"\nZ:"+
(event.values[2]-gravity[2]));
sensor= (TextView) findViewById(R.id.sensor);
sensor.setText(accelerometer);
Log.i("X:", String.valueOf((event.values[0] - gravity[0])));
Log.i("Y:", String.valueOf((event.values[1] - gravity[1])));
Log.i("Z:", String.valueOf((event.values[2]-gravity[2])));
break;
case Sensor.TYPE_GRAVITY:
gravity[0]=event.values[0];
gravity[1]=event.values[1];
gravity[2]=event.values[2];
gravityTV= (TextView) findViewById(R.id.gravity);
gravityTV.setText(String.valueOf("gravity[0]="+event.values[0]+
"\ngravity[1]="+event.values[1]+
"\ngravity[2]="+event.values[2]));
break;
case Sensor.TYPE_PROXIMITY:
TextView Proximity= (TextView) findViewById(R.id.PROXIMITY1);
Proximity.setText(String.valueOf(event.values[0]));
break;
}
}
//精確度發生變化
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
Android 屏幕旋轉 處理 AsyncTask 和 ProgressDialog 的最佳方案
1、概述 眾所周知,Activity在不明確指定屏幕方向和configChanges時,當用戶旋轉屏幕會重新啟動。當然了,應對這種情況,Android給
Android Gson使用入門及GsonFormat插件的使用
Gson 是 Google 官方提供的用來在 Java 對象和 JSON 之間進行互相轉換的Java類庫。我之前在使用Eclipse開發Android的時候,並沒有經常使
Android應用中使用SharedPreferences類存儲數據的方法
在Android系統中提供了多種存儲技術.通過這些存儲技術可以將數據存儲在各種存儲介質上.比如sharedpreferences可以將數據保存著應用軟件的私有存儲區,這些
Android----Rxjava與Retrofit初體驗
RxJava(響應式編程) RxJava 在 GitHub 主頁上的自我介紹是 “a library for composing asynchronous a