Pencere içinde pencere

Android el cihazları için resim içinde resim (PIP) özelliği, kullanıcıların devam eden bir etkinliğe sahip bir uygulamayı küçük bir pencerede yeniden boyutlandırmasına olanak tanır. PIP özellikle video uygulamaları için kullanışlıdır çünkü kullanıcı diğer eylemleri gerçekleştirmekte özgürken içerik oynatılmaya devam eder. Kullanıcılar, SystemUI aracılığıyla bu pencerenin konumunu değiştirebilir ve uygulama tarafından sağlanan (üç adede kadar) eylemle halihazırda resim içinde resim olan uygulamayla etkileşime girebilir.

PIP, onu destekleyen uygulamalardan açıkça katılım gerektirir ve etkinlik bazında çalışır. (Tek bir uygulamanın birden fazla etkinliği olabilir ve bunlardan yalnızca biri PIP'tedir.) Etkinlikler, enterPictureInPictureMode() öğesini çağırarak resim içinde resim girmeyi ve onPictureInPictureModeChanged() biçiminde etkinlik geri çağrıları almayı talep eder.

setPictureInPictureParams() yöntemi, etkinliklerin PIP ve özel eylemlerdeyken en boy oranlarını kontrol etmesine olanak tanır; bu da kullanıcıların, etkinliği genişletmeye gerek kalmadan etkinlikle etkileşime girmesine olanak tanır. PIP'de etkinlik duraklatılmış ancak görüntü oluşturma durumundadır ve doğrudan dokunmatik girdi veya pencere odağı almaz. PIP'te aynı anda yalnızca tek bir görev bulunabilir.

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

Cihaz gereksinimleri

PIP'yi desteklemek için, /android/frameworks/base/core/java/android/content/pm/PackageManager.java dosyasında PackageManager#FEATURE_PICTURE_IN_PICTURE sistem özelliğini etkinleştirin. PIP'yi destekleyen cihazların en küçük genişliğinde 220dp'den büyük bir ekrana sahip olması gerekir. Bölünmüş ekranlı çoklu pencereye benzer şekilde PIP, birden fazla etkinliğin ekranda aynı anda çalıştırılmasına olanak tanır. Bu nedenle cihazların bu kullanım senaryosunu destekleyecek yeterli CPU ve RAM'e sahip olması gerekir.

Uygulama

Etkinlik yaşam döngüsü yönetiminin çoğu, ActivityManager ve 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 sistemin kendine özgü davranışını etkilememelidir. PIP'in sistem mantığı temel olarak "sabitlenmiş" yığın içindeki görevlerin ve etkinliklerin yönetimi etrafında döner. İşte hızlı bir sınıfa genel bakış:

  • ActivityRecord : her etkinliğin resim içinde resim durumunu izler. Kullanıcıların kilit ekranı veya VR gibi belirli durumlarda PIP'e girmesini önlemek için checkEnterPictureInPictureState() işlevine vakalar ekleyin.
  • ActivityManagerService : PIP'e girme isteği için etkinlikten gelen birincil arayüz ve PIP etkinlik durumunu değiştirmek için WindowManager ve SystemUI gelen çağrılara yönelik arayüz.
  • ActivityStackSupervisor : Görevleri sabitlenmiş yığının içine veya dışına taşımak ve WindowManager gerektiği gibi güncellemek için ActivityManagerService çağrılır.
  • PinnedStackWindowController : ActivityManager WindowManager arayüzü.
  • PinnedStackController : IME'nin gösterilmesi/gizlenmesi, en boy oranının değişmesi veya değişen eylemler gibi sistemdeki değişiklikleri SystemUI bildirir.
  • BoundsAnimationController : PIP etkinlik pencerelerini, yeniden boyutlandırma sırasında yapılandırma değişikliğini tetiklemeyecek şekilde canlandırır.
  • PipSnapAlgorithm : Hem sistemde hem de SystemUI'de kullanılan ve ekranın kenarlarına yakın PIP penceresinin yapışma davranışını kontrol eden paylaşılan bir sınıf.

Referans SystemUI kullanıcılara özel eylemler sunmayı ve genişletme ve kapatma gibi genel manipülasyonları destekleyen eksiksiz bir PIP uygulaması sağlar. Cihaz üreticileri, CDD tarafından tanımlanan içsel davranışları etkilemedikleri sürece bu değişikliklerden faydalanabilirler. İşte hızlı bir sınıfa genel bakış:

  • PipManager : SystemUI ile başlatılan SystemUI bileşeni.
  • PipTouchHandler : PIP'i yönlendiren hareketleri kontrol eden dokunma işleyicisi. Bu yalnızca PIP'in giriş tüketicisi aktifken kullanılır (bkz. InputConsumerController ). Buraya yeni hareketler eklenebilir.
  • PipMotionHelper : PIP konumunu ve izin verilen bölgeyi ekranda izleyen bir kolaylık sınıfı. PIP'in konumunu ve boyutunu güncellemek veya canlandırmak için ActivityManagerService çağrı yapar.
  • PipMenuActivityController : PIP'te mevcut olan aktivite tarafından sağlanan eylemleri gösteren bir aktivite başlatır. Bu etkinlik bir görev katmanlama etkinliğidir ve etkileşimli olmasını sağlamak için kaplama girdi tüketicisini kaldırır.
  • PipMenuActivity : menü etkinliğinin uygulanması.
  • PipMediaController : Medya oturumu PIP'deki varsayılan eylemleri etkileyebilecek şekilde değiştiğinde SystemUI güncelleyen dinleyici.
  • PipNotificationController : Kullanıcı PIP özelliğini kullanırken bildirimin aktif olmasını sağlayan denetleyici.
  • PipDismissViewController : Kullanıcılara PIP ile etkileşime girmeye başladıklarında bunun kapatılabileceğini belirtmek için gösterilen kaplama.

Varsayılan yerleşim

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

  • config_defaultPictureInPictureGravity : BOTTOM|RIGHT gibi PIP'in yerleştirileceği köşeyi kontrol eden yer çekimi tamsayısıdır.
  • config_defaultPictureInPictureScreenEdgeInsets : PIP'i yerleştirmek için ekranın kenarlarından uzaklıklar.
  • config_pictureInPictureDefaultSizePercent ve config_pictureInPictureDefaultAspectRatio : ekran genişliği 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ığı şekliyle @dimen/default_minimal_size_pip_resizable_task değerinden küçük olmamalıdır.
  • config_pictureInPictureSnapMode : PipSnapAlgorithm tanımlandığı şekliyle yapışma davranışı.

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

İzinler

AppOpsManager ( 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 PIP'yi uygulama başına düzeyde kontrol etmesine olanak tanır. Bir etkinlik resim içinde resim moduna girmeyi talep ettiğinde cihaz uygulamalarının bu denetime uyması gerekir.

Test yapmak

PIP uygulamalarını test etmek için, /cts/hostsidetests/services/activitymanager altında, özellikle ActivityManagerPinnedStackTests.java altında ana bilgisayar tarafı CTS testlerinde bulunan resim içinde resim ile ilgili tüm testleri çalıştırın.