【问题标题】:Higher Level API For Sensor Values Pitch And Roll用于传感器值 Pitch 和 Roll 的更高级别 API
【发布时间】:2012-04-28 22:40:53
【问题描述】:

我正在实现自己的相机活动。 要旋转拍摄的图像,我需要知道拍摄时的方向。 是否有用于传感器值俯仰和滚动的更高级别 API 告诉我我的设备面向:

自上而下 - 正常拿着手机,纵向
自下而上
right-left - 横向手机顶部在右侧
left-right - 横向手机顶部在左侧

或者有没有其他方法可以直接从系统中获取?

【问题讨论】:

  • 自上而下,.. 左右是什么意思?
  • 您可以编写一个函数来检查它并在需要时调用它。此外,如果您希望人们回答您的问题,您应该接受答案。看看你的旧答案并接受最好的答案。该按钮位于答案等级。
  • 感谢您的建议,我看看该功能

标签: android sensors device-orientation pitch


【解决方案1】:

遗憾的是,当相机不处于横向模式(这是 android 上相机的“自然”方向)时,它们在 android 上以一种奇怪的方式工作。

最好将活动设置为横向模式,并添加 onConfigurationChanged 事件(并将 android:configChanges="orientation" 添加到清单中)以获得当前方向。

拍摄图像时,检查方向并根据您希望的任何逻辑进行操作。

【讨论】:

  • 好点。我不知道存在诸如 onConfigurationChanged 事件之类的东西。我试过了,它只能告诉我我是处于纵向还是横向模式。当我将相机向右或向左倾斜时,相机传感器有一个方向,但风景可以有两个。我需要一种方法来确定我必须如何轮换结果。
  • 如果你的目标是 2.2+ ,你可能会很幸运:developer.android.com/reference/android/view/…
  • 另一个我没听说过的 API 不错 ;) 我试过了,但它总是显示 0 度。 int 旋转 = getWindowManager().getDefaultDisplay().getRotation();也许是因为我在清单中设置了固定的方向。
【解决方案2】:

好的解决了我的问题到某个点,所以它对我有用,我忽略了自下而上的识别。

public class DeviceOrientation {

public static final int ORIENTATION_PORTRAIT = 0;
public static final int ORIENTATION_LANDSCAPE_REVERSE = 1;
public static final int ORIENTATION_LANDSCAPE = 2;
public static final int ORIENTATION_PORTRAIT_REVERSE = 3;

int smoothness = 1;
public float averagePitch = 0;
public float averageRoll = 0;
public int orientation = ORIENTATION_PORTRAIT;

private float[] pitches;
private float[] rolls;

public DeviceOrientation(int smoothness) {
    this.smoothness = smoothness;

    pitches = new float[smoothness];
    rolls = new float[smoothness];
}

public void addSensorEvent(SensorEvent event) {
    azimuth = event.values[0];

    averagePitch = addValue(event.values[1], pitches);
    averageRoll = addValue(event.values[2], rolls);

    orientation = calculateOrientation();
}

private float addValue(float value, float[] values) {
    float average = 0;

    for(int i=1; i<smoothness; i++) {
        values[i-1] = values[i];
        average += values[i];
    }
    values[smoothness-1] = value;
    average = (average + value)/smoothness;

    return average;
}

/** handles all 4 possible positions perfectly */
private int calculateOrientation() {
    // finding local orientation dip
    if (((orientation == ORIENTATION_PORTRAIT || orientation == ORIENTATION_PORTRAIT_REVERSE)
            && (averageRoll > -30 && averageRoll < 30))) {
        if (averagePitch > 0)
            return ORIENTATION_PORTRAIT_REVERSE;
        else
            return ORIENTATION_PORTRAIT;
    } else {
        // divides between all orientations
        if (Math.abs(averagePitch) >= 30) {
            if (averagePitch > 0)
                return ORIENTATION_PORTRAIT_REVERSE;
            else
                return ORIENTATION_PORTRAIT;
        } else {
                if (averageRoll > 0) {
                    return ORIENTATION_LANDSCAPE_REVERSE;
                } else {
                    return ORIENTATION_LANDSCAPE;
                }
        }
    }
}

说明: 如果我处于纵向模式并将美孚向前倾斜直到它处于水平位置,由于其余代码,它将切换到横向。 因此,我检查它是否是纵向的,并使条件难以离开这种模式。 这就是我对局部倾角的看法。 其余的只是分为所有 3 个方向。

有一件事很糟糕。如果设备在 Landscape_x 中并向后倾斜一些度数,则 pich 从 ~2 跳到 ~175。那时我的代码在横向和纵向之间翻转。

平滑度将通过组合最后 n 个值并计算平均值来平滑传感器数据的值。没必要。

我希望这对其他人有所帮助。如果您可以进一步改进代码,请告诉我。

【讨论】:

  • 代码已更新。使用它的完整项目在我的谷歌驱动器上。 SensorDemo.rar
  • 我省略了可能没有人真正需要的自下而上的方向,如果您将设备倾斜到横向并稍微倾斜一点,以便相机看起来向上约 3-10 度方向在横向和纵向之间切换。
  • 什么是自下而上的方向?是纵向反转的吗?
  • 与正常人像相反(自上而下)。当您的设备旋转 180 度时。
  • @strangeoptics 我已经编辑了代码来处理最后一个位置(反向肖像),以防有人像我一样需要它,并且感谢计算本身对我有很大帮助:)
猜你喜欢
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多