Подтвердить что ты не робот

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


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


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

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

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

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

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

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

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

4b9b3361

Ответ 1

Стационарное устройство будет иметь значение силы тяжести +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 даст вам вектор гравитации.

Ответ 2

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

}