اخبار محصول

برنامه‌تان را برای تغییرات قابلیت تغییر اندازه و جهت در Android 17 آماده کنید

‫۶ دقیقه خواندن
مشاهده نمایه میگل مونتمایور
Miguel Montemayor مهندس روابط توسعه‌دهندگان

با انتشار Android 16 در سال ۲۰۲۵، چشم‌انداز خود را برای بوم‌سازگان دستگاهی که در آن برنامه‌ها به‌طور یکپارچه با هر صفحه‌نمایشی (تلفن، تاشو، رایانه لوحی، رایانه، نمایشگر خودرو، یا XR) سازگار می‌شوند، هم‌رسانی کردیم. کاربران انتظار دارند برنامه‌هایشان همه‌جا کار کند. چه درحال چندوظیفگی در رایانه لوحی باشند، چه درحال باز کردن دستگاه برای خواندن راحت، یا اجرای برنامه‌ها در محیط پنجره‌بندی رایانه‌ای، کاربران انتظار دارند که میانای کاربر فضای نمایشگر دردسترس را پر کند و با وضعیت دستگاه سازگار شود.

ما تغییرات قابل‌توجهی در میاناهای برنامه‌سازی کاربردی جهت‌یابی و تغییر اندازه معرفی کردیم تا رفتار تطبیقی را تسهیل کنیم، و درعین‌حال یک گزینه انصراف موقت ارائه دادیم تا به شما در انجام این انتقال کمک کنیم. قبلاً دیده‌ایم که بسیاری از توسعه‌دهندگان هنگام هدف‌یابی سطح میانای برنامه‌سازی کاربردی ۳۶ با موفقیت با این انتقال سازگار شده‌اند.

اکنون با انتشار نسخه بتا Android 17، به مرحله بعدی نقشه راه تطبیقی خود می‌رویم: Android 17 (سطح ای‌پی‌آی ۳۷) گزینه انصراف توسعه‌دهنده را برای محدودیت‌های جهت و قابلیت تغییر اندازه در دستگاه‌های با صفحه‌نمایش بزرگ (sw > ۶۰۰ پیکسل مستقل از تراکم) حذف می‌کند. وقتی سطح میانای برنامه‌سازی کاربردی ۳۷ را هدف قرار می‌دهید، برنامه‌تان باید بتواند با اندازه‌های مختلف نمایشگر سازگار شود.

تغییرات رفتاری تضمین می‌کند که بوم‌سازگان Android تجربه‌ای یکپارچه و با کیفیت بالا در همه ابعاد دستگاه ارائه می‌دهد.

چه چیزهایی در Android 17 تغییر می‌کند

برنامه‌هایی که Android 17 را هدف‌یابی می‌کنند باید از سازگاری خود با حذف تدریجی مشخصه‌های مانیفست و میاناهای برنامه‌سازی کاربردی زمان اجرا که در Android 16 معرفی شده‌اند اطمینان حاصل کنند. می‌دانیم که برای برخی‌از برنامه‌ها این ممکن است انتقال بزرگی باشد، بنابراین روال‌های مطلوب و ابزارهایی را برای کمک به جلوگیری از مشکلات رایج در ادامه این پست وبلاگ گنجانده‌ایم.

از Android 16 تغییر جدیدی معرفی نشده است، اما توسعه‌دهنده دیگر نمی‌تواند انصراف دهد. یادآوری: وقتی برنامه‌تان در صفحه‌نمایش بزرگ اجرا می‌شود (صفحه‌نمایش بزرگ یعنی ابعاد کوچک‌تر نمایشگر بزرگ‌تر یا مساوی ۶۰۰ پیکسل مستقل از تراکم است)، ویژگی‌های مانیفست و میاناهای برنامه‌سازی کاربردی زیر نادیده گرفته می‌شوند:

