Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 横向模式下的音高问题大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要在纵向和横向模式下读取音高值(手机向后和向前倾斜多少).使用肖像下面的代码我从值[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

@L_616_2@以下代码

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);
}

@Override
protected void onCreate(Bundle savedInstanceStatE) {
    super.onCreate(savedInstanceStatE);

    sensoRMANager = (SensoRMANager)getSystemservice(Context.SENSOR_serviCE);        
}

@Override
protected 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);             
}

@Override
protected 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]));
}

@Override
public String toString() {
    return "{a=" + azimuth + ",p=" + pitch + ",r=" + roll + "}";
}
}

您需要调用setAxismapping()来接收与纵向或横向模式对齐的方向.我只在构造函数调用它,所以我无法告诉你在活动运行时调用会发生什么.您可能必须重置矩阵.

大佬总结

以上是大佬教程为你收集整理的android – 横向模式下的音高问题全部内容,希望文章能够帮你解决android – 横向模式下的音高问题所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。