다음을 통해 공유


Jetpack Window Manager for Xamarin

Xamarin.Forms 사용자는 Surface Duo 지원을 DualScreenInfoTwoPaneView 위해 Xamarin.Forms.DualScreen NuGet 참조해야 합니다.

Jetpack Window Manager는 Xamarin으로 작업하는 개발자를 위한 것입니다. 프로젝트 Android.

Jetpack Window Manager는 모든 폴더블 디바이스를 사용하기 위한 표준 API를 제공합니다. 여기에는 두 가지 중요한 클래스가 포함되어 있습니다.

  • DisplayFeature - 힌지 또는 접힌 부분과 같은 연속 평면 화면 표면의 중단을 식별합니다. Windows Manager는 레이아웃 변경 콜백에서 디스플레이 기능 컬렉션을 반환합니다.
  • FoldingFeature - 디바이스의 특정 기능에 대한 정보를 제공합니다. Surface Duo에는 폴딩 기능이 하나만 있지만 다른 디바이스에는 더 많은 기능이 있을 수 있습니다. 클래스는 FoldingFeature 디바이스의 해당 부분의 상태에 대한 정보를 제공하며, 속성 BoundsIsSeparating및 메서드에 대한 및 메서드를 OcclusionTypeOrientationState제공합니다.

Jetpack Window Manager를 사용하는 샘플은 surface-duo-sdk-xamarin-samples 리포지토리에서 사용할 수 있습니다.

참고

Xamarin.AndroidX.Window.WindowJava NuGet Xamarin.DuoSDK NuGet Xamarin.Android 앱에 추가해야 하는 필요성을 대체하기 위한 것입니다.

클래스를 ScreenHelper 사용하여 확인하거나 GetHingeBoundsDip()결정하는 IsDualMode 대신, 클래스의 메서드와 속성을 WindowInfoTracker 직접 사용할 수 있습니다.

코드에서 사용 WindowInfoTracker 하려면 아래 지침을 따릅니다(Xamarin.Android Window Manager 샘플 앱:

종속성 추가

Jetpack Window Manager 기능을 제공하는 NuGet 추가하려면 다음을 수행합니다.

  1. Xamarin을 마우스 오른쪽 단추로 클릭합니다. 프로젝트를 Android NuGet 패키지 관리를 선택합니다.

  2. Xamarin.AndroidX.Window.WindowJava를 검색합니다.

  3. 프로젝트에 추가할 가장 높은 버전 번호를 선택합니다(1.0.0.7 은 API의 첫 번째 안정적인 버전입니다).

코드에서 Jetpack Window Manager 사용

  1. MainActivity 클래스에서 창 정보 추적기 변수를 선언합니다.

    public class MainActivity : AppCompatActivity, IConsumer
    {
        WindowInfoTrackerCallbackAdapter wit;
    

    올바른 using AndroidX.Window.Layout; 문과 using AndroidX.Window.Java.Layout; 문이 파일 맨 위에 추가되었는지 확인합니다.

    참고

    또한 이 작업은 구현되며 IConsumer, 이 인터페이스에 필요한 메서드에 대한 코드는 아래 4단계를 Accept 참조하세요.

  2. 활동의 OnCreate에서 Window Manager를 초기화합니다.

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            wit = new WindowInfoTrackerCallbackAdapter(WindowInfoTracker.Companion.GetOrCreate(this));
    
  3. 이제 구현을 반환하는 함수를 IExecutor 만들어 콜백에 첫 번째 매개 변수로 제공하고 이를 사용하여 호출합니다. UI 스레드에서 실행되는 항목을 만들려고 하는데, 필요한 경우 UI 스레드에서 실행되지 않는 다른 항목을 만들 수 있습니다.

    IExecutor runOnUiThreadExecutor()
    {
        return new MyExecutor();
    }
    class MyExecutor : Java.Lang.Object, IExecutor
    {
        Handler handler = new Handler(Looper.MainLooper);
        public void Execute(IRunnable r)
        {
            handler.Post(r);
        }
    }
    
  4. 레이아웃을 변경해야 할 때 콜백을 처리할 내부 클래스를 정의합니다. 이 메소드가 표시된 텍스트를 업데이트할 수 있도록 활동에는 layoutChange라는 TextView가 있어야 합니다.

    public void Accept(Java.Lang.Object newLayoutInfo)  // Object will be WindowLayoutInfo
    {
        var newLayoutInfo = (newLayoutInfo as WindowLayoutInfo); // have to cast before use
    
        layoutChange.Text = newLayoutInfo.ToString();
    
        configurationChanged.Text = "One logic/physical display - unspanned";
    
        foreach (var displayFeature in newLayoutInfo.DisplayFeatures)
        {
            var foldingFeature = displayFeature.JavaCast<IFoldingFeature>();
    
            if (foldingFeature != null)
            {
                alignViewToDeviceFeatureBoundaries(newLayoutInfo);
    
                if (foldingFeature.GetOcclusionType() == FoldingFeatureOcclusionType.None)
                {
                    configurationChanged.Text = "App is spanned across a fold";
                }
                if (foldingFeature.GetOcclusionType() == FoldingFeatureOcclusionType.Full)
                {
                    configurationChanged.Text = "App is spanned across a hinge";
                }
                configurationChanged.Text += "\nIsSeparating: " + foldingFeature.IsSeparating
                        + "\nOrientation: " + foldingFeature.Orientation  // FoldingFeatureOrientation.Vertical or Horizontal
                        + "\nState: " + foldingFeature.State; // FoldingFeatureState.Flat or State.HalfOpened
            }
            else
            {
                Log.Info(TAG, "DisplayFeature is not a fold/hinge");
            }
        }
    }
    

    참고

    WindowLayoutInfo 클래스에는 DisplayFeature 항목 컬렉션이 있으며, 그중 하나 이상은 FoldingFeature의 인스턴스일 수 있습니다. 접기 기능 인스턴스에는 Bounds속성 및 IsSeparating메서드가 있으며OcclusionTypeState, Orientation쿼리하여 새 상태에 대한 레이아웃을 조정하는 방법을 결정할 수 있습니다.

  5. 재정의 OnStart 에서 처리기를 등록 AddWindowLayoutInfoListener 하고 실행기와 활동에 대한 참조를 전달합니다 IConsumer(구현하기 때문).

    protected override void OnStart()
    {
        base.OnStart();
        wit.AddWindowLayoutInfoListener(this, runOnUiThreadExecutor(), this);
        // first `this` is the Activity context, second `this` is the IConsumer implementation
    }
    
  6. 수신기를 제거해야 합니다.

    protected override void OnStop()
    {
        base.OnStop();
        wit.RemoveWindowLayoutInfoListener(this);
    }
    
  7. 이 코드가 실행되면 현재 디바이스 상태와 표시 기능으로 활동이 업데이트됩니다(접힌 부분 또는 힌지에 걸쳐 있는 경우). 콜백에 추가 코드를 추가하여 FoldingFeature 개체에서 추가 정보를 확인합니다.

샘플

Window Manager 샘플은 다음 스크린샷과 같이 화면에 디바이스 정보를 표시합니다.

Surface Duo showing Window Manager sample running, and showing device info on the screen

리소스