Accédez à des informations à deux écrans sur surface Duo à partir de Xamarin. Android

Notes

Les utilisateurs Xamarin. Forms doivent extraire DualScreenInfo et TwoPaneView dans le NuGet Xamarin. Forms. DualScreen.

Xamarin. DuoSDK est destiné aux développeurs Xamarin. Android ciblant le surface Duo. Pour cibler surface Duo et d’autres appareils pliables, consultez la liaison du gestionnaire de fenêtres Jetpack disponible dans Xamarin. AndroidX. Window.

Capteur de charnière

La classe HingeSensor peut être utilisée pour écouter facilement un événement OnSensorChanged et obtenir la valeur d’angle de charnière mise à jour. ajoutez le NuGet DuoSDK à votre application avant d’utiliser l’espace de noms Microsoft. Device. Display et la 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

Xamarin.DuoSdk contient une classe ScreenHelper que vous pouvez initialiser et utiliser pour détecter si l’application est répartie :

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

Si vous voulez récupérer les limites de l’emplacement du masque de charnière, vous pouvez utiliser la méthode GetHingeBoundsDip() :

var hingeBoundsRect = screenHelper.GetHingeBoundsDip();

Afficher le masque

Ajoutez le package NuGet DuoSDK pour utiliser ces API dans votre projet.

using Microsoft.Device.Display;

Méthodes

Méthodes statiques

Méthode Description
FromResourcesRect(Context context) Crée le masque d’affichage en fonction de config_mainBuiltInDisplayMaskRect.
FromResourcesRectApproximation(Context context) Crée le masque d’affichage en fonction de config_mainBuiltInDisplayMaskRectApproximation, qui est l’approximation du masque basée sur le rectangle la plus proche.

Méthodes d’objets

Méthode Description
GetBoundingRects() Retourne une liste de rectangles, chacun étant le rectangle englobant d’une zone non fonctionnelle sur l’affichage.
GetBoundingRectsForRotation(SurfaceOrientation rotation) Retourne une liste de rectangles par rapport à la rotation, chacun étant le rectangle englobant d’une zone non fonctionnelle sur l’affichage.
GetBounds() Retourne la zone englobante du masque.

Exemple

Obtention d’un rectangle de masque d’affichage

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éthodes publiques

FromResourcesRect

public static DisplayMask FromResourcesRect(Context context)

Crée le masque d’affichage en fonction de config_mainBuiltInDisplayMaskRect.

Paramètres

ContextContext

Contexte de l’activité actuelle.

Retourne

DisplayMask

Nouveau masque d’affichage.

FromResourcesRectApproximation

public static DisplayMask FromResourcesRectApproximation(Context context)

Crée le masque d’affichage en fonction de config_mainBuiltInDisplayMaskRectApproximation, qui est l’approximation du masque basée sur le rectangle la plus proche.

Paramètres

ContextContext

Contexte de l’activité actuelle.

Retourne

DisplayMask

Nouveau masque d’affichage.

GetBoundingRects

public List<Rect> GetBoundingRects()

Retourne une liste de rectangles (Rect), chacun étant le rectangle englobant d’une zone non fonctionnelle sur l’affichage.

Retourne

List<Rect>

Liste de rectangles (Rect) englobants, un pour chaque zone du masque d’affichage.

GetBoundingRectsForRotation

public List<Rect> GetBoundingRectsForRotation(SurfaceOrientation rotation)

Retourne une liste de rectangles (Rect) par rapport à la rotation, chacun étant le rectangle englobant d’une zone non fonctionnelle sur l’affichage.

Paramètres

SurfaceOrientationSurfaceOrientation

Le masque de rotation doit pivoter. Les valeurs possibles sont les suivantes : SurfaceOrientation.Rotation0, SurfaceOrientation.Rotation90, SurfaceOrientation.Rotation180, SurfaceOrientation.Rotation270.

Retourne

List<Rect>

Liste de rectangles (Rect) englobants, un pour chaque zone du masque d’affichage.

GetBounds

public Region GetBounds()

Retourne la zone englobante du masque.

Il peut y avoir plusieurs masques, auquel cas la région (Region) retournée n’est pas contiguë et son rectangle englobant n’a aucune utilité tant qu’il n’entre pas en intersection avec elle.

Retourne

Region

Zone englobante du masque. Les coordonnées sont exprimées par rapport à l’angle supérieur gauche de l’affichage de contenu, en pixels.