Android – Ускорение вниз (разбить)


Видео, объясняющее для тех, кто не понимает


ЭТО ОТВЕТ НЕ ПРАВИЛЬНО ОТВЕТСТВЕННО ПОЖАЛУЙСТА, ЧТОБЫ ОТВЕЧАТЬ ЭТО С ДРУГОЙ РЕШЕНИЕ (100 Bounty устарели)

Тот же вопрос, но лучше объяснил

Эти вопросы были приняты как правильные, но это совсем не так, я попробовал это с помощью своего старого устройства ZTE, и он работал большую часть времени, но теперь у меня есть Samsung Galazy A5 2016, и он не работает, ни на LG G3 ,

Дело в том, что вы пытаетесь использовать Accelerometer и некоторые Sensors я должен быть в состоянии обнаружить любое из этих двух движений, которые я сделал на видео.

Есть два движения:

  • Разбивая его (с небольшой скоростью)
  • Свободное падение

Я позволил вам решить и убедить меня в том, что лучший вариант, а EASIER – сделать лучше, я имею в виду, что это работает на большинстве устройств.

Стационарное устройство будет иметь значение силы тяжести +9,81, что соответствует ускорению устройства (0 м / с2 минус сила тяжести, которая составляет -9,81 м / с2). Таким образом, если устройство движется вниз от стационарного, то сила тяжести будет меньше 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 даст вам вектор гравитации.

Если вы хотите узнать, находится ли устройство в свободном падении, вы должны проверить, находится ли нормаль ближе к нулю. 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; }