پشتیبانی از برش‌های نمایشگر

امتحان کردن روش Compose
Jetpack Compose جعبه‌ابزار واسط کاربر توصیه‌شده برای Android است. با نحوه کار با برش‌های نمایشگر در Compose آشنا شوید.

برش نمایشگر ناحیه‌ای در برخی‌از دستگاه‌ها است که به سطح نمایشگر گسترش می‌یابد. این طراحی امکان تجربه لبه‌به‌لبه را فراهم می‌کند و درعین‌حال فضایی برای حسگرهای مهم در جلوی دستگاه ایجاد می‌کند.

Android از برش نمایشگر در دستگاه‌های دارای Android 9 (سطح ای‌پی‌آی ۲۸) و بالاتر پشتیبانی می‌کند. بااین‌حال، سازندگان دستگاه می‌توانند از برش نمایشگر در دستگاه‌های دارای Android نسخه ۸.۱ یا پایین‌تر نیز پشتیبانی کنند.

این سند نحوه پیاده‌سازی پشتیبانی از دستگاه‌های دارای بریدگی را شرح می‌دهد، ازجمله نحوه کار با ناحیه بریدگی—یعنی مستطیل لبه‌به‌لبه روی سطح نمایشگر که حاوی بریدگی است.

تصویری که نمونه‌ای از برش نمایشگر در بالا وسط را نشان می‌دهد
شکل ۱. ۱ برش نمایشگر.

انتخاب نحوه مدیریت نواحی برش‌خورده توسط برنامه

اگر نمی‌خواهید محتوایتان با ناحیه برش هم‌پوشانی داشته باشد، معمولاً کافی است مطمئن شوید که محتوایتان با نوار وضعیت و نوار پیمایش هم‌پوشانی نداشته باشد. اگر درحال رندر کردن در ناحیه بریدگی هستید، از WindowInsetsCompat.getDisplayCutout() برای بازیابی شیء DisplayCutout که حاوی حاشیه‌های امن و چارگوش احاطه‌کننده برای هر بریدگی است استفاده کنید. این میاناهای برنامه‌سازی کاربردی به شما امکان می‌دهند بررسی کنید که آیا محتوایتان با بریدگی هم‌پوشانی دارد یا نه تا درصورت نیاز بتوانید آن را جابه‌جا کنید.

همچنین می‌توانید تعیین کنید که آیا محتوا در پشت ناحیه بریدگی چیده شود یا نه. ویژگی چیدمان پنجره layoutInDisplayCutoutMode نحوه ترسیم محتوا را در ناحیه بریدگی کنترل می‌کند. می‌توانید layoutInDisplayCutoutMode را روی یکی از مقادیر زیر تنظیم کنید:

  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT: وقتی برش نمایشگر در نوار سیستم قرار داشته باشد، محتوا در ناحیه برش نمایشگر رندر می‌شود. درغیراین‌صورت، پنجره با برش نمایشگر هم‌پوشانی ندارد؛ برای مثال، محتوا ممکن است هنگام نمایش در حالت افقی، به‌صورت جعبه‌ای نمایش داده شود. اگر برنامه شما کیت توسعه نرم‌افزار ۳۵ را هدف‌یابی می‌کند، این به‌عنوان ALWAYS برای پنجره‌های غیرشناور تفسیر می‌شود.
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS: محتوا همیشه مجاز است به مناطق برش گسترش یابد. اگر برنامه شما کیت توسعه نرم‌افزار ۳۵ را هدف‌یابی می‌کند و در دستگاه Android 15 اجرا می‌شود، این تنها حالت مجاز برای پنجره‌های غیرشناور است تا نمایش لبه‌به‌لبه تضمین شود.
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES: محتوا در هر دو حالت عمودی و افقی در ناحیه برش رندر می‌شود. برای پنجره‌های شناور استفاده نکنید. اگر برنامه شما کیت توسعه نرم‌افزار ۳۵ را هدف‌یابی می‌کند، این مقدار برای پنجره‌های غیرشناور به‌صورت ALWAYS تفسیر می‌شود.
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER: محتوا هرگز در ناحیه بریدگی ارائه نمی‌شود. اگر برنامه شما کیت توسعه نرم‌افزار ۳۵ را هدف‌یابی می‌کند، این مقدار برای پنجره‌های غیرشناور به‌صورت ALWAYS تفسیر می‌شود.

