一、项目结构,只适合初学者的使用,希望对大家有用,也希望大家多多提意见。
二、xml,只是简单的ImageView组件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/IV"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/south"
/>
</RelativeLayout>
三、代码:
package com.cxrh.compasstest;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.view.Menu;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView iv;
private SensorManager sensorManager;
private Sensor sensor;
private MySensorEventListener listener;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv=(ImageView) findViewById(R.id.IV);
iv.setKeepScreenOn(true);//保持屏幕亮着
}
@Override
protected void onResume() {
listener=new MySensorEventListener();
//获取传感器的管理者
sensorManager=(SensorManager) getSystemService(Context.SENSOR_SERVICE);
//方向传感器
sensor=sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
sensorManager.registerListener(listener, sensor, sensorManager.SENSOR_DELAY_GAME);
super.onResume();
}
private class MySensorEventListener implements SensorEventListener{
float predergee=0;
/**
* 当传感器的精度发生改变时
*/
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
/**
* 当传感器发生改变时
*/
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
float[] values=event.values;
float dergee=values[0];//表示与正北方向夹角度数
System.out.println("与正北方向的夹角:"+dergee);
//RotateAnimation类是Android系统中的旋转变化动画类,用于控制View对象的旋转动作,该类继承于Animation类。
//RotateAnimation类中的很多方法都与Animation类一致,该类中最常用的方法便是RotateAnimation构造方法
RotateAnimation rotateAnimation=new RotateAnimation(predergee, -dergee,
Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF,0.5f);
rotateAnimation.setDuration(200);
iv.startAnimation(rotateAnimation);
predergee=-dergee;
}
}
@Override
protected void onStop() {
sensorManager.unregisterListener(listener);
super.onStop();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}