Android - 加速下降(粉碎)
Android - Acceleration down (smash)
Video explaining for those who does not understand
此答案未得到正确回答,请尝试使用其他解决方案来回答(100 赏金已过期)
同样的问题,但更好地解释了
这个问题被认为是正确的,但它根本不正确,我用我的旧设备中兴通讯试过它并且大部分时间都有效,但现在我有一个 Samsung Galazy A5 2016 但它不工作, LG G3 都没有。
事情正在尝试使用 Accelerometer
和一些 Sensors
我必须能够检测到我在视频中制作的这两个动作中的任何一个。
有两个动作:
- 粉碎它(用一点速度)
- 自由落体
我让你来决定并说服我什么是更好的选择,更容易一个可以做的,更好的我的意思是在大多数设备上都可以工作。
如果你想看设备是否处于自由落体状态,你应该检查法线是否接近于零。
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;
}
静止设备的重力值为 +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 将为您提供重力矢量。
Video explaining for those who does not understand
此答案未得到正确回答,请尝试使用其他解决方案来回答(100 赏金已过期)
同样的问题,但更好地解释了
这个问题被认为是正确的,但它根本不正确,我用我的旧设备中兴通讯试过它并且大部分时间都有效,但现在我有一个 Samsung Galazy A5 2016 但它不工作, LG G3 都没有。
事情正在尝试使用 Accelerometer
和一些 Sensors
我必须能够检测到我在视频中制作的这两个动作中的任何一个。
有两个动作:
- 粉碎它(用一点速度)
- 自由落体
我让你来决定并说服我什么是更好的选择,更容易一个可以做的,更好的我的意思是在大多数设备上都可以工作。
如果你想看设备是否处于自由落体状态,你应该检查法线是否接近于零。 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;
}
静止设备的重力值为 +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 将为您提供重力矢量。