می‌توانید حالت برش را به‌صورت برنامه‌نویسی یا با تنظیم سبک در فعالیتتان تنظیم کنید. مثال زیر سبکی را برای اعمال مشخصه LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES به فعالیت تعریف می‌کند.

<style name="ActivityTheme">
  <item name="android:windowLayoutInDisplayCutoutMode">
    shortEdges <!-- default, shortEdges, or never -->
  </item>
</style>

بخش‌های زیر حالت‌های مختلف برش را با جزئیات بیشتر شرح می‌دهند.

رفتار پيش‌فرض

اگر برنامه شما کیت توسعه نرم‌افزار ۳۵ را هدف قرار می‌دهد و در دستگاه Android 15 اجرا می‌شود، LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS رفتار پیش‌فرض است و LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT به‌عنوان LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS برای پنجره‌های غیرشناور تفسیر می‌شود.

درغیراین‌صورت، LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT پیش‌فرض است.

پرداخت محتوا در نواحی بریدگی لبه کوتاه

اگر برنامه شما کیت توسعه نرم‌افزار ۳۵ را هدف قرار می‌دهد و در دستگاه Android 15 اجرا می‌شود، LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES به‌عنوان LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS برای پنجره‌های غیرشناور تفسیر می‌شود.

با LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES، محتوا در لبه کوتاه نمایشگر در هر دو حالت عمودی و افقی به ناحیه برش گسترش می‌یابد، صرف‌نظر از اینکه نوارهای سیستم پنهان یا نمایان باشند. هنگام استفاده از این حالت، مطمئن شوید که هیچ محتوای مهمی با ناحیه برش هم‌پوشانی نداشته باشد.

تصویر زیر نمونه‌ای از LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES برای دستگاهی در حالت عمودی است:

تصویری که محتوای درحال پردازش در ناحیه برش‌خوردگی را در حالت عمودی نشان می‌دهد
شکل ۲. محتوا در حالت عمودی در ناحیه برش‌خورده ارائه می‌شود.

تصویر زیر نمونه‌ای از LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES برای دستگاهی در حالت افقی است:

تصویری که محتوای درحال پردازش در ناحیه برش‌خوردگی را در حالت افقی نشان می‌دهد
شکل ۳. محتوا در حالت افقی در ناحیه برش‌خوردگی ارائه می‌شود.

در این حالت، پنجره در زیر بریدگی‌های لبه کوتاه نمایشگر در هر دو حالت عمودی و افقی گسترش می‌یابد، صرف‌نظر از اینکه پنجره نوارهای سیستم را پنهان می‌کند یا نه.

برش گوشه در لبه کوتاه درنظر گرفته می‌شود:

تصویری که دستگاهی با بریدگی گوشه را نشان می‌دهد
شکل ۴. دستگاهی با بریدگی گوشه.

هرگز محتوا را در ناحیه برش نمایشگر پرداز نکنید

اگر برنامه شما کیت توسعه نرم‌افزار ۳۵ را هدف قرار می‌دهد و در دستگاه Android 15 اجرا می‌شود، LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER به‌عنوان LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS برای پنجره‌های غیرشناور تفسیر می‌شود.

با LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER، پنجره هرگز اجازه ندارد با ناحیه بریدگی هم‌پوشانی داشته باشد.

در زیر نمونه‌ای از LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER در حالت عمودی آورده شده است:

تصویری که LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER را برای حالت عمودی نشان می‌دهد
شکل ۵. نمونه‌ای از LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER برای حالت چهره.

در زیر نمونه‌ای از LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER در حالت افقی آورده شده است:

تصویری که LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER را برای حالت افقی نشان می‌دهد
شکل ۶. نمونه‌ای از LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER در حالت افقی.

روال‌های مطلوب برای پشتیبانی از برش نمایشگر

