تصویر در تصویر

ویژگی تصویر در تصویر (PIP) برای دستگاه‌های اندرویدی دستی به کاربران این امکان را می‌دهد که اندازه برنامه‌ای را با یک فعالیت مداوم در یک پنجره کوچک تغییر دهند. PIP مخصوصاً برای برنامه‌های ویدیویی مفید است زیرا در حالی که کاربر برای انجام سایر اقدامات آزاد است، محتوا به پخش ادامه می‌دهد. کاربران می توانند موقعیت این پنجره را از طریق SystemUI دستکاری کنند و با برنامه ای که در حال حاضر در تصویر در تصویر است با (حداکثر سه) عملکرد ارائه شده توسط برنامه تعامل داشته باشند.

PIP نیاز به انتخاب صریح از برنامه هایی دارد که از آن پشتیبانی می کنند و بر اساس هر فعالیت کار می کند. (یک برنامه منفرد می‌تواند چندین فعالیت داشته باشد که فقط یکی از آنها در PIP است.) Activities با فراخوانی enterPictureInPictureMode() درخواست وارد کردن تصویر در تصویر را می‌دهند و پاسخ‌های تماس فعالیت را به شکل onPictureInPictureModeChanged() دریافت می‌کنند.

متد setPictureInPictureParams() به فعالیت‌ها اجازه می‌دهد نسبت ابعاد خود را در PIP و اکشن‌های سفارشی کنترل کنند، که به کاربران اجازه می‌دهد بدون نیاز به گسترش آن با فعالیت تعامل داشته باشند. در PIP، فعالیت در حالت مکث است، اما رندر، حالت است و مستقیما ورودی لمسی یا فوکوس پنجره را دریافت نمی کند. فقط یک کار می تواند در یک زمان در PIP باشد.

اطلاعات بیشتر در مستندات تصویر در تصویر برنامه‌نویس Android موجود است.

الزامات دستگاه

برای پشتیبانی از PIP، ویژگی سیستم PackageManager#FEATURE_PICTURE_IN_PICTURE را در /android/frameworks/base/core/java/android/content/pm/PackageManager.java فعال کنید. دستگاه هایی که از PIP پشتیبانی می کنند باید صفحه نمایشی داشته باشند که در کمترین عرض آن بزرگتر از 220dp باشد. شبیه به چندپنجره ای با صفحه تقسیم شده، PIP اجازه می دهد تا چندین فعالیت همزمان روی صفحه اجرا شوند. بنابراین، دستگاه ها باید CPU و RAM کافی برای پشتیبانی از این مورد استفاده داشته باشند.

پیاده سازی

بیشتر مدیریت چرخه حیات فعالیت در سیستم بین ActivityManager و WindowManager انجام می شود. پیاده سازی رابط کاربری مرجع در بسته SystemUI است.

تغییرات در سیستم نباید بر رفتار ذاتی آن که توسط تست های مجموعه تست سازگاری (CTS) تعریف شده است، تأثیر بگذارد. منطق سیستم برای PIP عمدتاً حول مدیریت وظایف و فعالیت‌ها در پشته «پین شده» می‌چرخد. در اینجا یک مرور سریع کلاس آمده است:

  • ActivityRecord : وضعیت تصویر در تصویر هر فعالیت را ردیابی می کند. برای جلوگیری از ورود کاربران به PIP در شرایط خاص، مانند صفحه قفل یا در حین VR، موارد را به checkEnterPictureInPictureState() اضافه کنید.
  • ActivityManagerService : رابط اصلی از اکتیویتی برای درخواست وارد کردن PIP و رابط برای تماس‌های WindowManager و SystemUI برای تغییر وضعیت فعالیت PIP.
  • ActivityStackSupervisor : از ActivityManagerService فراخوانی می شود تا وظایف را به داخل یا خارج از پشته پین ​​شده منتقل کند و در صورت لزوم WindowManager به روز کند.
  • PinnedStackWindowController : رابط WindowManager از ActivityManager .
  • PinnedStackController : تغییرات سیستم را به SystemUI گزارش می‌کند، مانند IME نشان داده/مخفی، تغییر نسبت ابعاد یا تغییر عملکردها.
  • BoundsAnimationController : پنجره‌های فعالیت PIP را به گونه‌ای متحرک می‌کند که هنگام تغییر اندازه باعث تغییر پیکربندی نشود.
  • PipSnapAlgorithm : یک کلاس مشترک که هم در سیستم و هم در SystemUI استفاده می‌شود که رفتار قطع شدن پنجره PIP را در نزدیکی لبه‌های صفحه کنترل می‌کند.

