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.
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}");
}
public bool IsDeviceSurfaceDuo(Context context, string feature = "com.microsoft.device.display.displaymask")
=> context?.PackageManager?.HasSystemFeature(feature) ?? false;
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();
Tambahkan DuoSDK NuGet untuk menggunakan API ini di proyek Anda.
using Microsoft.Device.Display;
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 | 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. |
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
}
public static DisplayMask FromResourcesRect(Context context)
Membuat masker tampilan sesuai dengan config_mainBuiltInDisplayMaskRect.
Parameter
Context
Konteks
Konteks untuk aktivitas saat ini.
Mengembalikan
DisplayMask
Masker tampilan baru.
public static DisplayMask FromResourcesRectApproximation(Context context)
Membuat masker tampilan sesuai dengan config_mainBuiltInDisplayMaskRectApproximation, yang merupakan perkiraan masker dasar persegi panjang terdekat.
Parameter
Context
Konteks
Konteks untuk aktivitas saat ini.
Mengembalikan
DisplayMask
Masker tampilan baru.
public List<Rect> GetBoundingRects()
Mengembalikan daftar Rect
s, 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.
public List<Rect> GetBoundingRectsForRotation(SurfaceOrientation rotation)
Mengembalikan daftar Rect
s sehubungan dengan rotasi, yang masing-masing adalah persegi panjang pembatas untuk area non-fungsional pada tampilan.
Parameter
SurfaceOrientation
Rotasi
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.
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.