当设备处于横向模式时会出现问题.此时我正在使用值[2]来测量设备倾斜度,但问题在于值:0当手机保持平放(OK)时,当它直立时(OK)上升到90,但是当我继续价值再次低于90(80,75等)的运动,所以基本上我无法区分这两个位置,因为价值是相同的.
那么,我做错了什么,我可以读取传感器的其他值,以便在横向和纵向模式下全面了解设备?
与此相同的任务:http://groups.google.com/group/android-beginners/browse_thread/thread/c691bbac3e294c7c?pli=1
我有以下代码:
private voID ReadOrIEntationSensor(){ final SensorManager sensorManager; final TextVIEw text = (TextVIEw) this.findVIEwByID(R.ID.TextVIEw01);sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);SensorEventListener Listener = new SensorEventListener() { @OverrIDe public voID onAccuracyChanged(Sensor sensor,int accuracy) { } @OverrIDe public voID onSensorChanged(SensorEvent event) { float x,y,z; x=event.values[0]; y=event.values[1]; z=event.values[2]; //text.setText(String.valueOf(event.values[0])); text.setText("x: " + x + " y: " + y + " z: " + z); } }; sensorManager.registerListener(Listener,sensor,SensorManager.SENSOR_DELAY_FASTEST);
}
解决方法 不推荐使用Sensor.TYPE_ORIENTATION,不应使用它.阅读设备方向也给我带来了一些麻烦.这是我用于需要设备方向的活动的基类:
public abstract class SensorActivity extends Activity implements SensorEventListener {private SensorManager sensorManager;private final float[] accelerometerValues = new float[3];private final float[] R = new float[9];private final float[] I = new float[9];private final float[] orIEntation = new float[3];private final float[] remappedR = new float[9];private final List<HasOrIEntation> observers = new ArrayList<HasOrIEntation>();private int x;private int y;protected SensorActivity() { this(SensorManager.AXIS_X,SensorManager.AXIS_Y);}/** * Initializes a new instance. * */protected SensorActivity(int x,int y) { setAxisMapPing(x,y);}/** * The parameters specify how to map the axes of the device to the axes of * the sensor coordinate system. * * The device coordinate system has its x-axis pointing from left to right along the * display,the y-axis is pointing up along the display and the z-axis is pointing * upward. * * The <code>x</code> parameter defines the direction of the sensor coordinate system's * x-axis in device coordinates. The <code>y</code> parameter defines the direction of * the sensor coordinate system's y-axis in device coordinates. * * For example,if the device is laying on a flat table with the display pointing up,* specify <code>SensorManager.AXIS_X</code> as the <code>x</code> parameter and * <code>SensorManager.AXIS_Y</code> as the <code>y</code> parameter. * If the device is mounted in a car in landscape mode,* specify <code>SensorManager.AXIS_Z</code> as the <code>x</code> parameter and * <code>SensorManager.AXIS_MINUS_X</code> as the <code>y</code> parameter. * * @param x specifIEs how to map the x-axis of the device. * @param y specifIEs how to map the y-axis of the device. */public voID setAxisMapPing(int x,int y) { this.x = x; this.y = y; }/** * Registers an orIEntation observer. * * @param hasOrIEntation is the observer to register. */protected voID register(HasOrIEntation hasOrIEntation) { observers.add(hasOrIEntation);}@OverrIDeprotected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); }@OverrIDeprotected voID onResume() { super.onResume(); sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_UI); sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_UI); }@OverrIDeprotected voID onPause() { sensorManager.unregisterListener(this); super.onPause();}public voID onAccuracyChanged(Sensor sensor,int accuracy) {}public voID onSensorChanged(SensorEvent event) { switch(event.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: System.arraycopy(event.values,accelerometerValues,accelerometerValues.length); break; case Sensor.TYPE_MAGNETIC_FIELD: if (SensorManager.getRotationMatrix(R,I,event.values)) { if (SensorManager.remapCoordinateSystem(R,x,remappedR)) { SensorManager.getorIEntation(remappedR,orIEntation); for (HasOrIEntation observer : observers) { observer.onorIEntation(OrIEntation.fromradians(orIEntation)); } } } break; default: throw new IllegalArgumentException("unkNown sensor type"); } } }
定位是这样的:
/** * An angular direction vector. * * The vector consists of three angles {azimuth,pitch,roll}. Within a body-fixed * cartesian system,the values of these angles define rotations of the three body axes. * * All angles are in degrees. * * @author michael@mictale.com * */public class OrIEntation {/** * Represents the angle to rotate the up axis. */public float azimuth;/** * Represents the angle to rotate the axis pointing right. */public float pitch;/** * Represents the angle to rotate the forward axis. */public float roll;/** * Initializes an instance that is empty. */public OrIEntation() { }/** * Initializes an instance from the specifIEd rotation values in degrees. * * @param azimuth is the azimuth angle. * @param pitch is the pitch angle. * @param roll is the roll angle. */public OrIEntation(float azimuth,float pitch,float roll) { this.azimuth = azimuth; this.pitch = pitch; this.roll = roll;}/** * Sets the current values to match the specifIEd orIEntation. * * @param o is the orIEntation to copy. */public voID setTo(OrIEntation o) { this.azimuth = o.azimuth; this.pitch = o.pitch; this.roll = o.roll; }/** * normalizes the current instance. * * limits the azimuth to [0...360] and pitch and roll to [-180...180]. */public voID normalize() { azimuth = Angle.normalize(azimuth); pitch = Angle.tilt(pitch); roll = Angle.tilt(roll);}/** * Creates a new vector from an array of radian values in the form * [azimuth,roll]. * * This method is useful to fill sensor data into a vector. * * @param vec is the array of radians. * @return the vector. */public static OrIEntation fromradians(float[] vec) { return new OrIEntation((float)Math.todegrees(vec[0]),(float)Math.todegrees(vec[1]),(float)Math.todegrees(vec[2]));}@OverrIDepublic String toString() { return "{a=" + azimuth + ",p=" + pitch + ",r=" + roll + "}";}}
您需要调用setAxisMapPing()来接收与纵向或横向模式对齐的方向.我只在构造函数中调用它,所以我无法告诉你在活动运行时调用它会发生什么.您可能必须重置矩阵.
总结以上是内存溢出为你收集整理的android – 横向模式下的音高问题全部内容,希望文章能够帮你解决android – 横向模式下的音高问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)