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.
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}");
}
public bool IsDeviceSurfaceDuo(Context context, string feature = "com.microsoft.device.display.displaymask")
=> context?.PackageManager?.HasSystemFeature(feature) ?? false;
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();
Ajoutez le package NuGet DuoSDK pour utiliser ces API dans votre projet.
using Microsoft.Device.Display;
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é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. |
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
}
public static DisplayMask FromResourcesRect(Context context)
Crée le masque d’affichage en fonction de config_mainBuiltInDisplayMaskRect.
Paramètres
Context
contexte
Contexte de l’activité actuelle.
Retourne
DisplayMask
Nouveau masque d’affichage.
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
Context
contexte
Contexte de l’activité actuelle.
Retourne
DisplayMask
Nouveau masque d’affichage.
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.
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
SurfaceOrientation
rotation
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.
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.