如何在Android上检测摆动运动?

如何在Android上检测摆动运动?,android,android-sensors,gyroscope,Android,Android Sensors,Gyroscope,我需要一种能够在Android上检测“摆动”手势的算法,我的意思是,在纵向模式下手持手机,手腕左右扭曲,就像打开圆形门把手一样。所以我需要捕捉绕z轴前后旋转一段时间 一张粗略的图片来说明我需要捕捉的运动: 我已经尝试了许多不同的捕捉震动的算法,比如Github上的Shoogle For Yer Photos解决方案,它工作得很好,但是使用加速度计捕捉每个轴上的震动。我如何限制这样的算法只检测Z轴上来回的旋转,“摆动”至少4秒 下面是上面发布的“Shoogle For Yer Photos”代码的

我需要一种能够在Android上检测“摆动”手势的算法,我的意思是,在纵向模式下手持手机,手腕左右扭曲,就像打开圆形门把手一样。所以我需要捕捉绕z轴前后旋转一段时间

一张粗略的图片来说明我需要捕捉的运动:

我已经尝试了许多不同的捕捉震动的算法,比如Github上的Shoogle For Yer Photos解决方案,它工作得很好,但是使用加速度计捕捉每个轴上的震动。我如何限制这样的算法只检测Z轴上来回的旋转,“摆动”至少4秒

下面是上面发布的“Shoogle For Yer Photos”代码的摘录,其中显示了它们如何处理抖动检测:

private static final long KEEP_DATA_POINTS_FOR = 1500;
private static final long MINIMUM_EACH_DIRECTION = 7;
private static final float POSITIVE_COUNTER_THRESHHOLD = (float) 2.0;
private static final float NEGATIVE_COUNTER_THRESHHOLD = (float) -2.0;

public void checkForShake() {
    long curTime = System.currentTimeMillis();
    long cutOffTime = curTime - KEEP_DATA_POINTS_FOR;
    while(dataPoints.size() > 0 && dataPoints.get(0).atTimeMilliseconds < cutOffTime) dataPoints.remove(0);

    int x_pos =0, x_neg=0, x_dir = 0, y_pos=0, y_neg=0, y_dir=0, z_pos=0, z_neg = 0, z_dir = 0;
    for(DataPoint dp: dataPoints){
        if (dp.x > POSITIVE_COUNTER_THRESHHOLD && x_dir < 1) {
            ++x_pos;
            x_dir = 1;
        }
        if (dp.x < NEGATIVE_COUNTER_THRESHHOLD && x_dir > -1) {
            ++x_neg;
            x_dir = -1;
        }
        if (dp.y > POSITIVE_COUNTER_THRESHHOLD && y_dir < 1) {
            ++y_pos;
            y_dir = 1;
        }
        if (dp.y < NEGATIVE_COUNTER_THRESHHOLD && y_dir > -1) {
            ++y_neg;
            y_dir = -1;
        }
        if (dp.z > POSITIVE_COUNTER_THRESHHOLD && z_dir < 1) {
            ++z_pos;
            z_dir = 1;
        }
        if (dp.z < NEGATIVE_COUNTER_THRESHHOLD && z_dir > -1) {
            ++z_neg;
            z_dir = -1;
        }
    }

    if ((x_pos >= MINIMUM_EACH_DIRECTION && x_neg >= MINIMUM_EACH_DIRECTION) ||
            (y_pos >= MINIMUM_EACH_DIRECTION && y_neg >= MINIMUM_EACH_DIRECTION) ||
            (z_pos >= MINIMUM_EACH_DIRECTION && z_neg >= MINIMUM_EACH_DIRECTION) ) {
        lastShake = System.currentTimeMillis();
        last_x = 0; last_y=0; last_z=0;
        dataPoints.clear();
        triggerShakeDetected();
        return;
    }
}

非常感谢您的帮助。

您是否尝试过从if语句中删除z_pos和z_neg?这会不会导致检测到x轴和y轴上的任何晃动?我需要它只检测z轴上的来回旋转,而不管其他轴上的任何加速度或旋转。对不起,我以为你只需要x和y。那么,您是否尝试过在最后一个if语句中只留下z_pos和z_neg?@我认为这只会测量沿z轴的前后移动,我只需要检测z轴上的旋转,而且,要将该旋转识别为左/右/左/右/左/右几秒钟的“摆动”手势。