Android - 加速下降(粉碎)

时间:2016-01-25 16:39:33

标签: android sensor accelerator

Video explaining for those who does not understand

这个答案没有正确回答请尝试使用另一种解决方案(100 Bounty已过期)

同样的问题,但更好地解释

这个问题被认为是正确的,但它完全没有,我用我的旧设备ZTE尝试了它并且大部分时间工作,但现在我有三星Galazy A5 2016并且它不起作用,也没有LG G3。

正在尝试使用Accelerometer和一些Sensors我必须能够检测到我在视频上制作的这两个动画中的任何一个。

有两个动作:

  • 粉碎它(有点速度)
  • 自由落体

我让你决定并说服我有什么更好的选择和更容易要做的事情,更好的我的意思是适用于大多数设备。

2 个答案:

答案 0 :(得分:14)

固定装置的重力值为+9.81,对应于装置的加速度(0 m / s2减去重力,即-9.81 m / s2)。因此,如果装置从静止向下移动,则重力将小于9.81。自由落体装置的重力等于0.

以下是如何确定设备是否开始向下移动。如果设备已经以恒定速度向下移动,它将无法确定设备是否向下移动,因为在这种情况下没有加速向下,重力范数应该在9.81左右。

您需要使用TYPE_GRAVITY。如果设备没有TYPE_GRAVITY,则使用低通滤波器TYPE_ACCELEROMETER来获取重力矢量。

如上所述,固定装置将具有标准等于9.81的重力矢量。但是,此值与设备略有不同。因此,您首先需要确定这个固定的重力范数。您可以通过注册TYPE_GRAVITY或TYPE_ACCELEROMETER来执行此操作,并要求用户将设备平放,然后按一个按钮。按下按钮后,应用程序将在onSensorChanged中计算重力的范数。

private float mStationaryGravityNorm;
private float mDeviation = 0.01;
private float mCount;
private boolean mIsCalculatingStationGravityNorm = true;

Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener( {
    @Override
    public void onClick(View v) {
        // register sensor
    }
    });

@Override
public void onSensorChanged(SensorEvent event) {
// Will average out 100 gravity values.
if (mIsCalculatingStationGravityNorm) {
    if (mCount++ < 100) {
        mStationaryGravityNorm += Math.sqrt(event.values[0] * event.values[0] + event.values[1] * event.values[1] + event.values[2] * event.values[2]);
    } else {
        mStationaryGravityNorm /= 100;
        mIsCalculatingStationGravityNorm = false;
} else {
    float gravityNorm = Math.sqrt(event.values[0] * event.values[0] + event.values[1] * event.values[1] + event.values[2] * event.values[2]);
    if (gravityNorm < mStationaryGravityNorm - mDeviation) {
    // moving down
    }
}

PS 要向上移动,您需要计算重力。当设备静止时,重力范数约为9.81(取决于设备)。现在,如果设备向下移动,则向下加速,因此重力范数将小于9.81,如果设备向上移动,则重力范数将超过9.81。因此,通过将重力范数与此固定重力范数进行比较,您将知道设备是向上还是向下移动。这与设备方向无关。 TYPE_GRAVITY将提供更好的准确性,但如果设备没有此类型,则低通滤波器TYPE_ACCELERATOR将为您提供重力矢量。

答案 1 :(得分:-1)

如果你想看看设备是否处于自由落体状态,你应该检查法线是否接近于零。 http://developer.android.com/guide/topics/sensors/sensors_motion.html

public void onSensorChanged(SensorEvent event) {
    double noraml = Math.sqrt(Math.pow(event.values[0].getX(),2)+
                    Math.pow(event.values[1].getY(),2)+
                    Math.pow(event.values[2].getZ(),2));
    if (normal < 0)
        return true;
    return false;

}