次我們學習Android傳感器的開發,前面已經介紹過了,tween的使用,所以,我們可以結合傳感器與tween動畫,開發簡易的指南針。
首先先介紹一下傳感器的相關知識,
在Android應用程序中使用傳感器要依賴於android.hardware.SensorEventListener接口。通過該接口可以監聽傳感器的各種事件。SensorEventListener接口的代碼如下:
package android.hardware;
public interface SensorEventListener
{
public void onSensorChanged(SensorEvent event);
public void onAccuracyChanged(Sensor sensor, int accuracy);
}
在SensorEventListener接口中定義了兩個方法:onSensorChanged和onAccuracyChanged。當傳感器的值發生變化時onSensorChanged。當傳感器的精度變化時會調用onAccuracyChanged方法。
onSensorChanged方法只有一個SensorEvent類型的參數event,其中SensorEvent類有一個values變量非常重要,該變量的類型是float[]。但該變量最多只有3個元素,而且根據傳感器的不同,values變量中元素所代表的含義也不同。
我們以方向傳感器為例來說明value的含義:
values[0]:該值表示方位,也就是手機繞著Z軸旋轉的角度。0表示北(North);90表示東(East);180表示南(South);270表示西(West)。
values[1]:該值表示傾斜度,或手機翹起的程度。當手機繞著X軸傾斜時該值發生變化。values[1]的取值范圍是-180≤values[1]<180
values[2]:表示手機沿著Y軸的滾動角度。取值范圍是-90≤values[2]≤90。
下面我們結合實例說明使用情況,
布局文件:
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/point" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="50dp" />
<TextView
android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20dp" />
其中的圖片是在百度中隨便找的一個方位的圖片,
然後是activity中的實現:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
tv = (TextView) findViewById(R.id.tv);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
//得到方向傳感器 光傳感器Sensor.TYPE_LIGHT value[0],代表光線強弱
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
listener = new MyListener();
sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_GAME);
}
private class MyListener implements SensorEventListener{
float startangle = 0;
//傳感器數據變化時,
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
float[] values = event.values;
float angle = values[0];
System.out.println("與正北的角度:"+angle);
RotateAnimation ra = new RotateAnimation(startangle, angle,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
ra.setDuration(100);
iv.startAnimation(ra);
tv.setText("與正北方向的角度是:"+angle);
tv.setTextColor(Color.BLACK);
startangle = -angle;
}
//傳感器精確度變化的時候
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
}
@Override
protected void onDestroy() {
// 防止程序在後台運行,消耗內存,在程序退出時,釋放資源。
sensorManager.unregisterListener(listener);
sensorManager = null;
super.onDestroy();
}