首页 > 解决方案 > 手机翻转时如何更改魔术8球答案?

问题描述

我需要创建一个神奇的 8 球应用程序,它会在手机翻转时改变答案。因此,当 android 加速度计的 z 值小于 9 时,我需要更改一次答案。

我的问题是,由于当手机保持在 if 语句值内的稳定位置时,加速度计的值会不断变化,循环只会继续执行。

public class MainActivity extends Activity implements SensorEventListener {
    private float xvalue, yvalue, zvalue;

    private SensorManager sensorManager;
    private Sensor accelerometer;

    private float z;


    TextView answer;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

        sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    }
    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        zvalue = sensorEvent.values[2];

        if(zvalue > 9 & zvalue < 9)
            printAnswer();

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {}

    /** Called when the user taps the Send button */
    public void sendMessage(View view) {
        printAnswer();

    }

    public void printAnswer(){
        answer = (TextView) findViewById(R.id.answer);
        final String[] answers = {"It is certain", "It is decidedly so", "Without a doubt", "Yes definitely", "You may rely on it", "As I see it yes", "Most likely", "Outlook good", "Yes",
                "Signs point to yes",  "Reply hazy try again", "Ask again later", "Better not tell you now", "Cannot predict now", "Concentrate and ask again",
                "Don't count on it", "My reply is no", "My sources say no", "Outlook not so good", "Very doubtful"};

        Random r = new Random();
        int randomNum = r.nextInt(answers.length);

        answer.setText(answers[randomNum]);
    }
}

标签: javaandroidaccelerometerandroid-sensors

解决方案


有很多不同的方法可以实现这一点。我将在这里提到的两种方式都属于“去抖动”类别,这是对粗糙输入进行平滑处理的过程。

您可以保留一个prevZ始终在onSensorChanged. 这将帮助您了解z随时间的变化。如果prevZ小于您的阈值并且电流z高于它,那么您刚刚确定了翻转!如果两个 Z 都低于您的阈值或高于您的阈值,则什么也不做。在这种情况下,最好有 2 个阈值:较高的阈值用于初始化翻转,而较低的阈值用于何时指示翻转结束。否则奇怪的场景可能会在你的阈值附近来回跳跃,你仍然会处于这种情况。

可能更好的方法是保留您最后一次注意到翻转的时间戳。当发生新的翻转时,检查自上次翻转以来的时间。如果你在最后一次翻转的 1 秒内,什么也不做。超过一秒?再次翻转并更新上次翻转的时间戳。你可以玩弄 1 秒的间隔,直到你发现一个足够长的延迟,你不会经常显示财富,但足够短,人们不会因为他们的翻转没有被识别而感到沮丧(例如 10 秒是可能太长了)。


推荐阅读