環境光センサーを使用して、照明の変化を検出する方法について説明します。
この例では、入力デバイスとして光センサーに依存する単純なアプリを作成します。 環境光センサーは、アプリがユーザーの環境の変化に対応できるようにする、いくつかの種類の環境センサーの 1 つです。
- 重要な API:Windows.Devices.Sensors、LightSensor
Note
この記事では、光センサーの使用方法を示すコードに焦点を当てます。 光センサーの概要については、「 センサー: 光センサー」を参照してください。
前提条件
光センサーとその用途について理解している必要があります。 「センサー: 光センサー」を参照してください。
使用しているデバイスまたはエミュレーターは、環境光センサーをサポートしている必要があります。
サンプル コード
using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml.Controls;
using Windows.Devices.Sensors;
namespace DevicesDemo.Pages
{
public sealed partial class LightSensorPage : Page
{
private LightSensor? lightSensor;
public LightSensorPage()
{
InitializeComponent();
// Get the default light sensor object.
lightSensor = LightSensor.GetDefault();
if (lightSensor != null)
{
// Establish the report interval.
uint minReportInterval = lightSensor.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
lightSensor.ReportInterval = reportInterval;
// Assign an event handler for the reading-changed event.
lightSensor.ReadingChanged += LightSensor_ReadingChanged;
}
else
{
statusBar.Message = "No light sensor was found.";
statusBar.Severity = InfoBarSeverity.Error;
statusBar.IsOpen = true;
}
}
// This event handler writes the current light
// reading to the text block on the XAML page.
private void LightSensor_ReadingChanged(LightSensor sender, LightSensorReadingChangedEventArgs args)
{
DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
{
LightSensorReading reading = args.Reading;
txtLuxValue.Text = String.Format("{0,5:0.00}", reading.IlluminanceInLux);
});
}
}
}
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Margin="24">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="44"/>
<RowDefinition Height="44"/>
<RowDefinition Height="44"/>
</Grid.RowDefinitions>
<TextBlock Text="LUX Reading:" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtLuxValue" Grid.Column="1" Text="---"/>
</Grid>
<InfoBar x:Name="statusBar" Grid.Row="1"/>
</Grid>
アプリの実行中に、光センサーを覆ったり覆いを外したりすることで、明るさの値を変更できます。
前の例では、光センサー入力をアプリに統合するために記述する必要がある重要なコードを示します。
センサーに接続する
GetDefault メソッドを呼び出して、既定の光センサーとの接続を確立します。
private LightSensor? lightSensor;
// ...
lightSensor = LightSensor.GetDefault();
光センサー センサーが検出されない場合は、ステータス メッセージが更新され、ユーザーに通知されます。
レポート間隔を設定する
レポート間隔は、ページのコンストラクター内で設定されます。 このコードは、デバイスでサポートされている最小間隔を取得し、16 ミリ秒 (約 60 Hz のリフレッシュ レート) の要求された間隔と比較します。 サポートされる最小間隔が要求された間隔より大きい場合、コードは値を最小値に設定します。 それ以外の場合は、要求された間隔に値が設定されます。
uint minReportInterval = lightSensor.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
lightSensor.ReportInterval = reportInterval;
センサー データの読み取り
新しい光センサー データは、 ReadingChanged イベント ハンドラーでキャプチャされます。 センサー ドライバーは、センサーから新しいデータを受信するたびに、このイベントを使用して値をアプリに渡します。 この例では、これらの新しい値は、対応するページの XAML で見つかったテキスト ブロックに書き込まれます。
lightSensor.ReadingChanged += LightSensor_ReadingChanged;
// ...
private void LightSensor_ReadingChanged(LightSensor sender, LightSensorReadingChangedEventArgs args)
{
DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
{
LightSensorReading reading = args.Reading;
txtLuxValue.Text = String.Format("{0,5:0.00}", reading.IlluminanceInLux);
});
}
関連トピック
Windows developer