java - 如何降低 Android、java 上的传感器敏感级别?

标签 java android android-sensors

我再次需要你们的帮助,

我有很好的类 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/

相关文章:

java - Derby 外键约束

java - 使用 XJC 生成 Java 源代码时使用 JAXWS enableWrapperStyle

c# - 为什么我的 CollectionView 向下或向上滚动时速度很慢?如何解决性能问题?我已经清理了我的 UI 代码

java - OnSensorChanged线程

java - 将 byte[] 转换为 String Java Android 加密

java - Jboss RestEasy - 如何使用多部分/混合从多部分 mime MultipartInput 中提取二进制数据

javascript - FCM 消息负载错误,数据对象内的嵌套对象错误

android - FabricViewStateManager : setState called without a StateWrapper

android - 如何以稳定准确的方式读取Android加速度计值?

android - 如何在 Android 中获取位置及其温度?