亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

震動偵聽器檢測到過多的震動

震動偵聽器檢測到過多的震動

慕仙森 2023-06-14 16:11:33
我在我的應用程序中實現了一個震動檢測器來擲骰子。每次搖動,每個骰子都會擲一次。問題是,當我搖動手機時,它會一次“擲”多次骰子。我試過添加延遲并更改靈敏度,但都沒有用。private final SensorEventListener sensorListener = new SensorEventListener() {    @Override    public void onSensorChanged(SensorEvent sensorEvent) {        float x = sensorEvent.values[0];        float y = sensorEvent.values[1];        float z = sensorEvent.values[2];        acelLast = acelVal;        acelVal = (float) Math.sqrt((double) (x*x + y*y + z*z));        float delta = acelVal - acelLast;        shake = shake * 0.9f + delta;        if (shake > 12) {            // roll dice        }    }    @Override    public void onAccuracyChanged(Sensor sensor, int accuracy) {    }};
查看完整描述

2 回答

?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

我認為您可以嘗試通過這種方式獲得解決方案。


使用 Handler 會增加一個時間延遲,并且對于多個 senson 響應,它只會對最后一個滿足的條件采取行動,并且 previoulsy 調用一次將從回調中刪除。


private Handler handler = new Handler();


private Runnable runnable = new Runnable() {

    public void run() {

        // roll dice     

    }

};


private final SensorEventListener sensorListener = new SensorEventListener() {


@Override

public void onSensorChanged(SensorEvent sensorEvent) {


    float x = sensorEvent.values[0];

    float y = sensorEvent.values[1];

    float z = sensorEvent.values[2];


    acelLast = acelVal;

    acelVal = (float) Math.sqrt((double) (x*x + y*y + z*z));

    float delta = acelVal - acelLast;

    shake = shake * 0.9f + delta;


    if (shake > 12) {

        try {

            handler.removeCallbacks(runnable);

            handler.postDelayed(runnable, 1000);

        } catch(Exception e) {

            e.printStackTrace();

        }

    }

}


@override

public void onStop() {

    super.onStop();

    handler.removeCallbacks(runnable);

}

如果您需要來自傳感器的任何東西,您可以刪除一個類變量并在條件中更新它if (shake > 12),以便可以在可運行的環境中使用。


查看完整回答
反對 回復 2023-06-14
?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

通過添加一個布爾值“rolled”,并在擲骰子時將其設置為真,您只能擲一次骰子。您可以通過將值設置回 false 來再次滾動。


private static boolean rolled = false;

private final SensorEventListener sensorListener = new SensorEventListener() {


    @Override

    public void onSensorChanged(SensorEvent sensorEvent) {


        float x = sensorEvent.values[0];

        float y = sensorEvent.values[1];

        float z = sensorEvent.values[2];


        acelLast = acelVal;

        acelVal = (float) Math.sqrt((double) (x*x + y*y + z*z));

        float delta = acelVal - acelLast;

        shake = shake * 0.9f + delta;


        if (shake > 12 && !rolled) {

            // roll dice

            rolled = true;

        }

    }


    @Override

    public void onAccuracyChanged(Sensor sensor, int accuracy) {


    }

};


查看完整回答
反對 回復 2023-06-14
  • 2 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號