ویژگی تصویردرتصویر (PIP) برای دستگاههای دستی Android به کاربران امکان میدهد اندازه برنامه دارای فعالیت جاری را به پنجرهای کوچک تغییر دهند. «تصویردرتصویر» بهویژه برای برنامههای ویدیویی مفید است زیرا محتوا همچنان پخش میشود و کاربر میتواند اقدامات دیگری انجام دهد. کاربران میتوانند موقعیت این پنجره را ازطریق SystemUI دستکاری کنند و با برنامه درحال اجرا در حالت «تصویردرتصویر» با (حداکثر سه) کنش ارائهشده توسط برنامه تعامل داشته باشند.
PIP به موافقت صریح برنامههایی که از آن پشتیبانی میکنند نیاز دارد و براساس هر فعالیت کار میکند. (یک برنامه میتواند چندین فعالیت داشته باشد که فقط یکی از آنها در حالت «تصویردرتصویر» است.) فعالیتها با فراخوانی enterPictureInPictureMode() برای ورود به حالت تصویردرتصویر درخواست میکنند و
کاربردهای فعالیت را در قالب onPictureInPictureModeChanged() دریافت میکنند.
روش setPictureInPictureParams() به فعالیتها امکان میدهد نسبت ابعادی خود را درحین قرار داشتن در حالت «تصویر در تصویر» و کنشهای سفارشی کنترل کنند، که به کاربران اجازه میدهد بدون نیاز به گسترش دادن فعالیت، با آن تعامل داشته باشند. در «تصویردرتصویر»، فعالیت در حالت موقتاً متوقفشده،
اما درحال پردازش است و مستقیماً ورودی لمسی یا تمرکز پنجره را دریافت نمیکند.
هربار فقط یک تکلیف میتواند در حالت «تصویر در تصویر» باشد.
اطلاعات بیشتر در سند تصویردرتصویر «توسعهدهنده Android» دردسترس است.
پیشنیازهای دستگاه
برای پشتیبانی از «تصویردرتصویر»، ویژگی سیستم
PackageManager#FEATURE_PICTURE_IN_PICTURE را در
/android/frameworks/base/core/java/android/content/pm/PackageManager.java فعال کنید.
دستگاههایی که از PIP پشتیبانی میکنند باید صفحهنمایشی داشته باشند که در کوچکترین عرض خود بزرگتر از ۲۲۰dp باشد. مشابه با چندپنجرهای دونیمه، «تصویردرتصویر» به چندین فعالیت اجازه میدهد بهطور همزمان روی صفحه اجرا شوند. بنابراین، دستگاهها باید
واحد پردازش مرکزی و حافظه دسترسی تصادفی کافی برای پشتیبانی از این مورد استفاده داشته باشند.
پیادهسازی
بیشتر مدیریت چرخه حیات فعالیت بین ActivityManager و WindowManager در سیستم انجام میشود.
پیادهسازی واسط کاربر مرجع در SystemUI
بسته است.
اصلاحات سیستم نباید بر رفتار ذاتی آن که توسط آزمایشهای مجموعه آزمایش سازگاری (CTS) تعریف شده است تأثیر بگذارد. منطق سیستم برای «تصویردرتصویر» عمدتاً حول مدیریت وظایف و فعالیتها در پشته «سنجاقشده» میچرخد. در اینجا نمای کلی کوتاهی از کلاس ارائه شده است:
ActivityRecord: وضعیت تصویردرتصویر هر فعالیت را پیگیری میکند. برای جلوگیری از ورود کاربران به «تصویردرتصویر» در شرایط خاص، مثل از صفحه قفل یا درطول واقعیت مجازی، مواردی را بهcheckEnterPictureInPictureState()اضافه کنید.ActivityManagerService: رابط اصلی از فعالیت برای درخواست ورود به «تصویردرتصویر» و رابط تماسها ازWindowManagerوSystemUIبرای تغییر وضعیت فعالیت «تصویردرتصویر».ActivityStackSupervisor: ازActivityManagerServiceفراخوانی میشود تا تکالیف را به پشته سنجاقشده منتقل کند یا از آن خارج کند، وWindowManagerرا درصورت لزوم بهروزرسانی کند.PinnedStackWindowController: میاناWindowManagerازActivityManager.PinnedStackController: تغییرات سیستم را بهSystemUIگزارش میکند، مثلاً نمایش/پنهان شدن IME، تغییر نسبت ابعادی، یا تغییر کنشها.BoundsAnimationController: پنجرههای فعالیت «تصویردرتصویر» را بهگونهای پویانمایی میکند که هنگام تغییر اندازه، تغییر پیکربندی را راهاندازی نمیکند.PipSnapAlgorithm: کلاس مشترکی که هم در سیستم و هم در SystemUI استفاده میشود و رفتار چسبیدن پنجره «تصویردرتصویر» را در نزدیکی لبههای صفحهنمایش کنترل میکند.
مرجع SystemUI
پیادهسازی کاملی از PIP ارائه میدهد که از ارائه کنشهای سفارشی به کاربران و دستکاریهای عمومی، مانند ازهم بازکردن و بستن، پشتیبانی میکند.
سازندگان دستگاه میتوانند این تغییرات را توسعه دهند، بهشرطی که بر رفتارهای ذاتی تعریفشده در CDD تأثیر نگذارد. در اینجا نمای کلی سریعی از کلاس آورده شده است:
PipManager: مؤلفهSystemUIکه باSystemUIشروع میشود.PipTouchHandler: کنترلکننده لمسی، که اشارههایی را که PIP را دستکاری میکنند کنترل میکند. این فقط زمانی استفاده میشود که مصرفکننده ورودی برای «تصویردرتصویر» فعال باشد (بهInputConsumerControllerمراجعه کنید). ژستهای جدید را میتوان در اینجا اضافه کرد.PipMotionHelper: کلاس راحتی که موقعیت «تصویردرتصویر» و ناحیه مجاز روی صفحه را ردیابی میکند. فراخوانیها بهActivityManagerServiceبرای بهروزرسانی یا پویانمایی موقعیت و اندازه «تصویر در تصویر».PipMenuActivityController: فعالیتی را شروع میکند که کنشهای ارائهشده توسط فعالیتی را که درحالحاضر در PIP است نشان میدهد. این فعالیت فعالیت رونهاد تکلیف است و مصرفکننده ورودی رونهاد را برمیدارد تا تعاملی شود.PipMenuActivity: پیادهسازی برای فعالیت منو.PipMediaController: شنوندهای که وقتی جلسه رسانه بهگونهای تغییر میکند که ممکن است بر کنشهای پیشفرض در PIP تأثیر بگذارد،SystemUIبهروزرسانی میشود.PipNotificationController: کنترلکنندهای که اطمینان میدهد وقتی کاربر از ویژگی «تصویر در تصویر» استفاده میکند، اعلان فعال است.PipDismissViewController: رونهادی که وقتی کاربران تعامل با «تصویر در تصویر» را شروع میکنند به آنها نشان داده میشود تا نشان دهد که میتوان آن را بست.
جایگاه پیشفرض
منابع سیستم مختلفی وجود دارد که جای پیشفرض «تصویر در تصویر» را کنترل میکند:
config_defaultPictureInPictureGravity: عدد صحیح جاذبه که گوشه محل قرارگیری «تصویردرتصویر» را کنترل میکند، مثلاًBOTTOM|RIGHT.config_defaultPictureInPictureScreenEdgeInsets: فاصله از کنارههای صفحهنمایش برای قرار دادن PIP.config_pictureInPictureDefaultSizePercentوconfig_pictureInPictureDefaultAspectRatio: ترکیب درصد عرض صفحهنمایش و نسبت ابعادی، اندازه «تصویر در تصویر» را کنترل میکند. اندازه پیشفرض محاسبهشده «تصویردرتصویر» نباید کوچکتر از@dimen/default_minimal_size_pip_resizable_taskباشد، همانطور که در CTS و CDD تعریف شده است.config_pictureInPictureSnapMode: رفتار چسباندن همانگونه که درPipSnapAlgorithmتعریف شده است.
پیادهسازیهای دستگاه نباید حداقل و حداکثر نسبتهای ابعادی را که در CDD و CTS تعریف شدهاند تغییر دهند.
اجازهها
«عملکرد برنامه» (OP_PICTURE_IN_PICTURE) در AppOpsManager (main/core/java/android/app/AppOpsManager.java) برای هر بسته به کاربران اجازه میدهد «تصویر در تصویر» را در سطح هر برنامه ازطریق تنظیمات سیستم کنترل کنند.
پیادهسازیهای دستگاه باید هنگام درخواست فعالیت برای ورود به حالت تصویردرتصویر، این بررسی را رعایت کنند.
آزمایش
برای آزمایش پیادهسازیهای PIP، همه آزمایشهای مربوط به تصویردرتصویر را که در
آزمایشهای CTS سمت میزبان در /cts/hostsidetests/services/activitymanager،
بهویژه در ActivityManagerPinnedStackTests.java، وجود دارد اجرا کنید.