Utilizza il sensore di luce
Informazioni su come usare il sensore di luce ambientale per rilevare le modifiche nell'illuminazione.
API importanti
Prerequisiti
È consigliabile familiarizzare con Extensible Application Markup Language (XAML), Microsoft Visual C# ed eventi.
Il dispositivo o l'emulatore in uso deve supportare un sensore di luce ambientale.
Crea una semplice app per sensori di luce
Un sensore di luce ambientale è uno dei diversi tipi di sensori ambientali che consentono alle app di rispondere alle modifiche nell'ambiente dell'utente.
Nota
Per un'implementazione più completa, vedere esempio di sensore di luce.
Istruzioni
Creare un nuovo progetto scegliendo un'app vuota (Windows universale) dai modelli di progetto Visual C# .
Aprire il file di BlankPage.xaml.cs del progetto e sostituire il codice esistente con il codice seguente.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.UI.Core; // Required to access the core dispatcher object
using Windows.Devices.Sensors; // Required to access the sensor platform and the ALS
// The Blank Page item template is documented at https://go.microsoft.com/fwlink/p/?linkid=234238
namespace App1
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class BlankPage : Page
{
private LightSensor _lightsensor; // Our app' s lightsensor object
// This event handler writes the current light-sensor reading to
// the textbox named "txtLUX" on the app' s main page.
private void ReadingChanged(object sender, LightSensorReadingChangedEventArgs e)
{
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, (s, a) =>
{
LightSensorReading reading = (a.Context as LightSensorReadingChangedEventArgs).Reading;
txtLuxValue.Text = String.Format("{0,5:0.00}", reading.IlluminanceInLux);
});
}
public BlankPage()
{
InitializeComponent();
_lightsensor = LightSensor.GetDefault(); // Get the default light sensor object
// Assign an event handler for the ALS reading-changed event
if (_lightsensor != null)
{
// Establish the report interval for all scenarios
uint minReportInterval = _lightsensor.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
_lightsensor.ReportInterval = reportInterval;
// Establish the even thandler
_lightsensor.ReadingChanged += new TypedEventHandler<LightSensor, LightSensorReadingChangedEventArgs>(ReadingChanged);
}
}
}
}
Sarà necessario rinominare lo spazio dei nomi nel frammento precedente con il nome assegnato al progetto. Ad esempio, se è stato creato un progetto denominato LightingCS, sostituire namespace App1
con namespace LightingCS
.
- Aprire il file MainPage.xaml e sostituire i contenuti originali con il seguente XML:
<Page
x:Class="App1.BlankPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid x:Name="LayoutRoot" Background="Black">
<TextBlock HorizontalAlignment="Left" Height="44" Margin="52,38,0,0" TextWrapping="Wrap" Text="LUX Reading" VerticalAlignment="Top" Width="150"/>
<TextBlock x:Name="txtLuxValue" HorizontalAlignment="Left" Height="44" Margin="224,38,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="217"/>
</Grid>
</Page>
È necessario sostituire la prima parte del nome della classe nel frammento di codice precedente con lo spazio dei nomi dell'app. Ad esempio, se è stato creato un progetto denominato LightingCS, sostituire x:Class="App1.MainPage"
con x:Class="LightingCS.MainPage"
. È anche consigliabile sostituire xmlns:local="using:App1"
con xmlns:local="using:LightingCS"
.
- Premere F5 oppure selezionare Debug>Avvio debug per compilare, distribuire ed eseguire l'app.
Una volta eseguita l'app, è possibile modificare i valori del sensore di luce modificando quella disponibile per il sensore o usando gli strumenti dell'emulatore.
- Arrestare l'app restituendo a Visual Studio e premendo MAIUSC+F5 oppure selezionare Debug>Arresta debug per bloccare l'app.
Spiegazione
L'esempio precedente illustra quanto poco codice è necessario scrivere per integrare l'input del sensore di luce nell'app.
L'app stabilisce una connessione con il sensore predefinito nel metodo BlankPage.
_lightsensor = LightSensor.GetDefault(); // Get the default light sensor object
L'app stabilisce l'intervallo di report all'interno del metodo BlankPage . Questo codice recupera l'intervallo minimo supportato dal dispositivo e lo confronta con un intervallo richiesto di 16 millisecondi (che approssima una frequenza di aggiornamento a 60 Hz). Se l'intervallo minimo supportato è maggiore dell'intervallo richiesto, il codice imposta il valore al minimo. In caso contrario, imposta il valore sull'intervallo richiesto.
uint minReportInterval = _lightsensor.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
_lightsensor.ReportInterval = reportInterval;
I nuovi dati del sensore di luce vengono acquisiti nel metodo ReadingChanged . Ogni volta che il driver del sensore riceve nuovi dati dal sensore, passa il valore all'app usando questo gestore eventi. L'app registra questo gestore eventi nella riga seguente.
_lightsensor.ReadingChanged += new TypedEventHandler<LightSensor,
LightSensorReadingChangedEventArgs>(ReadingChanged);
Questi nuovi valori vengono scritti in un TextBlock presente nel codice XAML del progetto.
<TextBlock HorizontalAlignment="Left" Height="44" Margin="52,38,0,0" TextWrapping="Wrap" Text="LUX Reading" VerticalAlignment="Top" Width="150"/>
<TextBlock x:Name="txtLuxValue" HorizontalAlignment="Left" Height="44" Margin="224,38,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="217"/>