Acessar informações de tela dupla no Surface Duo do Xamarin.Android
Observação
Os usuários do Xamarin.Forms devem conferir DualScreenInfo e TwoPaneView no NuGet Xamarin.Forms.DualScreen.
O Xamarin.DuoSDK é para desenvolvedores do Xamarin.Android destinados ao Surface Duo. Para direcionar o Surface Duo e outros dispositivos dobráveis, consulte a associação do Gerenciador de Janelas do Jetpack disponível no Xamarin.AndroidX.Window.
A classe HingeSensor pode ser usada para escutar facilmente um evento OnSensorChanged e obter o valor atualizado do ângulo da dobradiça. Adicione o NuGet DuoSDK ao seu aplicativo antes de usar o namespace Microsoft.Device.Display e a classe HingeSensor.
using Microsoft.Device.Display;
// ...
HingeSensor hingeSensor;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
hingeSensor = new HingeSensor(this);
}
protected override void OnResume()
{
base.OnResume();
if (hingeSensor?.HasHinge ?? false)
{
hingeSensor.OnSensorChanged += HingeSensor_OnSensorChanged;
hingeSensor.StartListening();
}
}
protected override void OnPause()
{
base.OnPause();
if (hingeSensor?.HasHinge ?? false)
{
hingeSensor.StopListening();
hingeSensor.OnSensorChanged -= HingeSensor_OnSensorChanged;
}
}
private void HingeSensor_OnSensorChanged(object sender, HingeSensor.HingeSensorChangedEventArgs e)
{
Console.WriteLine($"Hinge Sensor Changed: {e.HingeAngle}");
}
public bool IsDeviceSurfaceDuo(Context context, string feature = "com.microsoft.device.display.displaymask")
=> context?.PackageManager?.HasSystemFeature(feature) ?? false;
O Xamarin.DuoSdk contém uma classe ScreenHelper
que você pode inicializar e usar para detectar se o aplicativo está estendido:
public bool IsAppSpanned()
{
var screenHelper = new ScreenHelper();
// If initialize returns false, it's not a Duo device, can't be spanned
if (!screenHelper.Initialize(this))
return false;
return screenHelper.IsDualMode;
}
Se desejar recuperar os limites para o local da máscara de dobradiça, poderá usar o método GetHingeBoundsDip()
:
var hingeBoundsRect = screenHelper.GetHingeBoundsDip();
Adicione o NuGet DuoSDK para usar essas APIs no projeto.
using Microsoft.Device.Display;
Método | Descrição |
---|---|
FromResourcesRect(Context context) | Cria a máscara de exibição de acordo com config_mainBuiltInDisplayMaskRect. |
FromResourcesRectApproximation(Context context) | Cria a máscara de exibição de acordo com config_mainBuiltInDisplayMaskRectApproximation, que é a aproximação de base de retângulo mais próxima da máscara. |
Método | Descrição |
---|---|
GetBoundingRects() | Retorna uma lista de Retângulos, sendo cada um deles o retângulo delimitador de uma área não funcional na tela. |
GetBoundingRectsForRotation(SurfaceOrientation rotation) | Retorna uma lista de Retângulos com relação à rotação, sendo cada um deles o retângulo delimitador de uma área não funcional na tela. |
GetBounds() | Retorna a região delimitadora da máscara. |
Obtendo um retângulo da máscara de exibição
var displayMask = DisplayMask.FromResourcesRect(context);
var masks = displayMask.GetBoundingRectsForRotation(rotation); // pass in orientation (test with 0)
var mask = new Rect();
if(masks?.Any() ?? false) {
mask = masks.First();
// layout around masked area
}
public static DisplayMask FromResourcesRect(Context context)
Cria a máscara de exibição de acordo com config_mainBuiltInDisplayMaskRect.
Parâmetros
Context
contexto
Um contexto da atividade atual.
Retorna
DisplayMask
A nova máscara de exibição.
public static DisplayMask FromResourcesRectApproximation(Context context)
Cria a máscara de exibição de acordo com config_mainBuiltInDisplayMaskRectApproximation, que é a aproximação de base de retângulo mais próxima da máscara.
Parâmetros
Context
contexto
Um contexto da atividade atual.
Retorna
DisplayMask
A nova máscara de exibição.
public List<Rect> GetBoundingRects()
Retorna uma lista de Rect
s, sendo cada um deles o retângulo delimitador de uma área não funcional na tela.
Retorna
List<Rect>
Uma lista de Rect
s delimitadores, um para cada área da máscara de exibição.
public List<Rect> GetBoundingRectsForRotation(SurfaceOrientation rotation)
Retorna uma lista de Rect
s com relação à rotação, sendo cada um deles o retângulo delimitador de uma área não funcional na tela.
Parâmetros
SurfaceOrientation
rotação
A máscara de rotação deve girar. Os valores possíveis são SurfaceOrientation.Rotation0
, SurfaceOrientation.Rotation90
, SurfaceOrientation.Rotation180
, SurfaceOrientation.Rotation270
.
Retorna
List<Rect>
Uma lista de Rect
s delimitadores, um para cada área da máscara de exibição.
public Region GetBounds()
Retorna a região delimitadora da máscara.
Pode haver mais de uma máscara; nesse caso, o Region
retornado não será contíguo e seu retângulo delimitador não significará nada se não houver uma intersecção primeiro.
Retorna
Region
A região delimitadora da máscara. As coordenadas são relativas ao canto superior esquerdo da exibição de conteúdo e em unidades de pixel.