Zugreifen auf Dual-Screen-Informationen auf Surface Duo über Xamarin.Android
Hinweis
Xamarin.Forms-Benutzer sollten DualScreenInfo und TwoPaneView im Xamarin.Forms.DualScreen-NuGet.
Das Xamarin.DuoSDK richtet sich an Xamarin.Android-Entwickler, die das Surface Duo als Ziel verwenden. Informationen zu Surface Duo und anderen foldbaren Geräten finden Sie in der Jetpack Window Manager-Bindung, die in Xamarin.AndroidX.Window verfügbar ist.
Scharniersensor
Die HingeSensor-Klasse kann verwendet werden, um problemlos auf ein OnSensorChanged-Ereignis zu lauschen und den aktualisierten Scharnierwinkelwert zu erhalten. Fügen Sie ihrer Anwendung die DuoSDK-NuGet hinzu, bevor Sie den Namespace Microsoft.Device.Display und die HingeSensor-Klasse verwenden.
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 enthält die Klasse ScreenHelper
, die du initialisieren und verwenden kannst, um zu erkennen, ob die App übergreifend ist:
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;
}
Wenn du die Begrenzungen für die Position der Scharniermaske abrufen willst, kannst du die GetHingeBoundsDip()
-Methode verwenden:
var hingeBoundsRect = screenHelper.GetHingeBoundsDip();
Anzeigemaske
Fügen Sie das DuoSDK-NuGet-Paket hinzu, um diese APIs in Ihrem Projekt zu verwenden.
using Microsoft.Device.Display;
Methoden
Statische Methoden
Methode | BESCHREIBUNG |
---|---|
FromResourcesRect(Context context) | Erstellt die Anzeigemaske gemäß „config_mainBuiltInDisplayMaskRect“. |
FromResourcesRectApproximation(Context context) | Erstellt die Anzeigemaske gemäß „config_mainBuiltInDisplayMaskRectApproximation“, wobei es sich um die nächste rechteckbasierte Annäherung der Maske handelt. |
Objektmethoden
Methode | BESCHREIBUNG |
---|---|
GetBoundingRects() | Gibt eine Liste von Rechtecken (Rects) zurück, von denen jedes das Begrenzungsrechteck für einen nicht funktionalen Bereich der Anzeige ist. |
GetBoundingRectsForRotation(SurfaceOrientation rotation) | Gibt eine Liste von Rechtecken (Rects) unter Berücksichtigung der Drehung zurück, von denen jedes das Begrenzungsrechteck für einen nicht funktionalen Bereich der Anzeige ist. |
GetBounds() | Gibt den Begrenzungsbereich der Maske zurück. |
Beispiel
Abrufen eines Anzeigemaskenrechtecks (Rect)
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
}
Öffentliche Methoden
FromResourcesRect
public static DisplayMask FromResourcesRect(Context context)
Erstellt die Anzeigemaske gemäß „config_mainBuiltInDisplayMaskRect“.
Parameter
Context
Kontext
Ein Kontext für die aktuelle Aktivität.
Rückgabe
DisplayMask
Die neue Anzeigemaske.
FromResourcesRectApproximation
public static DisplayMask FromResourcesRectApproximation(Context context)
Erstellt die Anzeigemaske gemäß „config_mainBuiltInDisplayMaskRectApproximation“, wobei es sich um die nächste rechteckbasierte Annäherung der Maske handelt.
Parameter
Context
Kontext
Ein Kontext für die aktuelle Aktivität.
Rückgabe
DisplayMask
Die neue Anzeigemaske.
GetBoundingRects
public List<Rect> GetBoundingRects()
Gibt eine Liste von Rechtecken (Rect
s) zurück, von denen jedes das Begrenzungsrechteck für einen nicht funktionalen Bereich der Anzeige ist.
Rückgabe
List<Rect>
Eine Liste der Begrenzungsrechtecke (Rect
s), eins für jeden Anzeigemaskenbereich.
GetBoundingRectsForRotation
public List<Rect> GetBoundingRectsForRotation(SurfaceOrientation rotation)
Gibt eine Liste von Rechtecken (Rect
s) unter Berücksichtigung der Drehung zurück, von denen jedes das Begrenzungsrechteck für einen nicht funktionalen Bereich der Anzeige ist.
Parameter
SurfaceOrientation
Drehung
Die Drehung, um die die Maske gedreht werden soll. Mögliche Werte SurfaceOrientation.Rotation0
, SurfaceOrientation.Rotation90
, SurfaceOrientation.Rotation180
, SurfaceOrientation.Rotation270
.
Rückgabe
List<Rect>
Eine Liste der Begrenzungsrechtecke (Rect
s), eins für jeden Anzeigemaskenbereich.
GetBounds
public Region GetBounds()
Gibt den Begrenzungsbereich der Maske zurück.
Es kann mehr als eine Maske geben, wobei dann die zurückgegebene Region
nicht zusammenhängend und das Begrenzungsrechteck (Rect) bedeutungslos ist, wenn es nicht zuerst überschnitten wurde.
Rückgabe
Region
Der Begrenzungsbereich der Maske. Koordinaten sind relativ zur linken oberen Ecke der Inhaltsansicht in der Einheit „Pixel“.