Android – 加速下(粉碎)


video为那些不明白的人解释


这个答案是不正确的答案请尝试用其他解决scheme来回答(100赏金是过时的)

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

这个问题被认为是正确的,但一点也没有,我用我的旧设备中兴通讯试了它,大部分时间都是这样,但现在我有一个三星Galazy A5 2016,它不起作用,LG G3 。

事情是尝试使用Accelerometer和一些Sensors我必须能够检测到在video上做出的这两个动作中的任何一个。

有两个动作:

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

我让你决定说服我什么是更好的select,更容易做,更好的我的意思是在大多数设备上的作品。

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

以下是如何确定设备是否开始向下移动。 如果设备已经以恒定的速度向下移动,则无法确定设备是否正在向下移动,因为在这种情况下没有向下的加速,重力标准应该在9.81附近。

你需要使用TYPE_GRAVITY 。 如果设备不具有TYPE_GRAVITY ,则使用低通滤波器TYPE_ACCELEROMETER来获取重力vector。

如上所述,固定设备将具有标准等于9.81的重力vector。 但是,这个值会随着设备的不同而有所不同。 因此,您首先需要确定这个静止的重力模式。 您可以通过注册TYPE_GRAVITY或TYPE_ACCELEROMETER来做到这一点,并要求用户平躺设备,然后按下button。 一旦按下button,应用程序将在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会给出更好的精度,但是如果设备没有这种types,那么低通滤波器TYPE_ACCELERATOR会给你重力vector。

如果您想查看设备是否处于自由落体状态,则应检查法线是否接近于零。 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; }