由于andorid不推荐用传统的方向传感器,推荐用加速度传感器和地磁传感器来构造得到方向传感器的数据,其实主要是z轴的旋转角度

具体代码示例

代码如下

public class MainActivity extends Activity {    private ImageView compass;    private SensorManager sensorManager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        compass = (ImageView) findViewById(R.id.compass);        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);        Sensor AccelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);        Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);        sensorManager.registerListener(sensorEventListener,magneticSensor,SensorManager.SENSOR_DELAY_GAME);        sensorManager.registerListener(sensorEventListener,AccelerometerSensor,SensorManager.SENSOR_DELAY_GAME);    }    private SensorEventListener sensorEventListener = new SensorEventListener() {        float[] accelerometerValues = new float[3];        float[] maneticValues = new float[3];        private float lastDegree;        @Override        public void onSensorChanged(SensorEvent sensorEvent) {            if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){                accelerometerValues = sensorEvent.values.clone();            }else if (sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){                maneticValues = sensorEvent.values.clone();            }            float[] R = new float[9];            float[] values = new float[3];            SensorManager.getRotationMatrix(R,null,accelerometerValues,maneticValues);            SensorManager.getOrientation(R,values);            float rotateDegree = -(float) Math.toDegrees(values[0]);            if (Math.abs(rotateDegree - lastDegree) > 1){                RotateAnimation animation = new RotateAnimation(lastDegree,rotateDegree, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);                animation.setFillAfter(true);                compass.startAnimation(animation);                lastDegree = rotateDegree;            }        }        @Override        public void onAccuracyChanged(Sensor sensor, int i) {        }    };    @Override    protected void onDestroy() {        if (sensorManager != null){            sensorManager.unregisterListener(sensorEventListener);        }        super.onDestroy();    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.menu_main, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id = item.getItemId();        //noinspection SimplifiableIfStatement        if (id == R.id.action_settings) {            return true;        }        return super.onOptionsItemSelected(item);    }}

效果图

更多相关文章

  1. 关于 Android(安卓)opencv 屏幕方向的bug
  2. Android重力传感器实现滚动的弹球
  3. Android(安卓)CTS Verifier Sensor Test Cases (4)
  4. Activity一些标签
  5. API
  6. Android(安卓)传感器开发 完全解析
  7. Android(安卓)射击类游戏 (一)
  8. Android的传感器编程小结
  9. Android(安卓)应用开发特色

随机推荐

  1. Linux Tcp/ip UDP基本概念(6.8)
  2. Codeigniter2.25部署Linux(php5.6)
  3. 在Linux上确定陈旧的Samba挂载的最快方法
  4. Linux无法连接网络解决方案
  5. Linux环境下注册函数的调用顺序
  6. 浅谈如何学习linux
  7. 软交换FreeSWITCH系统概要和源代码分析预
  8. linux终端常用快捷键
  9. Linux程序设计——文件操作(标准I/O库)
  10. Linux之profile、bash_profile、bashrc文