標籤:des android style blog http color io 使用 java
本次我們學習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; //感應器資料變化時,@Overridepublic void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stubfloat[] 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;}//感應器精確度變化的時候@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub} } @Override protected void onDestroy() { // 防止程式在後台運行,消耗記憶體,在程式退出時,釋放資源。 sensorManager.unregisterListener(listener); sensorManager = null; super.onDestroy(); }
最後當我們手機的方向發生變化時,圖片也在移動,同時下面的文字框,會顯示相應的方位值。
Android學習筆記-感應器開發之利用感應器和Tween開發簡易指南針