توجه: همان‌طور که قبلاً درباره Android 16 گفته شد، این تغییرات برای صفحه‌نمایش‌های کوچک‌تر از ۶۰۰ پیکسل مستقل از تراکم یا برنامه‌هایی که براساس پرچم android:appCategory به‌عنوان بازی دسته‌بندی شده‌اند اعمال نمی‌شود. 

ویژگی‌های مانیفست/میانای برنامه‌سازی کاربردیمقادیر نادیده‌گرفته‌شده
screenOrientationportrait, reversePortrait, sensorPortrait, userPortrait, landscape, reverseLandscape, sensorLandscape, userLandscape
setRequestedOrientation()portrait, reversePortrait, sensorPortrait, userPortrait, landscape, reverseLandscape, sensorLandscape, userLandscape
resizeableActivityهمه
minAspectRatioهمه
maxAspectRatioهمه

همچنین، کاربران کنترل را حفظ می‌کنند. در تنظیمات نسبت ابعادی، کاربران می‌توانند صریحاً بااستفاده از رفتار درخواستی برنامه موافقت کنند.

آماده کردن برنامه

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

آزمایش کردن برنامه

اولین قدم شما این است که برنامه‌تان را با این تغییرات آزمایش کنید تا مطمئن شوید برنامه در اندازه‌های مختلف نمایشگر به‌خوبی کار می‌کند.

از Android 17 Beta 1 با شبیه‌سازهای Pixel Tablet و سری Pixel Fold در «استودیو Android» استفاده کنید و targetSdkPreview = “CinnamonBun” را تنظیم کنید. یا اگر برنامه‌تان هنوز سطح میانای برنامه‌سازی کاربردی ۳۶ را هدف قرار نمی‌دهد، می‌توانید با فعال کردن پرچم UNIVERSAL_RESIZABLE_BY_DEFAULT از چارچوب سازگاری برنامه استفاده کنید.

ابزارهای دیگری داریم تا مطمئن شویم چیدمان‌هایتان به‌درستی سازگار می‌شوند. می‌توانید به‌طور خودکار واسط کاربر خود را ممیزی کنید و با Compose UI Check پیشنهادهایی برای تطبیق‌پذیرتر کردن واسط کاربر خود دریافت کنید، و بااستفاده از DeviceConfigurationOverride ویژگی‌های نمایش خاصی را در آزمایش‌های خود شبیه‌سازی کنید.

برای برنامه‌هایی که از گذشته جهت و نسبت ابعادی محدودی داشته‌اند، معمولاً با مشکلاتی مانند پیش‌نمایش‌های دوربین کج یا با جهت نادرست، چیدمان‌های کشیده، دکمه‌های غیرقابل‌دسترس، یا ازدست رفتن وضعیت کاربر هنگام مدیریت تغییرات پیکربندی مواجه می‌شویم. 

بیایید نگاهی به برخی راهبردها برای رسیدگی به این مشکلات رایج بیندازیم.

اطمینان از سازگاری دوربین

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

camera_preview_issue.png

مطمئن شوید پیش‌نمایش دوربینتان کشیده یا چرخانده نشده باشد.

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

برای اطمینان از اینکه پیش‌نمایش دوربین به‌درستی با هر اندازه یا جهت پنجره‌ای سازگار می‌شود، این چهار راه‌حل را درنظر بگیرید:

راه حل ۱: Jetpack CameraX (ترجیحی) 

ساده‌ترین و قوی‌ترین راه‌حل استفاده از کتابخانه Jetpack CameraX است. عنصر میانای کاربر PreviewView آن برای رسیدگی خودکار به همه پیچیدگی‌های پیش‌نمایش طراحی شده است:

  • PreviewView به‌درستی جهت حسگر، چرخش دستگاه، و مقیاس‌بندی را تنظیم می‌کند
  • ‫PreviewView نسبت ابعادی تصویر دوربین را حفظ می‌کند، معمولاً با وسط‌چین کردن و برش دادن (FILL_CENTER)
  • درصورت نیاز می‌توانید نوع مقیاس را روی FIT_CENTER تنظیم کنید تا پیش‌نمایش را در قالب جعبه نامه قرار دهید

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

