Android - 解决方位叫抖动问题

2020-06-07 12:52

import java.util.ArrayList; import java.util.LinkedList;

import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Handler; import android.os.Message; /**

* 传感器监听,用于实现传感器来获取数据,得到方位角,俯仰角等数据 通过传入的handler来实现数据的回调, 规划院的方位角数据

* {@link handlerMessage MESSAGE_GUIHUAYUAN_ANALYZE_SUCCESS } 自己测试使用的方位角数据

* {@link handlerMessage MESSAGE_ANALYZE_SUCCESS } */

public class MySensor {

private Context context;

private float[] accelerometerValues; private float[] magneticFieldValues; private float[] orientationValues;

private float[] collector = new float[3];// 采集实时数分析 // 传感器

private SensorManager mSensorManager; private Sensor accelerometer; private Sensor magnetic;

private Sensor mOrientation;

private LinkedList list = new LinkedList();// 缓冲数据加载

过快的问题

public AngleThread getInstance() {

return task;

/** *

* @param context用于获取方位角和计算摄像头偏差的方位角 * @param handler用于回调信息给UI线程 */

public MySensor(Context context, Handler handler) { }

if (handler != null) { }

this.context = context;

task = new AngleThread(handler);

// 1声明2.注册3.监听4.注销 /** *

* @param context用于获取方位角的 */

public MySensor(Context context) { }

this.context = context;

private boolean shooting;// 在拍照中,用差值计算方位角 private AngleThread task;

}

public void init() {// 初始化

// 实例化传感器管理者

mSensorManager = (SensorManager) context

.getSystemService(Context.SENSOR_SERVICE);

// 初始化加速度传感器

accelerometer = mSensorManager

.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

// 初始化地磁场传感器

magnetic =

mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); mOrientation =

mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

public void regist() {// 注册

mSensorManager.registerListener(new MySensorEventListener(),

accelerometer, Sensor.TYPE_ACCELEROMETER);

}

magnetic,

}

mSensorManager.registerListener(new MySensorEventListener(),

Sensor.TYPE_MAGNETIC_FIELD);

mSensorManager.registerListener(new MySensorEventListener(),

mOrientation, Sensor.TYPE_ORIENTATION);

public void unregist() {// 注销

mSensorManager.unregisterListener(new MySensorEventListener());

{ {

}

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) }

if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) }

if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {

orientationValues = event.values; magneticFieldValues = event.values; accelerometerValues = event.values;

@Override

public void onSensorChanged(SensorEvent event) {

class MySensorEventListener implements SensorEventListener {// 监听 }

// if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {

// float[] rotationMatrix = new float[16];

// SensorManager.getRotationMatrixFromVector(rotationMatrix, // event.values);

// determineOrientation(rotationMatrix); // }

// 不能为空,不然刚开始的时候就会报空指针,因为三个值不

是同事加载的,

// 但是每加载一次都会去回调3次这个方法,所以这个加载的

速度非常的快(三个传感器的数据是并行的)

}

if (accelerometerValues != null && orientationValues != null

&& magneticFieldValues != null)

calculateOrientation();

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

}

// 计算方向

private void calculateOrientation() {

float[] values = new float[3]; float[] R = new float[9];

SensorManager.getRotationMatrix(R, null, accelerometerValues,

magneticFieldValues);

SensorManager.getOrientation(R, values); values[0] = (float) Math.toDegrees(values[0]);

values[0] = values[0] < 0 ? values[0] + 360 : values[0]; int cor = context.getResources().getConfiguration().orientation; // int c = ((Activity) context).getWindowManager().getDefaultDisplay() // .getRotation();// 界面的方向

values[1] = (float) Math.toDegrees(values[1]); values[2] = (float) Math.toDegrees(values[2]); float angle3 = values[0];

double AZIM = orientationValues[0]; double TILT = orientationValues[1];


Android - 解决方位叫抖动问题.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:“小题大做”很有必要

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: