android – 横向模式下的音高问题

android – 横向模式下的音高问题,第1张

概述我需要在纵向和横向模式下读取音高值(手机向后和向前倾斜多少).使用肖像下面的代码我从值[1]得到我的值0.0当手机保持平躺面朝上时,-90当直立时和平躺在设备面上时180.一切都很棒到现在…… 当设备处于横向模式时会出现问题.此时我正在使用值[2]来测量设备倾斜度,但问题在于值:0当手机保持平放(OK)时,当它直立时(OK)上升到90,但是当我继续价值再次低于90(80,75等)的运动,所以基本上 我需要在纵向和横向模式下读取音高值(手机向后和向前倾斜多少).使用肖像下面的代码我从值[1]得到我的值0.0当手机保持平躺面朝上时,-90当直立时和平躺在设备面上时180.一切都很棒到现在……
当设备处于横向模式时会出现问题.此时我正在使用值[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 [email protected] * */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 – 横向模式下的音高问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1128261.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存