راهکار ۲: CameraViewfinder 

اگر از پایگاه کد Camera2 موجود استفاده می‌کنید، کتابخانه CameraViewfinder (سازگار با نسخه قدیمی تا سطح API ‏۲۱) راهکار مدرن دیگری است. این ابزار نمایش فید دوربین را بااستفاده از TextureView یا SurfaceView و اعمال همه تبدیل‌های لازم (نسبت ابعادی، مقیاس، و چرخش) برای شما ساده می‌کند.

برای اطلاعات بیشتر، پست وبلاگ معرفی نمایاب دوربین و راهنمای توسعه‌دهنده پیش‌نمایش دوربین را ببینید.

راه‌حل ۳: پیاده‌سازی دستی Camera2 

اگر نمی‌توانید از CameraX یا CameraViewfinder استفاده کنید، باید جهت و نسبت ابعادی را به‌صورت دستی محاسبه کنید و مطمئن شوید که محاسبات در هر تغییر پیکربندی به‌روزرسانی می‌شوند:

  • جهت حسگر دوربین (برای مثال، ۰، ۹۰، ۱۸۰، ۲۷۰ درجه) را از CameraCharacteristics دریافت کنید
  • دریافت چرخش فعلی نمایشگر دستگاه (برای مثال، ۰، ۹۰، ۱۸۰، ۲۷۰ درجه)
  • از جهت حسگر دوربین و مقادیر چرخش نمایشگر برای تعیین تبدیل‌های لازم برای SurfaceView یا TextureView استفاده کنید
  • مطمئن شوید نسبت ابعادی خروجی Surface با نسبت ابعادی پیش‌نمای دوربین مطابقت داشته باشد تا از اعوجاج جلوگیری شود

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

برای اطلاعات بیشتر، به راهنمای توسعه‌دهنده پیش‌نمایش دوربین و ویدیو برنامه «دوربین» شما در ابعاد مختلف مراجعه کنید.

راهکار ۴: انجام کنش‌های اصلی دوربین بااستفاده از Intent 

اگر به ویژگی‌های زیادی از دوربین نیاز ندارید، یک راه‌حل ساده و مستقیم این است که کنش‌های اصلی دوربین مانند گرفتن عکس یا ویدیو را بااستفاده از برنامه دوربین پیش‌فرض دستگاه انجام دهید. در این حالت، برای نگهداری و سازگاری آسان‌تر، می‌توانید به‌جای ادغام با کتابخانه دوربین، به‌سادگی از Intent استفاده کنید. 

برای اطلاعات بیشتر، هدف‌های دوربین را ببینید.

از واسط کاربر کشیده‌شده یا دکمه‌های غیرقابل‌دسترس اجتناب کنید

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

elementsLS.png

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

ممکن است دکمه‌ها، فیلدهای نوشتاری، و کارت‌ها را روی fillMaxWidth یا match_parent تنظیم کرده باشید.  در تلفن، این عالی به‌نظر می‌رسد. اما در رایانه لوحی یا دستگاه تاشو در حالت افقی، عناصر میانای کاربر در سراسر صفحه‌نمایش بزرگ کشیده می‌شوند. در Jetpack Compose، می‌توانید از اصلاح‌کننده widthIn برای تنظیم حداکثر عرض مؤلفه‌ها استفاده کنید تا از کشیده شدن محتوا جلوگیری شود:

Box(
    contentAlignment = Alignment.Center,
    modifier = Modifier.fillMaxSize()
) {
    Column(
        modifier = Modifier
            .widthIn(max = 300.dp) // Prevents stretching beyond 300dp
            .fillMaxWidth()        // Fills width up to 300dp
            .padding(16.dp)
    ) {
        // Your content
    }
}

