我再次需要你们的帮助,
我有很好的类 CustomSensorEventListener
(见下文)
我正确获取所有数据,如方位角、民意测验、俯仰角。
我在屏幕上有一个图像根据传感器方向移动。
但是,传感器太敏感了,我的意思是在任何微小的变化上,我的图像都会轻微移动。
有点像颤抖。如何降低传感器级别以像 Android 上的相机一样。
如您所知,相机不会因任何传感器变化而颤抖。
谢谢,
public class CustomSensorEventListener implements SensorEventListener {
float[] inR = new float[16];
float[] I = new float[16];
float[] gravity = new float[3];
float[] geomag = new float[3];
float[] orientVals = new float[3];
public static double azimuth = 0;
public static double pitch = 0;
static double roll = 0;
private Display mDisplay;
public CustomSensorEventListener(Display display){
mDisplay = display;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
// If the sensor data is unreliable return
if (sensorEvent.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
return;
// Gets the value of the sensor that has been changed
switch (sensorEvent.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
gravity = sensorEvent.values.clone();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
geomag = sensorEvent.values.clone();
break;
}
// If gravity and geomag have values then find rotation matrix
if (gravity != null && geomag != null) {
// checks that the rotation matrix is found
boolean success = SensorManager.getRotationMatrix(inR, I,
gravity, geomag);
float[] outR = new float[16];
if (success) {
SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_Z, outR);
// Display display = mContext.getWindowManager().getDefaultDisplay();
int deviceRot = mDisplay.getRotation();
switch (deviceRot)
{
// portrait - normal
case Surface.ROTATION_0: SensorManager.remapCoordinateSystem(inR,
SensorManager.AXIS_X, SensorManager.AXIS_Z,
outR);
break;
// rotated left (landscape - keys to bottom)
case Surface.ROTATION_90: SensorManager.remapCoordinateSystem(inR,
SensorManager.AXIS_Z, SensorManager.AXIS_MINUS_X,
outR);
break;
// upside down
case Surface.ROTATION_180: SensorManager.remapCoordinateSystem(inR,
SensorManager.AXIS_X, SensorManager.AXIS_Z,
outR);
break;
// rotated right
case Surface.ROTATION_270: SensorManager.remapCoordinateSystem(inR,
SensorManager.AXIS_MINUS_Z, SensorManager.AXIS_X,
outR);
break;
default: break;
}
SensorManager.getOrientation(outR, orientVals);
azimuth = Math.toDegrees(orientVals[0]);
pitch = Math.toDegrees(orientVals[1]);
roll = Math.toDegrees(orientVals[2]);
}
//Log.v("MA","Az: "+azimuth+", Pi: "+pitch+", Ro: "+roll);
}
}
};
最佳答案
您可以使用低通滤波器滤除抖动、振动和突然的快速移动。过滤器将允许较慢的运动,例如根据特定的截止频率改变旋转角度。
更多信息和实现细节:Low-Pass-Filter-To-Android-Sensors
Smoothing Sensor Data with a Low-Pass Filter
关于低通滤波器的更多信息(维基百科):Low-pass filter
关于java - 如何降低 Android、java 上的传感器敏感级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17912884/