Teilen über


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

ContextKontext

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

ContextKontext

Ein Kontext für die aktuelle Aktivität.

Rückgabe

DisplayMask

Die neue Anzeigemaske.

GetBoundingRects

public List<Rect> GetBoundingRects()

Gibt eine Liste von Rechtecken (Rects) zurück, von denen jedes das Begrenzungsrechteck für einen nicht funktionalen Bereich der Anzeige ist.

Rückgabe

List<Rect>

Eine Liste der Begrenzungsrechtecke (Rects), eins für jeden Anzeigemaskenbereich.

GetBoundingRectsForRotation

public List<Rect> 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.

Parameter

SurfaceOrientationDrehung

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 (Rects), 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“.