As mentioned above, the first parameter value passed back by the horizontal sensor represents the angle from which the mobile phone rotates around the Z axis, that is, the angle between the top of the mobile phone and the north. In the program, you can check the angle to implement the compass application. In fact, the idea is very simple. First prepare an image, which directs the pointer to the north. Then, a sensor is developed to detect the direction. When the program detects how many degrees the camera turns around the Z axis on the top of the mobile phone, the number of degrees the picture of the compass is reversed. In this way, the pointer is always directed to the north. This is also the principle of the compass. The Code is as follows: Activity:
Package com. home. compass; 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. animation. animation; import android. view. animation. rotateAnimation; import android. widget. imageView; public class CompassTestActivity extends Activity implements SensorEventListener {// define the private ImageView image component that displays the compass image; // record the angle from which the compass image is rotated private float currentDegree = 0f; // define the Sensor manager private SensorManager mSensorManager of the real machine; @ Override protected void onCreate (Bundle savedInstanceState) {super. onCreate (savedInstanceState); setContentView (R. layout. main); image = (ImageView) findViewById (R. id. main_iv); // obtain the Sensor Management Service mSensorManager = (SensorManager) getSystemService (SENSOR_SERVICE) ;}@ Override protected void onResume () {super. onResume (); // registers the listener mSensorManager for the system's sensor. registerListener (this, mSensorManager. getdefasensensor (Sensor. TYPE_ORIENTATION), SensorManager. SENSOR_DELAY_GAME) ;}@ Override protected void onPause () {super. onPause (); // cancel mSensorManager registration. unregisterListener (this) ;}@ Override public void onAccuracyChanged (Sensor sensor, int accuracy) {}@ Override public void onSensorChanged (SensorEvent event) {// if the sensor type of the event triggered on the real machine is level sensor type if (event. sensor. getType () = Sensor. TYPE_ORIENTATION) {// obtain the angle float degree = event. values [0]; // create a rotation Animation (reverse turn degree) RotateAnimation ra = new RotateAnimation (currentDegree,-degree, Animation. RELATIVE_TO_SELF, 0.5f, Animation. RELATIVE_TO_SELF, 0.5f); // sets the animation duration ra. setDuration (200); // sets the retained state ra after the animation ends. setFillAfter (true); // start the animated image. startAnimation (ra); currentDegree =-degree ;}} package com. home. compass; 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. animation. animation; import android. view. animation. rotateAnimation; import android. widget. imageView; public class CompassTestActivity extends Activity implementsSensorEventListener {// define the private ImageView image component that displays the compass image; // record the angle from which the compass image is rotated private float currentDegree = 0f; // define the Sensor manager private SensorManager mSensorManager of the real machine; @ Overrideprotected void onCreate (Bundle savedInstanceState) {super. onCreate (savedInstanceState); setContentView (R. layout. main); image = (ImageView) findViewById (R. id. main_iv); // obtain the Sensor Management Service mSensorManager = (SensorManager) getSystemService (SENSOR_SERVICE) ;}@ Overrideprotected void onResume () {super. onResume (); // registers the listener mSensorManager for the system's sensor. registerListener (this, mSensorManager. getdefasensensor (Sensor. TYPE_ORIENTATION), SensorManager. SENSOR_DELAY_GAME) ;}@ Overrideprotected void onPause () {super. onPause (); // cancel mSensorManager registration. unregisterListener (this) ;}@ Overridepublic void onAccuracyChanged (Sensor sensor, int accuracy) {}@ Overridepublic void onSensorChanged (SensorEvent event) {// if the sensor type of the event triggered on the real machine is level sensor type if (event. sensor. getType () = Sensor. TYPE_ORIENTATION) {// obtain the angle float degree = event. values [0]; // create a rotation Animation (reverse turn degree) RotateAnimation ra = new RotateAnimation (currentDegree,-degree, Animation. RELATIVE_TO_SELF, 0.5f, Animation. RELATIVE_TO_SELF, 0.5f); // sets the animation duration ra. setDuration (200); // sets the retained state ra after the animation ends. setFillAfter (true); // start the animated image. startAnimation (ra); currentDegree =-degree ;}}}
Layout XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" > <ImageView android:id="@+id/main_iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/znz" /> </LinearLayout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" > <ImageView android:id="@+id/main_iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/znz" />
</LinearLayout> here is an image of the compass: