Baca dalam bahasa Inggris

Bagikan melalui


Akses info layar ganda di Surface Duo dari Xamarin.Android

Catatan

Pengguna Xamarin.Forms harus memeriksa DualScreenInfo dan TwoPaneView di Xamarin.Forms.DualScreen NuGet.

Xamarin.DuoSDK adalah untuk pengembang Xamarin.Android yang menargetkan Surface Duo. Untuk menargetkan Surface Duo dan perangkat lain yang dapat dilipat, lihat pengikatan Jetpack Window Manager yang tersedia di Xamarin.AndroidX.Window.

Sensor Engsel

Kelas HingeSensor dapat digunakan untuk dengan mudah mendengarkan peristiwa OnSensorChanged dan mendapatkan nilai sudut engsel yang diperbarui. Tambahkan DuoSDK NuGet ke aplikasi Anda sebelum menggunakan namespace Microsoft.Device.Display dan kelas 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 berisi ScreenHelper kelas yang dapat Anda inisialisasi dan gunakan untuk mendeteksi apakah aplikasi terbentang:

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

Jika Anda ingin mengambil batas untuk lokasi masker engsel, Anda dapat menggunakan GetHingeBoundsDip() metode :

var hingeBoundsRect = screenHelper.GetHingeBoundsDip();

Tampilkan Masker

Tambahkan DuoSDK NuGet untuk menggunakan API ini di proyek Anda.

using Microsoft.Device.Display;

Metode

Metode statis

Metode Deskripsi
FromResourcesRect(Konteks konteks) Membuat masker tampilan sesuai dengan config_mainBuiltInDisplayMaskRect.
FromResourcesRectApproximation(Konteks konteks) Membuat masker tampilan sesuai dengan config_mainBuiltInDisplayMaskRectApproximation, yang merupakan perkiraan masker dasar persegi panjang terdekat.

Metode objek

Metode Deskripsi
GetBoundingRects() Mengembalikan daftar Rects, yang masing-masing adalah persegi panjang pembatas untuk area non-fungsional pada tampilan.
GetBoundingRectsForRotation(SurfaceOrientation rotation) Mengembalikan daftar Rects sehubungan dengan rotasi, yang masing-masing adalah persegi panjang pembatas untuk area non-fungsional pada tampilan.
GetBounds() Mengembalikan wilayah pembatas masker.

Contoh

Mendapatkan rect mask tampilan

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
}

Metode Publik

FromResourcesRect

public static DisplayMask FromResourcesRect(Context context)

Membuat masker tampilan sesuai dengan config_mainBuiltInDisplayMaskRect.

Parameter

ContextKonteks

Konteks untuk aktivitas saat ini.

Mengembalikan

DisplayMask

Masker tampilan baru.

FromResourcesRectApproximation

public static DisplayMask FromResourcesRectApproximation(Context context)

Membuat masker tampilan sesuai dengan config_mainBuiltInDisplayMaskRectApproximation, yang merupakan perkiraan masker dasar persegi panjang terdekat.

Parameter

ContextKonteks

Konteks untuk aktivitas saat ini.

Mengembalikan

DisplayMask

Masker tampilan baru.

GetBoundingRects

public List<Rect> GetBoundingRects()

Mengembalikan daftar Rects, yang masing-masing adalah persegi panjang pembatas untuk area non-fungsional pada tampilan.

Mengembalikan

List<Rect>

Daftar batas Rect, satu untuk setiap area masker tampilan.

GetBoundingRectsForRotation

public List<Rect> GetBoundingRectsForRotation(SurfaceOrientation rotation)

Mengembalikan daftar Rects sehubungan dengan rotasi, yang masing-masing adalah persegi panjang pembatas untuk area non-fungsional pada tampilan.

Parameter

SurfaceOrientationRotasi

Masker rotasi harus diputar. Nilai yang mungkin adalah SurfaceOrientation.Rotation0, SurfaceOrientation.Rotation90, SurfaceOrientation.Rotation180, SurfaceOrientation.Rotation270.

Mengembalikan

List<Rect>

Daftar batas Rect, satu untuk setiap area masker tampilan.

GetBounds

public Region GetBounds()

Mengembalikan wilayah pembatas masker.

Mungkin ada lebih dari satu masker, dalam hal ini yang dikembalikan Region akan tidak bersebelahan dan rect pembatasnya tidak akan berarti tanpa berpotongan terlebih dahulu.

Mengembalikan

Region

Wilayah pembatas masker. Koordinat relatif terhadap sudut kiri atas tampilan konten dan dalam unit piksel.