Как сделать так, чтобы вибрация отличалась в зависимости от значимого значения освещенности? - PullRequest
0 голосов
/ 09 мая 2020

Я хочу, чтобы приложение вибрировало в соответствии с обнаруженным значением освещенности. Например, чем выше значение, тем сильнее вибрация. Но этот код, похоже, не работает, кто-нибудь может помочь понять, в чем моя ошибка? Он может правильно определять значение освещенности, и вибрация работает, но вибрация не вибрирует в соответствии со значением освещенности.

 public class LightDetection extends AppCompatActivity {
    TextView textLight, textOn, textOff;
    Button btnStart, btnStop;
    float x;
    long ambientValue = 16;
    long floor_delay = 500;
    long ceiling_delay = 80;
    long vibrate = 100;
    long vibrate_delay;
    Vibrator sensorVibrator;
    SensorManager sensorManager;
    Sensor sensor;
    private Handler handler = new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_light_detection);

    sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
    sensorVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    textLight = (TextView) findViewById(R.id.textView);
    textOn = (TextView) findViewById(R.id.textView2);
    textOff = (TextView) findViewById(R.id.textView3);
    btnStart = (Button) findViewById(R.id.button3);
    btnStop = (Button) findViewById(R.id.button4);


    final SensorEventListener lightListener = new SensorEventListener() {
        public void onAccuracyChanged(Sensor sensor, int acc) {
        }

        @SuppressLint("SetTextI18n")
        public void onSensorChanged(SensorEvent event) {
            float x = event.values[0];
            Log.i("IE LightDetect.", "Light value: " + x);
            textLight.setText((int) x + " lux");
        }
    };

    btnStart.setOnClickListener(new View.OnClickListener() {
        @SuppressLint("SetTextI18n")
        public void onClick(View view) {
            sensorManager.registerListener(lightListener, sensor,
                    SensorManager.SENSOR_DELAY_FASTEST);
            handler.postDelayed(runnable, vibrate_delay);
            textOn.setText("LIGHT DETECTION MODE: ON");
        }
    });

    btnStop.setOnClickListener(new View.OnClickListener() {
        @SuppressLint("SetTextI18n")
        public void onClick(View view) {
            textOn.setText("LIGHT DETECTION MODE: OFF");
            sensorManager.unregisterListener(lightListener);
            sensorVibrator.cancel();
            handler.removeCallbacks(runnable);

        }
    });



}

private Runnable runnable = new Runnable() {
    @Override
    public void run() {
        /* do what you need to do */
        long luxValue = (long) x;
        //Correction Ratio - Ceiling Delay/Most Likely Max Lux
        long ratio = 950 / 300;

        if (luxValue < ambientValue) {
            vibrate = 100;
            vibrate_delay = floor_delay + (ratio * luxValue);
        } else {
            vibrate = 100;
            vibrate_delay = floor_delay - (ratio * luxValue);
        }

        if (vibrate_delay < ceiling_delay) {
            long[] pattern = {0, vibrate, ceiling_delay};
            sensorVibrator.vibrate(pattern, 1);
        } else {
            long[] pattern = {0, vibrate, vibrate_delay};
            sensorVibrator.vibrate(pattern, 1);
        }

        Log.i("IE LightDetect.", "Lux: " + luxValue);
        handler.postDelayed(this, vibrate_delay);
    }
};

} `

1 Ответ

0 голосов
/ 09 мая 2020

После получения значения света в onSensorChanged() вы не сохраняете значение глобально, вы используете float x = event.values[0], который просто создает локальную переменную внутри функции, а не глобальную ... попробуйте отказаться от float оттуда используйте x = event.values[0] вместо float x = event.values[0] .. он сохранит значение в глобальной переменной, и вы будете использовать его при вычислении вибрации ..

...