Partilhar via


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.

Sensor de dobradiça

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}");
}

IsSurfaceDuoDevice

public bool IsDeviceSurfaceDuo(Context context, string feature = "com.microsoft.device.display.displaymask")
    => context?.PackageManager?.HasSystemFeature(feature) ?? false;

IsAppSpanned

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();

Máscara de Exibição

Adicione o NuGet DuoSDK para usar essas APIs no projeto.

using Microsoft.Device.Display;

Métodos

Métodos estáticos

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étodos de objeto

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.

Exemplo

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
}

Métodos públicos

FromResourcesRect

public static DisplayMask FromResourcesRect(Context context)

Cria a máscara de exibição de acordo com config_mainBuiltInDisplayMaskRect.

Parâmetros

Contextcontexto

Um contexto da atividade atual.

Retorna

DisplayMask

A nova máscara de exibição.

FromResourcesRectApproximation

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

Contextcontexto

Um contexto da atividade atual.

Retorna

DisplayMask

A nova máscara de exibição.

GetBoundingRects

public List<Rect> GetBoundingRects()

Retorna uma lista de Rects, sendo cada um deles o retângulo delimitador de uma área não funcional na tela.

Retorna

List<Rect>

Uma lista de Rects delimitadores, um para cada área da máscara de exibição.

GetBoundingRectsForRotation

public List<Rect> GetBoundingRectsForRotation(SurfaceOrientation rotation)

Retorna uma lista de Rects com relação à rotação, sendo cada um deles o retângulo delimitador de uma área não funcional na tela.

Parâmetros

SurfaceOrientationrotaçã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 Rects delimitadores, um para cada área da máscara de exibição.

GetBounds

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.