اگر کاربری برنامه‌تان را در جهت افقی در دستگاه تاشو یا رایانه لوحی باز کند، دکمه‌های کنش مانند ذخیره یا ورود به سیستم در پایین صفحه ممکن است خارج از صفحه نمایش داده شوند. اگر محفظه پیمایش‌کردنی نباشد، ممکن است کاربر نتواند ادامه دهد. در Jetpack Compose، می‌توانید اصلاح‌کننده verticalScroll را به مؤلفه‌تان اضافه کنید:

Column(
    modifier = Modifier
        .fillMaxSize()
        .verticalScroll(rememberScrollState())
        .padding(16.dp)
)

با ترکیب محدودیت‌های حداکثر عرض با پیمایش عمودی، مطمئن می‌شوید که برنامه‌تان بدون توجه به اینکه اندازه پنجره برنامه چقدر عریض یا کوتاه می‌شود، کاربردی و قابل‌استفاده باقی می‌ماند.

راهنمای ما را درباره ساختن چیدمان‌های تطبیقی ببینید.

حفظ وضعیت با تغییرات پیکربندی

برداشتن محدودیت‌های جهت و نسبت ابعادی به این معنی است که اندازه پنجره برنامه‌تان بسیار بیشتر تغییر خواهد کرد. کاربران ممکن است دستگاهشان را بچرخانند، آن را تا کنند/ باز کنند، یا اندازه برنامه‌تان را به‌طور پویا در حالت‌های پنجره‌بندی رایانه‌ای یا صفحهٔ دونیمه تغییر دهند.

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

راهنمای ما را درباره ذخیره کردن وضعیت میانای کاربر ببینید.

هدف‌یابی میانای برنامه‌سازی کاربردی سطح ۳۷ تا اوت ۲۰۲۷

اگر برنامه‌تان قبلاً هنگام هدف‌یابی سطح میانای برنامه‌سازی کاربردی ۳۶ از این تغییرات انصراف داده باشد، برنامه‌تان فقط پس‌از اینکه سطح میانای برنامه‌سازی کاربردی ۳۷ را هدف‌یابی کند تحت‌تأثیر حذف انصراف Android 17 قرار خواهد گرفت. برای کمک به شما در برنامه‌ریزی و انجام اصلاحات لازم در برنامه‌تان، در اینجا خط زمانی اعمال این تغییرات آورده شده است:

  • ‫Android 17: تغییرات شرح‌داده‌شده در بالا تجربه پایه برای دستگاه‌های با صفحه‌نمایش بزرگ (کمترین عرض صفحه‌نمایش > ۶۰۰ پیکسل مستقل از تراکم) برای برنامه‌هایی که سطح میانای برنامه‌سازی کاربردی ۳۷ را هدف‌یابی می‌کنند خواهد بود. توسعه‌دهندگان نمی‌توانند انصراف دهند.

مهلت‌های هدف‌یابی سطح میانای برنامه‌سازی کاربردی خاص مختص فروشگاه برنامه است. برای Google Play، برنامه‌ها و به‌روزرسانی‌های جدید باید سطح میانای برنامه‌سازی کاربردی ۳۷ را هدف قرار دهند، که این رفتار را برای توزیع در اوت ۲۰۲۷ اجباری می‌کند.

آماده شدن برای Android 17

برای اطلاع از همه تغییراتی که بر برنامه‌ها در Android 17 تأثیر می‌گذارد، به صفحه تغییرات Android 17 مراجعه کنید. برای آزمایش برنامه‌تان، Android 17 Beta 1 را بارگیری کنید و به targetSdkPreview = “CinnamonBun” به‌روزرسانی کنید یا از چارچوب همسازی برنامه برای فعال کردن تغییرات خاص استفاده کنید.

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

منتظر نمانید. همین امروز برای Android 17 آماده شوید!

نویسنده:
ادامه خواندن