がりらぼ

WindowsRuntimeの応援ブログ

明るさセンサーで環境光の強さを測る

明るさセンサーはさまざまなところに使われています。

回りが暗くなるとデバイスのバックライトが強くなるのも、明るさセンサーで測っているからです。

明るさセンサーを使うにはWindows.Devices.Sensors名前空間のLightSensorクラスを使います。

基本的にはLightSensorクラスのReadingChangedイベントが明るさが変化したときに呼ばれるのでそこで処理するか、

DispatherTimerで定期的にLightSensorクラスのGetCurrentReading()を定期的に呼ぶかのどちらかに分かれます。

[csharp]

var sensor = LightSensor.GetDefault();

sensor.ReportInterval = 100;

sensor.ReadingChanged += (s, e) =>

{

var light=e.Reading.IlluminanceInLux;

};

[/csharp]

これで明るさが変化するたびに明るさを取得できます。単位はルクスです。

注意が必要なのが、明るさが変化したときにイベントは発生します。

僕のタブレットだけなのか、明るさセンサーはタブレットをずっと置いてるだけでは変化しません。タブレットを少し動かしてみて、初めて明るさに変化が訪れます。

なので僕みたいにタブレットをずっと置いたまま、イベントが発生しないのをLightSensorクラスのせいにして時間を無駄に食わないようにしましょう。

DispatcherTimerのほうはこっち

[csharp]

var sensor = LightSensor.GetDefault();

var timer = new DispatcherTimer();

timer.Interval = TimeSpan.FromMilliseconds(500);

timer.Tick+=timer_Tick;

private async void timer_Tick(object s, object e)

{

await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>

{

var light=sensor.GetCurrentReading().IlluminanceInLux;

});

}

[/csharp]

ラムダ式でもよかったけど今回はDispatherTimerでUIスレッドを呼びたかったのでメソッドにわけてasyncつけました。

ラムダ式でasyncできるようにする方法がわからないのでだれか知ってたら教えてくだしあ。