Usar el sensor de luz
Aprenda a usar el sensor de luz ambiente para detectar cambios en la iluminación.
API importantes
Requisitos previos
Debes estar familiarizado con el lenguaje de marcado extensible de aplicaciones (XAML), Microsoft Visual C# y eventos.
El dispositivo o emulador que está usando debe admitir un sensor de luz ambiente.
Creación de una aplicación sencilla de sensor de luz
Un sensor de luz ambiental es uno de los distintos tipos de sensores ambientales que permiten a las aplicaciones responder a los cambios en el entorno del usuario.
Nota:
Para obtener una implementación más completa, consulte la muestra del sensor de luz.
Instrucciones
Cree un nuevo proyecto y elija una aplicación en blanco (Windows universal) en las plantillas de proyecto de Visual C# .
Abra el archivo BlankPage.xaml.cs del proyecto y reemplace el código existente por lo siguiente.
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);
}
}
}
}
Deberá cambiar el nombre del espacio de nombres en el fragmento de código anterior con el nombre que asignó al proyecto. Por ejemplo, si creó un proyecto denominado LightingCS, reemplazaría por namespace App1
namespace LightingCS
.
- Abra el archivo MainPage.xaml y reemplace el contenido original por el siguiente 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>
Deberá reemplazar la primera parte del nombre de clase en el fragmento de código anterior por el espacio de nombres de la aplicación. Por ejemplo, si creó un proyecto denominado LightingCS, reemplazaría por x:Class="App1.MainPage"
x:Class="LightingCS.MainPage"
. También debe reemplazar por xmlns:local="using:App1"
xmlns:local="using:LightingCS"
.
- Presione F5 o seleccione Depurar Iniciar depuración> para compilar, implementar y ejecutar la aplicación.
Una vez que se ejecuta la aplicación, puede cambiar los valores del sensor de luz modificando la luz disponible para el sensor o mediante las herramientas del emulador.
- Detenga la aplicación volviendo a Visual Studio y presionando Mayús+F5 o seleccione Depurar Detener depuración> para detener la aplicación.
Explicación
En el ejemplo anterior se muestra la poca cantidad de código que necesitará escribir para integrar la entrada del sensor de luz en la aplicación.
La aplicación establece una conexión con el sensor predeterminado en el método BlankPage .
_lightsensor = LightSensor.GetDefault(); // Get the default light sensor object
La aplicación establece el intervalo de informe dentro del método BlankPage . Este código recupera el intervalo mínimo admitido por el dispositivo y lo compara con un intervalo solicitado de 16 milisegundos (que aproxima una frecuencia de actualización de 60 Hz). Si el intervalo mínimo admitido es mayor que el intervalo solicitado, el código establece el valor en el mínimo. De lo contrario, establece el valor en el intervalo solicitado.
uint minReportInterval = _lightsensor.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
_lightsensor.ReportInterval = reportInterval;
Los nuevos datos del sensor de luz se capturan en el método ReadingChanged . Cada vez que el controlador del sensor recibe nuevos datos del sensor, pasa el valor a la aplicación mediante este controlador de eventos. La aplicación registra este controlador de eventos en la línea siguiente.
_lightsensor.ReadingChanged += new TypedEventHandler<LightSensor,
LightSensorReadingChangedEventArgs>(ReadingChanged);
Estos nuevos valores se escriben en un TextBlock que se encuentra en el XAML del proyecto.
<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"/>