مرجع SystemUI یک پیاده سازی کامل از PIP را ارائه می دهد که از ارائه اقدامات سفارشی به کاربران و دستکاری عمومی مانند گسترش و اخراج پشتیبانی می کند. تا زمانی که بر رفتارهای درونی تعریف شده توسط CDD تأثیری نگذارند، سازندگان دستگاه می توانند بر اساس این تغییرات ایجاد کنند. در اینجا یک مرور سریع کلاس آمده است:

  • PipManager : جزء SystemUI که با SystemUI شروع می شود.
  • PipTouchHandler : کنترل کننده لمسی، که حرکاتی را که PIP را دستکاری می کنند، کنترل می کند. این تنها زمانی استفاده می شود که مصرف کننده ورودی PIP فعال است (به InputConsumerController مراجعه کنید). حرکات جدید را می توان در اینجا اضافه کرد.
  • PipMotionHelper : کلاس راحتی که موقعیت PIP و منطقه مجاز را روی صفحه ردیابی می کند. برای به‌روزرسانی یا متحرک کردن موقعیت و اندازه PIP، با ActivityManagerService تماس می‌گیرد.
  • PipMenuActivityController : فعالیتی را شروع می کند که اقدامات ارائه شده توسط فعالیت در حال حاضر در PIP را نشان می دهد. این فعالیت یک فعالیت همپوشانی وظیفه است و مصرف کننده ورودی همپوشانی را حذف می کند تا امکان تعامل داشته باشد.
  • PipMenuActivity : پیاده سازی برای فعالیت منو.
  • PipMediaController : شنونده ای که SystemUI را هنگامی که جلسه رسانه به گونه ای تغییر می کند که ممکن است بر اقدامات پیش فرض PIP تغییر کند، به روز می کند.
  • PipNotificationController : کنترل کننده ای که از فعال بودن اعلان در زمانی که کاربر از ویژگی PIP استفاده می کند اطمینان حاصل می کند.
  • PipDismissViewController : پوششی که هنگام شروع تعامل با PIP به کاربران نشان داده می شود تا نشان دهد که می توان آن را رد کرد.

قرارگیری پیش فرض

منابع سیستمی مختلفی وجود دارند که قرار دادن پیش فرض PIP را کنترل می کنند:

  • config_defaultPictureInPictureGravity : عدد صحیح گرانشی که گوشه ای را برای قرار دادن PIP کنترل می کند، مانند BOTTOM|RIGHT .
  • config_defaultPictureInPictureScreenEdgeInsets : انحرافات از طرفین صفحه برای قرار دادن PIP.
  • config_pictureInPictureDefaultSizePercent و config_pictureInPictureDefaultAspectRatio : ترکیب درصد عرض صفحه و نسبت ابعاد اندازه PIP را کنترل می کند. اندازه PIP پیش‌فرض محاسبه‌شده نباید از @dimen/default_minimal_size_pip_resizable_task کمتر باشد، همانطور که توسط CTS و CDD تعریف شده است.
  • config_pictureInPictureSnapMode : رفتار snapping همانطور که در PipSnapAlgorithm تعریف شده است.

پیاده سازی دستگاه نباید حداقل و حداکثر نسبت ابعاد تعریف شده در CDD و CTS را تغییر دهد.

مجوزها

"عملیات برنامه" هر بسته ( OP_PICTURE_IN_PICTURE ) در AppOpsManager ( main/core/java/android/app/AppOpsManager.java )، به کاربران اجازه می دهد تا PIP را در سطح هر برنامه از طریق تنظیمات سیستم کنترل کنند. هنگامی که یک فعالیت درخواست ورود به حالت تصویر در تصویر را می دهد، پیاده سازی های دستگاه باید این بررسی را رعایت کنند.

آزمایش کردن

برای آزمایش پیاده‌سازی PIP، تمام تست‌های مربوط به تصویر در تصویر موجود در تست‌های CTS سمت میزبان را در زیر /cts/hostsidetests/services/activitymanager ، به‌ویژه در ActivityManagerPinnedStackTests.java اجرا کنید.