برش نمایشگر ناحیهای در برخیاز دستگاهها است که به سطح نمایشگر گسترش مییابد. این طراحی امکان تجربه لبهبهلبه را فراهم میکند و درعینحال فضایی برای حسگرهای مهم در جلوی دستگاه ایجاد میکند.
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 در حالت افقی.
روالهای مطلوب برای پشتیبانی از برش نمایشگر
هنگام کار با برشهای نمایشگر، موارد زیر را درنظر بگیرید:
- مراقب جای قرارگیری عناصر مهم میانای کاربر باشید. اجازه ندهید ناحیه برشخورده هیچگونه نوشتار، کنترل، یا اطلاعات مهم دیگری را بپوشاند.
- هیچ عنصر تعاملیای را که نیاز به تشخیص لمس دقیق دارد در ناحیه برش قرار ندهید یا گسترش ندهید. ممکن است حساسیت لمس در ناحیه برش کمتر باشد.
درصورت امکان، از
WindowInsetsCompatبرای بازیابی ارتفاع نوار وضعیت و تعیین حاشیه داخلی مناسب برای اعمال به محتوایتان استفاده کنید. از کدنویسی سخت ارتفاع نوار وضعیت خودداری کنید، زیرا این کار میتواند منجر به همپوشانی یا قطع شدن محتوا شود.
شکل ۷. از WindowInsetsCompatاستفاده کنید تا محتوا همپوشانی نداشته باشد یا قطع نشود.از
View.getLocationInWindow()استفاده کنید تا تعیین کنید برنامهتان از چه مقدار فضای پنجره استفاده میکند. فرض نکنید برنامه از کل پنجره استفاده میکند و ازView.getLocationOnScreen()استفاده نکنید.اگر برنامهتان باید به حالت فراگیر وارد یا از آن خارج شود، از حالتهای برش
always،shortEdges، یاneverاستفاده کنید. رفتار پیشفرض بریدگی میتواند باعث شود محتوای برنامه شما در ناحیه بریدگی پرداز زده شود درحالیکه نوارهای سیستم وجود دارند، اما نه در حالت فراگیر. این امر باعث میشود محتوا درطول انتقالها بهبالا و پایین حرکت کند، همانطور که در مثال زیر نشان داده شده است.
شکل ۸. نمونهای از محتوایی که درطول انتقالها بهبالا و پایین حرکت میکند. در حالت فراگیر، هنگام استفاده از مختصات پنجره درمقابل مختصات صفحه احتیاط کنید، زیرا برنامه شما هنگام نمایش در حالت جعبهای از کل صفحه استفاده نمیکند. بهدلیل حالت جعبهای، مختصات از مبدأ صفحه با مختصات از مبدأ پنجره یکسان نیست. درصورت نیاز، بااستفاده از
getLocationOnScreen()میتوانید مختصات صفحه را به مختصات نما تبدیل کنید. تصویر زیر نشان میدهد که وقتی محتوا در قالب جعبهای است، مختصات چگونه متفاوت است:
شکل ۹. مختصات پنجره درمقابل صفحهنمایش وقتی محتوا در حالت جعبهای است. هنگام کار با
MotionEvent، ازMotionEvent.getX()وMotionEvent.getY()استفاده کنید تا از مشکلات مشابه در مختصات جلوگیری شود. ازMotionEvent.getRawX()یاMotionEvent.getRawY()استفاده نکنید.
نحوه پردازش محتوایتان را آزمایش کنید
همه صفحهها و تجربههای برنامهتان را آزمایش کنید. درصورت امکان، در دستگاههایی با انواع مختلف بریدگی آزمایش کنید. اگر دستگاهی با بریدگی ندارید، میتوانید پیکربندیهای بریدگی رایج را در هر دستگاه یا شبیهسازی که Android نسخه ۹ یا بالاتر را اجرا میکند با انجام کارهای زیر شبیهسازی کنید:
- گزینههای توسعهدهندگان را فعال کنید.
- در صفحه گزینههای توسعهدهندگان، به بخش طراحی پیمایش کنید و شبیهسازی نمایشگر با بریدگی را انتخاب کنید.
نوع برش را انتخاب کنید.
شکل ۱۰. گزینههای توسعهدهنده برای آزمایش نحوه پرداز شدن محتوای شما.
منابع بیشتر
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT