Pencere içinde pencere

Android el cihazlarındaki pencere içinde pencere (PIP) özelliği, kullanıcıların devam eden etkinliğe sahip bir uygulamayı küçük bir pencereye yeniden boyutlandırmasına olanak tanır. İçerik oynatılmaya devam ederken kullanıcının diğer işlemleri yapmasına olanak tanıdığı için PiP, özellikle video uygulamalarında kullanışlıdır. Kullanıcılar, SystemUI aracılığıyla bu pencerenin konumunu değiştirebilir ve şu anda pencere içinde pencere modunda olan uygulamayla (en fazla üç) uygulama tarafından sağlanan işlemle etkileşimde bulunabilir.

PIP, destekleyen uygulamalarda açıkça etkinleştirilmelidir ve etkinlik bazında çalışır. (Tek bir uygulamada birden fazla etkinlik olabilir. Bunlardan yalnızca biri PIP modundadır.) Etkinlikler, enterPictureInPictureMode() işlevini çağırarak pencere içinde pencere moduna girmeyi ister ve onPictureInPictureModeChanged() biçiminde etkinlik geri çağırmaları alır.

setPictureInPictureParams() yöntemi, etkinliklerin PIP ve özel işlemler sırasında en boy oranlarını kontrol etmesine olanak tanır. Bu sayede kullanıcılar, etkinliği genişletmek zorunda kalmadan etkileşimde bulunabilir. PIP'de etkinlik duraklatılmış ancak oluşturuluyor durumundadır ve doğrudan dokunma girişi veya pencere odağı almaz. Aynı anda yalnızca tek bir görev PIP modunda olabilir.

Daha fazla bilgiyi Android Geliştirici Resim İçinde Resim belgelerinde bulabilirsiniz.

Cihaz gereksinimleri

PIP'yi desteklemek için /android/frameworks/base/core/java/android/content/pm/PackageManager.java bölümünde PackageManager#FEATURE_PICTURE_IN_PICTURE sistem özelliğini etkinleştirin. PIP'yi destekleyen cihazların en küçük genişliği 220 dp'den büyük olmalıdır. Bölünmüş ekran çoklu pencereye benzer şekilde PIP, ekranda aynı anda birden fazla etkinliğin çalışmasına olanak tanır. Bu nedenle, cihazlarda bu kullanım alanını destekleyecek kadar CPU ve RAM olmalıdır.

Uygulama

Etkinlik yaşam döngüsü yönetiminin çoğu, ActivityManager ile WindowManager arasındaki sistemde yapılır. Referans kullanıcı arayüzü uygulaması SystemUI paketindedir.

Sistemde yapılan değişiklikler, Uyumluluk Test Paketi (CTS) testleri tarafından tanımlanan temel davranışını etkilememelidir. PIP'nin sistem mantığı temel olarak "sabitlenmiş" yığındaki görev ve etkinliklerin yönetimiyle ilgilidir. Kısa bir sınıf genel bakışı:

  • ActivityRecord: Her etkinliğin resim içinde resim durumunu izler. Kullanıcıların belirli durumlarda (ör. kilit ekranından veya VR sırasında) PIP'ye girmesini önlemek için checkEnterPictureInPictureState()'ya durumlar ekleyin.
  • ActivityManagerService: Etkinlikten PIP'e girme isteğinde bulunmak için kullanılan birincil arayüz ve WindowManager ile SystemUI'den gelen aramalar için PIP etkinliği durumunu değiştirmeye yönelik arayüz.
  • ActivityStackSupervisor: Sabitlenmiş yığındaki görevleri taşımak için ActivityManagerService'dan çağrılır ve WindowManager gerektiği gibi güncellenir.
  • PinnedStackWindowController: ActivityManager'deki WindowManager arayüzü.
  • PinnedStackController: IME'nin gösterilmesi/gizlenmesi, en-boy oranının değiştirilmesi veya işlemlerin değiştirilmesi gibi sistemdeki değişiklikleri SystemUI'e bildirir.
  • BoundsAnimationController: Yeniden boyutlandırma sırasında yapılandırma değişikliğini tetiklemeyecek şekilde PIP etkinlik pencerelerini animasyonlu hale getirir.
  • PipSnapAlgorithm: Hem sistemde hem de SystemUI'de kullanılan, PIP penceresinin ekran kenarlarına yakın yerlerdeki tutturma davranışını kontrol eden paylaşılan bir sınıf.

