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çincheckEnterPictureInPictureState()
'ya durumlar ekleyin.ActivityManagerService
: Etkinlikten PIP'e girme isteğinde bulunmak için kullanılan birincil arayüz veWindowManager
ileSystemUI
'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çinActivityManagerService
'dan çağrılır veWindowManager
gerektiği gibi güncellenir.PinnedStackWindowController
:ActivityManager
'dekiWindowManager
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şiklikleriSystemUI
'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ılanSystemUI
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çinActivityManagerService
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ğindeSystemUI
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
veconfig_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.