هنگام کار با برش‌های نمایشگر، موارد زیر را درنظر بگیرید:

  • مراقب جای قرارگیری عناصر مهم میانای کاربر باشید. اجازه ندهید ناحیه برش‌خورده هیچ‌گونه نوشتار، کنترل، یا اطلاعات مهم دیگری را بپوشاند.
  • هیچ عنصر تعاملی‌ای را که نیاز به تشخیص لمس دقیق دارد در ناحیه برش قرار ندهید یا گسترش ندهید. ممکن است حساسیت لمس در ناحیه برش کمتر باشد.
  • درصورت امکان، از WindowInsetsCompat برای بازیابی ارتفاع نوار وضعیت و تعیین حاشیه داخلی مناسب برای اعمال به محتوایتان استفاده کنید. از کدنویسی سخت ارتفاع نوار وضعیت خودداری کنید، زیرا این کار می‌تواند منجر به هم‌پوشانی یا قطع شدن محتوا شود.

    تصویری که نشان می‌دهد محتوا در بالا به‌دلیل تنظیم نامناسب حاشیه‌ها بریده شده است
    شکل ۷. از WindowInsetsCompat استفاده کنید تا محتوا هم‌پوشانی نداشته باشد یا قطع نشود.
  • از View.getLocationInWindow() استفاده کنید تا تعیین کنید برنامه‌تان از چه مقدار فضای پنجره استفاده می‌کند. فرض نکنید برنامه از کل پنجره استفاده می‌کند و از View.getLocationOnScreen() استفاده نکنید.

  • اگر برنامه‌تان باید به حالت فراگیر وارد یا از آن خارج شود، از حالت‌های برش always، shortEdges، یا never استفاده کنید. رفتار پیش‌فرض بریدگی می‌تواند باعث شود محتوای برنامه شما در ناحیه بریدگی پرداز زده شود درحالی‌که نوارهای سیستم وجود دارند، اما نه در حالت فراگیر. این امر باعث می‌شود محتوا درطول انتقال‌ها به‌بالا و پایین حرکت کند، همان‌طور که در مثال زیر نشان داده شده است.

    تصویری که نشان می‌دهد محتوا درطول انتقال‌ها به بالا و پایین حرکت می‌کند.
    شکل ۸. نمونه‌ای از محتوایی که درطول انتقال‌ها به‌بالا و پایین حرکت می‌کند.
  • در حالت فراگیر، هنگام استفاده از مختصات پنجره درمقابل مختصات صفحه احتیاط کنید، زیرا برنامه شما هنگام نمایش در حالت جعبه‌ای از کل صفحه استفاده نمی‌کند. به‌دلیل حالت جعبه‌ای، مختصات از مبدأ صفحه با مختصات از مبدأ پنجره یکسان نیست. درصورت نیاز، بااستفاده از getLocationOnScreen() می‌توانید مختصات صفحه را به مختصات نما تبدیل کنید. تصویر زیر نشان می‌دهد که وقتی محتوا در قالب جعبه‌ای است، مختصات چگونه متفاوت است:

    تصویری که مختصات پنجره درمقابل صفحه را هنگام جعبه‌ای شدن محتوا نشان می‌دهد.
    شکل ۹. مختصات پنجره درمقابل صفحه‌نمایش وقتی محتوا در حالت جعبه‌ای است.
  • هنگام کار با MotionEvent، از MotionEvent.getX() و MotionEvent.getY() استفاده کنید تا از مشکلات مشابه در مختصات جلوگیری شود. از MotionEvent.getRawX() یا MotionEvent.getRawY() استفاده نکنید.

نحوه پردازش محتوایتان را آزمایش کنید

همه صفحه‌ها و تجربه‌های برنامه‌تان را آزمایش کنید. درصورت امکان، در دستگاه‌هایی با انواع مختلف بریدگی آزمایش کنید. اگر دستگاهی با بریدگی ندارید، می‌توانید پیکربندی‌های بریدگی رایج را در هر دستگاه یا شبیه‌سازی که Android نسخه ۹ یا بالاتر را اجرا می‌کند با انجام کارهای زیر شبیه‌سازی کنید:

  1. گزینه‌های توسعه‌دهندگان را فعال کنید.
  2. در صفحه گزینه‌های توسعه‌دهندگان، به بخش طراحی پیمایش کنید و شبیه‌سازی نمایشگر با بریدگی را انتخاب کنید.
  3. نوع برش را انتخاب کنید.

    تصویری که نحوه شبیه‌سازی برش نمایشگر را در شبیه‌ساز نشان می‌دهد
    شکل ۱۰. گزینه‌های توسعه‌دهنده برای آزمایش نحوه پرداز شدن محتوای شما.

منابع بیشتر