Xamarin.Android에서 Surface Duo의 이중 화면 정보에 액세스
참고
Xamarin.Forms 사용자는 Xamarin.Forms.DualScreen NuGet DualScreenInfo 및 TwoPaneView를 체크 아웃해야 합니다.
Xamarin.DuoSDK는 Surface Duo를 대상으로 하는 Xamarin.Android 개발자를 위한 것입니다. Surface Duo 및 기타 접이식 디바이스를 대상으로 하려면 Xamarin.AndroidX.Window에서 사용할 수 있는 Jetpack Window Manager 바인딩을 참조하세요.
힌지 센서
HingeSensor 클래스를 사용하여 OnSensorChanged 이벤트를 쉽게 수신 대기하고 업데이트된 힌지 각도 값을 가져올 수 있습니다. Microsoft.Device.Display 네임스페이스 및 HingeSensor 클래스를 사용하기 전에 애플리케이션에 DuoSDK NuGet 추가합니다.
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는 앱을 초기화하고 앱이 스패닝되었는지 확인하는 데 사용할 수 있는 ScreenHelper
클래스를 포함하고 있습니다.
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;
}
힌지 마스크의 위치에 대한 경계를 검색하려는 경우 다음과 같이 GetHingeBoundsDip()
메서드를 사용하면 됩니다.
var hingeBoundsRect = screenHelper.GetHingeBoundsDip();
디스플레이 마스크
프로젝트에서 이러한 API를 사용하려면 DuoSDK NuGet을 추가합니다.
using Microsoft.Device.Display;
메서드
정적 메서드
메서드 | 설명 |
---|---|
FromResourcesRect(Context context) | config_mainBuiltInDisplayMaskRect에 따라 표시 마스크를 만듭니다. |
FromResourcesRectApproximation(Context context) | 마스크의 가장 가까운 사각형 기준 근사치인 config_mainBuiltInDisplayMaskRectApproximation에 따라 표시 마스크를 만듭니다. |
개체 메서드
메서드 | 설명 |
---|---|
GetBoundingRects() | Rect 목록을 반환합니다. 각 항목은 디스플레이에서 작동하지 않는 영역을 나타내는 경계 사각형입니다. |
GetBoundingRectsForRotation(SurfaceOrientation rotation) | 회전과 관련된 Rect 목록을 반환합니다. 각 항목은 디스플레이에서 작동하지 않는 영역을 나타내는 경계 사각형입니다. |
GetBounds() | 마스크의 경계 영역을 반환합니다. |
예제
표시 마스크 사각형 가져오기
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 메서드
FromResourcesRect
public static DisplayMask FromResourcesRect(Context context)
config_mainBuiltInDisplayMaskRect에 따라 표시 마스크를 만듭니다.
매개 변수
Context
context
현재 작업에 대한 컨텍스트입니다.
반환
DisplayMask
새로운 표시 마스크입니다.
FromResourcesRectApproximation
public static DisplayMask FromResourcesRectApproximation(Context context)
마스크의 가장 가까운 사각형 기준 근사치인 config_mainBuiltInDisplayMaskRectApproximation에 따라 표시 마스크를 만듭니다.
매개 변수
Context
context
현재 작업에 대한 컨텍스트입니다.
반환
DisplayMask
새로운 표시 마스크입니다.
GetBoundingRects
public List<Rect> GetBoundingRects()
Rect
목록을 반환합니다. 각 항목은 디스플레이에서 작동하지 않는 영역의 경계 사각형입니다.
반환
List<Rect>
경계 Rect
목록을 반환합니다. 각 항목은 각 표시 마스크 영역을 나타냅니다.
GetBoundingRectsForRotation
public List<Rect> GetBoundingRectsForRotation(SurfaceOrientation rotation)
회전과 관련된 Rect
목록을 반환합니다. 각 항목은 디스플레이에서 작동하지 않는 영역을 나타내는 경계 사각형입니다.
매개 변수
SurfaceOrientation
rotation
회전 마스크는 회전해야 합니다. 가능한 값은 SurfaceOrientation.Rotation0
, SurfaceOrientation.Rotation90
, SurfaceOrientation.Rotation180
, SurfaceOrientation.Rotation270
입니다.
반환
List<Rect>
경계 Rect
목록을 반환합니다. 각 항목은 각 표시 마스크 영역을 나타냅니다.
GetBounds
public Region GetBounds()
마스크의 경계 영역을 반환합니다.
마스크가 여러 개 있을 수 있습니다. 이 경우 반환된 Region
은 인접하지 않으며, 경계 사각형은 영역과 먼저 교차하지 않는 이상 의미가 없습니다.
반환
Region
마스크의 경계 영역입니다. 좌표는 콘텐츠 보기의 왼쪽 위 모서리와 픽셀 단위를 기준으로 합니다.