Bagikan melalui


Jetpack Window Manager untuk Xamarin

Tip

Pengguna Xamarin.Forms harus mereferensikan dukungan Xamarin.Forms.DualScreen NuGet for Surface Duo, dengan DualScreenInfo kelas dan TwoPaneView .

Jetpack Window Manager ditujukan untuk pengembang yang bekerja dengan proyek Xamarin.Android.

Jetpack Window Manager menyediakan API standar untuk bekerja dengan semua perangkat yang dapat dilipat. Ini berisi dua kelas penting:

  • DisplayFeature - Mengidentifikasi gangguan di permukaan layar datar berkelanjutan seperti engsel atau lipatan. Window Manager akan mengembalikan kumpulan fitur tampilan dari panggilan balik perubahan tata letak.
  • FoldingFeature - Menyediakan informasi tentang fitur perangkat tertentu - sementara Surface Duo hanya memiliki satu fitur lipatan, ada kemungkinan perangkat lain mungkin memiliki lebih banyak. Kelas menyediakan FoldingFeature informasi tentang status bagian perangkat tersebut, dengan properti untuk Bounds dan IsSeparating, dan metode untuk OcclusionType, Orientation, dan State.

Sampel yang menggunakan Jetpack Window Manager tersedia di repositori surface-duo-sdk-xamarin-samples.

Catatan

Xamarin.AndroidX.Window.WindowJava NuGet dimaksudkan untuk menggantikan kebutuhan untuk menambahkan Xamarin.DuoSDK NuGet ke aplikasi Xamarin.Android.

Alih-alih menggunakan ScreenHelper kelas untuk menentukan IsDualMode atau ke GetHingeBoundsDip(), Anda dapat menggunakan metode dan properti pada WindowInfoTracker dan kelas terkait secara langsung.

Untuk menggunakan WindowInfoTracker kode Anda, ikuti petunjuk di bawah ini (dari aplikasi sampel Xamarin.Android Window Manager):

Menambahkan dependensi

Untuk menambahkan NuGet yang menyediakan fitur Jetpack Window Manager:

  1. Klik kanan pada proyek Xamarin.Android Anda dan pilih Kelola Paket NuGet...

  2. Cari Xamarin.AndroidX.Window.WindowJava.

  3. Pilih nomor versi tertinggi untuk ditambahkan ke proyek Anda (1.0.0.7 adalah versi stabil pertama dari API).

Menggunakan Jetpack Window Manager dalam kode Anda

  1. Di kelas MainActivity , deklarasikan variabel untuk pelacak informasi jendela:

    public class MainActivity : AppCompatActivity, IConsumer
    {
        WindowInfoTrackerCallbackAdapter wit;
    

    Pastikan bahwa pernyataan dan using AndroidX.Window.Java.Layout; yang benar using AndroidX.Window.Layout; ditambahkan ke bagian atas file.

    Catatan

    Aktivitas juga mengimplementasikan IConsumer, lihat langkah 4 di bawah ini untuk kode untuk metode yang Accept diperlukan oleh antarmuka ini.

  2. Inisialisasi manajer jendela di aktivitas OnCreateAnda:

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            wit = new WindowInfoTrackerCallbackAdapter(WindowInfoTracker.Companion.GetOrCreate(this));
    
  3. Sekarang buat fungsi yang mengembalikan IExecutor implementasi sehingga kami menyediakannya ke panggilan balik sebagai parameter pertama dan akan dipanggil menggunakannya. Kita akan membuat yang berjalan pada utas UI, Anda dapat membuat yang berbeda yang tidak berjalan pada utas UI jika diperlukan.

    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. Tentukan kelas dalam untuk menangani panggilan balik saat tata letak perlu berubah. Aktivitas harus memiliki TextView yang dipanggil layoutChange sehingga metode ini dapat memperbarui teks yang ditampilkan:

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

    Catatan

    Kelas WindowLayoutInfo memiliki koleksi DisplayFeature item, satu atau beberapa di antaranya bisa menjadi instans FoldingFeature. Instans fitur lipatan memiliki properti untuk Boundsdan IsSeparating, dan metode untuk OcclusionType, Orientation, dan State yang dapat Anda kueri untuk membuat keputusan tentang cara menyesuaikan tata letak Anda untuk status baru.

  5. OnStart Dalam penimpaan, daftarkan AddWindowLayoutInfoListener handler dan teruskan pelaksana IConsumerdan referensi ke aktivitas (karena mengimplementasikan ).

    protected override void OnStart()
    {
        base.OnStart();
        wit.AddWindowLayoutInfoListener(this, runOnUiThreadExecutor(), this);
        // first `this` is the Activity context, second `this` is the IConsumer implementation
    }
    
  6. Ingatlah untuk menghapus pendengar:

    protected override void OnStop()
    {
        base.OnStop();
        wit.RemoveWindowLayoutInfoListener(this);
    }
    
  7. Ketika kode ini dijalankan, aktivitas akan diperbarui dengan postur perangkat saat ini dan fitur tampilan (jika membentur di lipatan atau engsel). Tambahkan kode tambahan ke panggilan balik untuk memeriksa informasi tambahan dalam FoldingFeature objek.

Sampel

Sampel Window Manager memperlihatkan informasi perangkat di layar seperti yang ditunjukkan pada cuplikan layar ini:

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

Sumber