다음을 통해 공유


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에 따라 표시 마스크를 만듭니다.

매개 변수

Contextcontext

현재 작업에 대한 컨텍스트입니다.

반환

DisplayMask

새로운 표시 마스크입니다.

FromResourcesRectApproximation

public static DisplayMask FromResourcesRectApproximation(Context context)

마스크의 가장 가까운 사각형 기준 근사치인 config_mainBuiltInDisplayMaskRectApproximation에 따라 표시 마스크를 만듭니다.

매개 변수

Contextcontext

현재 작업에 대한 컨텍스트입니다.

반환

DisplayMask

새로운 표시 마스크입니다.

GetBoundingRects

public List<Rect> GetBoundingRects()

Rect 목록을 반환합니다. 각 항목은 디스플레이에서 작동하지 않는 영역의 경계 사각형입니다.

반환

List<Rect>

경계 Rect 목록을 반환합니다. 각 항목은 각 표시 마스크 영역을 나타냅니다.

GetBoundingRectsForRotation

public List<Rect> GetBoundingRectsForRotation(SurfaceOrientation rotation)

회전과 관련된 Rect 목록을 반환합니다. 각 항목은 디스플레이에서 작동하지 않는 영역을 나타내는 경계 사각형입니다.

매개 변수

SurfaceOrientationrotation

회전 마스크는 회전해야 합니다. 가능한 값은 SurfaceOrientation.Rotation0, SurfaceOrientation.Rotation90, SurfaceOrientation.Rotation180, SurfaceOrientation.Rotation270입니다.

반환

List<Rect>

경계 Rect 목록을 반환합니다. 각 항목은 각 표시 마스크 영역을 나타냅니다.

GetBounds

public Region GetBounds()

마스크의 경계 영역을 반환합니다.

마스크가 여러 개 있을 수 있습니다. 이 경우 반환된 Region은 인접하지 않으며, 경계 사각형은 영역과 먼저 교차하지 않는 이상 의미가 없습니다.

반환

Region

마스크의 경계 영역입니다. 좌표는 콘텐츠 보기의 왼쪽 위 모서리와 픽셀 단위를 기준으로 합니다.