Referans SystemUI PIP'nin, kullanıcılara özel işlemler sunmayı ve genişletme ile kapatma gibi genel işlemleri destekleyen eksiksiz bir uygulamasını sağlar. Cihaz üreticiler, CDD'de tanımlanan temel davranışları etkilemediği sürece bu değişiklikleri temel alabilir. Kısa bir sınıf genel bakışı:

  • PipManager: SystemUI ile başlatılan SystemUI bileşeni.
  • PipTouchHandler: PIP'yi değiştiren hareketleri kontrol eden dokunma işleyicisi. Bu yalnızca PIP için giriş tüketicisi etkin durumdayken kullanılır (InputConsumerController bölümüne bakın). Yeni hareketler buraya eklenebilir.
  • PipMotionHelper: PIP konumunu ve ekrandaki izin verilen bölgeyi izleyen bir kolaylık sınıfı. PIP'nin konumunu ve boyutunu güncellemek veya animasyon eklemek için ActivityManagerService simgesine dokunun.
  • PipMenuActivityController: PIP'de bulunan etkinliğin sağladığı işlemleri gösteren bir etkinlik başlatır. Bu etkinlik, görev yer paylaşımı etkinliğidir ve etkileşimli olmasına izin vermek için yer paylaşımı giriş tüketicisini kaldırır.
  • PipMenuActivity: Menü etkinliği için uygulama.
  • PipMediaController: Medya oturumu, PIP'deki varsayılan işlemleri etkileyebilecek şekilde değiştiğinde SystemUI değerini güncelleyen dinleyici.
  • PipNotificationController: Kullanıcı PIP özelliğini kullanırken bildirimin etkin olmasını sağlayan denetleyici.
  • PipDismissViewController: Kullanıcılar PIP ile etkileşime başladığında PIP'nin kapatılabileceğini belirtmek için gösterilen yer paylaşımı.

Varsayılan yerleşim

PIP'nin varsayılan yerleşimini kontrol eden çeşitli sistem kaynakları vardır:

  • config_defaultPictureInPictureGravity: PIP'nin yerleştirileceği köşeyi kontrol eden gravity tam sayısı (ör. BOTTOM|RIGHT).
  • config_defaultPictureInPictureScreenEdgeInsets: PIP'nin yerleştirileceği ekran kenarlarından olan uzaklıklar.
  • config_pictureInPictureDefaultSizePercent ve config_pictureInPictureDefaultAspectRatio: Ekran genişliğinin yüzdesi ile en boy oranının birleşimi, PIP'nin boyutunu kontrol eder. Hesaplanan varsayılan PIP boyutu, CTS ve CDD tarafından tanımlandığı şekilde @dimen/default_minimal_size_pip_resizable_task değerinden küçük olmamalıdır.
  • config_pictureInPictureSnapMode: PipSnapAlgorithm içinde tanımlanan tutturma davranışı.

Cihaz uygulamaları, CDD ve CTS'de tanımlanan minimum ve maksimum en-boy oranlarını değiştirmemelidir.

İzinler

AppOpsManager'deki (main/core/java/android/app/AppOpsManager.java) paket başına "uygulama işlemi" (OP_PICTURE_IN_PICTURE), kullanıcıların sistem ayarları aracılığıyla uygulama düzeyinde PIP'yi kontrol etmesine olanak tanır. Cihaz uygulamaları, bir etkinlik resim içinde resim moduna girmeyi istediğinde bu kontrolü dikkate almalıdır.

Test

PIP uygulamalarını test etmek için /cts/hostsidetests/services/activitymanager altındaki ana makine tarafı CTS testlerinde bulunan tüm resim içinde resimle ilgili testleri (özellikle ActivityManagerPinnedStackTests.java) çalıştırın.