اخبار محصول

برنامه خود را برای تغییرات اندازه و جهت گیری در اندروید ۱۷ آماده کنید

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

با انتشار اندروید ۱۶ در سال ۲۰۲۵، ما چشم‌انداز خود را برای یک اکوسیستم دستگاه به اشتراک گذاشتیم که در آن برنامه‌ها به طور یکپارچه با هر صفحه‌ای سازگار می‌شوند - چه تلفن همراه، چه دستگاه‌های تاشو، تبلت، دسکتاپ، صفحه نمایش خودرو یا واقعیت افزوده. کاربران انتظار دارند برنامه‌هایشان در همه جا کار کنند. چه چندوظیفگی روی تبلت، چه باز کردن دستگاه برای خواندن راحت‌تر، یا اجرای برنامه‌ها در محیط پنجره‌ای دسکتاپ، کاربران انتظار دارند رابط کاربری فضای صفحه نمایش موجود را پر کند و با وضعیت دستگاه سازگار شود.

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

اکنون با انتشار نسخه بتای اندروید ۱۷، به مرحله بعدی نقشه راه تطبیقی ​​خود می‌رویم: اندروید ۱۷ (سطح API ۳۷) محدودیت‌های جهت‌گیری و تغییر اندازه صفحه نمایش در دستگاه‌های با صفحه نمایش بزرگ (sw > 600 dp) را از توسعه‌دهنده حذف می‌کند . وقتی سطح API ۳۷ را هدف قرار می‌دهید، برنامه شما باید بتواند با اندازه‌های مختلف صفحه نمایش سازگار شود.

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

چه چیزهایی در اندروید ۱۷ تغییر می‌کند؟

برنامه‌هایی که اندروید ۱۷ را هدف قرار می‌دهند، باید از سازگاری خود با حذف تدریجی ویژگی‌های مانیفست و APIهای زمان اجرا که در اندروید ۱۶ معرفی شده‌اند، اطمینان حاصل کنند. ما درک می‌کنیم که برای برخی از برنامه‌ها، این ممکن است یک گذار بزرگ باشد، بنابراین بهترین شیوه‌ها و ابزارها را برای کمک به جلوگیری از مشکلات رایج، در ادامه این پست وبلاگ گنجانده‌ایم.

از اندروید ۱۶ به بعد هیچ تغییر جدیدی اعمال نشده است، اما انصراف توسعه‌دهنده دیگر امکان‌پذیر نیست. یادآوری: وقتی برنامه شما روی صفحه نمایش بزرگ اجرا می‌شود - که در آن صفحه نمایش بزرگ به این معنی است که ابعاد کوچکتر نمایشگر بزرگتر یا مساوی ۶۰۰ dp است - ویژگی‌ها و APIهای manifest زیر نادیده گرفته می‌شوند:

توجه: همانطور که قبلاً در مورد اندروید ۱۶ ذکر شد، این تغییرات برای صفحه نمایش‌هایی که کوچکتر از sw 600 dp هستند یا برنامه‌هایی که بر اساس پرچم android:appCategory به عنوان بازی طبقه‌بندی شده‌اند، اعمال نمی‌شود.

ویژگی‌های مانیفست/API مقادیر نادیده گرفته شده
جهت صفحه نمایش پرتره، معکوسپرتره، حسگرپرتره، کاربرپرتره، منظره، معکوسمنظره، حسگرمنظره، کاربرمنظره
تابع setRequestedOrientation() پرتره، معکوسپرتره، حسگرپرتره، کاربرپرتره، منظره، معکوسمنظره، حسگرمنظره، کاربرمنظره
فعالیت قابل تغییر اندازه همه
نسبت ابعاد حداقل همه
نسبت ابعاد حداکثر همه

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

برنامه خود را آماده کنید

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

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

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

از اندروید ۱۷ بتا ۱ با شبیه‌سازهای سری Pixel Tablet و Pixel Fold در اندروید استودیو استفاده کنید و targetSdkPreview = “CinnamonBun” قرار دهید. همچنین، اگر برنامه شما هنوز API سطح ۳۶ را هدف قرار نداده است، می‌توانید با فعال کردن پرچم UNIVERSAL_RESIZABLE_BY_DEFAULT از چارچوب سازگاری برنامه استفاده کنید.

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

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

بیایید نگاهی به چند استراتژی برای رسیدگی به این مسائل رایج بیندازیم.

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

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

camera_preview_issue.png

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

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

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

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

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

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

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

راه حل ۲: دوربین ویو فایندر

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

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

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

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

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

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

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

راه حل ۴: انجام اقدامات اولیه دوربین با استفاده از یک Intent

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

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

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

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

عناصرLS.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)
)

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

به راهنمای ما در مورد ساخت طرح‌بندی‌های تطبیقی ​​مراجعه کنید.

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

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

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

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

هدف قرار دادن API سطح ۳۷ تا آگوست ۲۰۲۷

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

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

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

آماده شدن برای اندروید ۱۷

برای مشاهده‌ی تمام تغییراتی که برنامه‌ها را در اندروید ۱۷ تحت تأثیر قرار می‌دهند، به صفحه‌ی تغییرات اندروید ۱۷ مراجعه کنید. برای آزمایش برنامه‌ی خود، نسخه بتا ۱ اندروید ۱۷ را دانلود کرده و آن را به targetSdkPreview = “CinnamonBun” به‌روزرسانی کنید یا از چارچوب سازگاری برنامه برای فعال کردن تغییرات خاص استفاده کنید.

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

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

    نوشته شده توسط:

    ادامه مطلب