Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os dados de sensor das classes Accelerometer, Gyrometer, Compass, Inclinometer e OrientationSensor são definidos por seus eixos de referência. Esses eixos são definidos pelo referencial do dispositivo e giram com o dispositivo à medida que o usuário o gira. Se o aplicativo der suporte à rotação automática e se reorientar para acomodar o dispositivo à medida que o usuário o gira, você deve ajustar os dados do sensor para a rotação antes de usá-lo.
- Important APIs:Windows. Devices.Sensors, Windows. Devices.Sensors.Custom
Orientação de exibição versus orientação do dispositivo
Para entender os eixos de referência para sensores, você precisa distinguir a orientação de exibição da orientação do dispositivo. A orientação da tela é a direção em que o texto e as imagens são exibidos na tela, enquanto a orientação do dispositivo é o posicionamento físico do dispositivo.
Note
O eixo z positivo se estende para fora da tela do dispositivo, conforme mostrado na imagem a seguir.
Nos diagramas a seguir, o dispositivo e a orientação de exibição estão em Landscape (os eixos de sensor mostrados são específicos à orientação paisagem).
Este diagrama mostra tanto a orientação da tela quanto a do dispositivo em paisagem.
Este próximo diagrama mostra tanto a orientação da tela quanto a do dispositivo em LandscapeFlipped.
Este diagrama final mostra a orientação de exibição em Paisagem enquanto a orientação do dispositivo é LandscapeFlipped.
Você pode consultar os valores de orientação por meio da classe DisplayInformation usando o método GetForCurrentView com a propriedade CurrentOrientation. Em seguida, você pode criar lógica comparando com a enumeração DisplayOrientations. Lembre-se de que, para cada orientação suportada, você precisa oferecer suporte à conversão dos eixos de referência para essa orientação.
Dispositivos voltados primeiro para o modo paisagem vs. para o modo retrato
Os fabricantes produzem tanto dispositivos projetados principalmente para o modo paisagem quanto para o modo retrato. O referencial varia entre dispositivos com orientação horizontal como padrão (como desktops e laptops) e dispositivos com orientação vertical como padrão (como celulares e alguns tablets). A tabela a seguir mostra os eixos do sensor para dispositivos com orientação principal paisagem e retrato.
| Orientação | Paisagem-first | Retrato-primeiro |
|---|---|---|
| Paisagem |
|
|
| Portrait |
|
|
| LandscapeFlipped |
|
|
| PortraitFlipped |
|
|
Dispositivos que transmitem a exibição e dispositivos sem cabeça
Alguns dispositivos têm a capacidade de transmitir a exibição para outro dispositivo. Por exemplo, você pode usar um tablet e transmitir a tela para um projetor que estará na orientação horizontal. Nesse cenário, é importante ter em mente que a orientação do dispositivo é baseada no dispositivo original, não naquele que apresenta a exibição. Portanto, um acelerômetro relataria dados para o tablet.
Além disso, alguns dispositivos não têm tela. Com esses dispositivos, a orientação padrão para esses dispositivos é retrato.
Exibir orientação e direção da bússola
A direção da bússola depende dos eixos de referência adotados e, portanto, muda com a orientação do dispositivo. Você compensa com base nessa tabela (suponha que o usuário esteja voltado para o norte).
| Orientação de exibição | Eixo de referência para o rumo da bússola | Direção da bússola da API quando voltado para o norte (modo paisagem primeiro) | Direção da bússola da API ao apontar para o norte (com o dispositivo na vertical) | Compensação da direção da bússola (com a orientação paisagem primeiro) | Compensação do rumo da bússola (modo retrato primeiro) |
|---|---|---|---|---|---|
| Paisagem | -Z | 0 | 270 | Cabeçalho | (Título + 90) % 360 |
| Retrato | Y | 90 | 0 | (Título + 270) % 360 | Cabeçalho |
| LandscapeFlipped | Z | 180 | 90 | (Título + 180) % 360 | (Título + 270) % 360 |
| PortraitFlipped | Y | 270 | 180 | (Título + 90) % 360 | (Título + 180) % 360 |
Modifique o rumo da bússola, conforme mostrado na tabela, para exibir corretamente o rumo. O snippet de código a seguir demonstra como fazer isso.
private void ReadingChanged(object sender, CompassReadingChangedEventArgs e)
{
double heading = e.Reading.HeadingMagneticNorth;
double displayOffset;
// Calculate the compass heading offset based on
// the current display orientation.
// In WinUI 3 desktop apps, use interop to get DisplayInformation for the current window.
var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(App.Window);
DisplayInformation displayInfo = DisplayInformation.CreateForWindowId(
Microsoft.UI.Win32Interop.GetWindowIdFromWindow(hWnd));
switch (displayInfo.CurrentOrientation)
{
case DisplayOrientations.Landscape:
displayOffset = 0;
break;
case DisplayOrientations.Portrait:
displayOffset = 270;
break;
case DisplayOrientations.LandscapeFlipped:
displayOffset = 180;
break;
case DisplayOrientations.PortraitFlipped:
displayOffset = 90;
break;
}
double displayCompensatedHeading = (heading + displayOffset) % 360;
// Update the UI...
}
Exibir orientação com o acelerômetro e o giroter
Esta tabela converte dados de acelerômetro e giroter para orientação de exibição.
| Eixos de referência | X | Y | Z |
|---|---|---|---|
| Paisagem | X | Y | Z |
| Portrait | Y | -X | Z |
| LandscapeFlipped | -X | -Y | Z |
| PortraitFlipped | -Y | X | Z |
O exemplo de código a seguir aplica essas conversões ao gyrometer.
private void ReadingChanged(object sender, GyrometerReadingChangedEventArgs e)
{
double x_Axis;
double y_Axis;
double z_Axis;
GyrometerReading reading = e.Reading;
// Calculate the gyrometer axes based on
// the current display orientation.
// In WinUI 3 desktop apps, use interop to get DisplayInformation for the current window.
var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(App.Window);
DisplayInformation displayInfo = DisplayInformation.CreateForWindowId(
Microsoft.UI.Win32Interop.GetWindowIdFromWindow(hWnd));
switch (displayInfo.CurrentOrientation)
{
case DisplayOrientations.Landscape:
x_Axis = reading.AngularVelocityX;
y_Axis = reading.AngularVelocityY;
z_Axis = reading.AngularVelocityZ;
break;
case DisplayOrientations.Portrait:
x_Axis = reading.AngularVelocityY;
y_Axis = -1 * reading.AngularVelocityX;
z_Axis = reading.AngularVelocityZ;
break;
case DisplayOrientations.LandscapeFlipped:
x_Axis = -1 * reading.AngularVelocityX;
y_Axis = -1 * reading.AngularVelocityY;
z_Axis = reading.AngularVelocityZ;
break;
case DisplayOrientations.PortraitFlipped:
x_Axis = -1 * reading.AngularVelocityY;
y_Axis = reading.AngularVelocityX;
z_Axis = reading.AngularVelocityZ;
break;
}
// Update the UI...
}
Orientação de exibição e orientação do dispositivo
Os dados OrientationSensor devem ser alterados de uma maneira diferente. Pense nessas orientações diferentes como rotações no sentido anti-horário para o eixo z, portanto, precisamos reverter a rotação para recuperar a orientação do usuário. Para dados de quatérnio, podemos usar a fórmula de Euler para definir uma rotação com um quatérnio de referência e também podemos usar uma matriz de rotação de referência.
Para obter a orientação relativa desejada, multiplique o objeto de referência em relação ao objeto absoluto. Observe que essa matemática não é commutativa.
Na expressão anterior, o objeto absoluto é retornado pelos dados do sensor.
| Orientação de exibição | Rotação no sentido anti-horário em torno de Z | Quatérnio de referência (rotação inversa) | Matriz de rotação de referência (rotação inversa) |
|---|---|---|---|
| Paisagem | 0 | 1 + 0i + 0j + 0k | [1 0 0 0 1 0 0 0 1] |
| Portrait | 90 | cos(-45⁰) + (i + j + k)*sin(-45⁰) | [0 1 0 -1 0 0 0 0 1] |
| LandscapeFlipped | 180 | 0 - i - j - k | [1 0 0 0 1 0 0 0 1] |
| PortraitFlipped | 270 | cos(-135⁰) + (i + j + k)*sin(-135⁰) | [0 -1 0 1 0 0 0 0 1] |
Consulte também
Windows developer