اخبار محصول

دستگاه‌های Android به‌طور یکپارچه به نمایشگرهای متصل گسترش می‌یابند

‫۷ دقیقه خواندن
مشاهده نمایه Francesco Romano
Francesco Romano مهندس روابط توسعه‌دهندگان، Android

با خوشحالی اعلام می‌کنیم که در نزدیک کردن محاسبات تلفن همراه و رایانه در Android به یکدیگر به نقطه عطف مهمی رسیده‌ایم: پشتیبانی از نمایشگر متصل با انتشار Android 16 QPR3 به دردسترس عموم قرار گرفته است!

همان‌طور که در Google I/O 2025 نشان داده شد، نمایشگرهای متصل به کاربران امکان می‌دهند دستگاه‌های Android خود را به نمایشگر خارجی متصل کنند و فوراً به محیط پنجره‌بندی رایانه دسترسی پیدا کنند. از برنامه‌ها می‌توان در پنجره‌های آزاد یا بیشینه استفاده کرد و کاربران می‌توانند درست مثل سیستم‌عامل رایانه چندوظیفگی انجام دهند.

‫Google و Samsung با همکاری یکدیگر تجربه پنجره‌بندی رایانه‌ای یکپارچه و قدرتمندی را به دستگاه‌های سراسر بوم‌سازگان Android که از Android 16 استفاده می‌کنند و به نمایشگر خارجی متصل هستند ارائه داده‌اند. 
این ویژگی اکنون به‌طور کلی در دستگاه‌های پشتیبانی‌شده* برای کاربرانی که می‌توانند تلفن‌های Pixel و Samsung پشتیبانی‌شده خود را به مانیتورهای خارجی متصل کنند دردسترس است و فرصت‌های جدیدی برای ساختن تجربه‌های برنامه‌ای جذاب‌تر و پربارتر که در انواع مختلف دستگاه‌ها سازگار می‌شوند فراهم می‌کند.

چگونه کار می‌کند؟

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

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

materialDisplay.gif

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

وقتی دستگاهی که از پنجره‌بندی رایانه‌ای پشتیبانی می‌کند (مثل رایانه لوحی Samsung Galaxy Tab S11) به نمایشگر خارجی متصل می‌شود، جلسه رایانه در هر دو نمایشگر گسترش می‌یابد و فضای کاری وسیع‌تری دراختیار کاربر قرار می‌گیرد. سپس دو نمایشگر به‌عنوان یک سیستم پیوسته عمل می‌کنند و به پنجره‌های برنامه، محتوا، و مکان‌نما اجازه می‌دهند آزادانه بین نمایشگرها جابه‌جا شوند.

materialDisplay2.gif

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

چرا این موضوع مهم است؟

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


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

به‌طور خاص، برای داشتن بهترین تجربه از برنامه‌ها در نمایشگرهای متصل، به این روال‌های مطلوب کلیدی توجه کنید:

  • فرض نکنید شیء ثابت است Display: شیء Display مرتبط با بافت برنامه شما می‌تواند وقتی پنجره برنامه به نمایشگر خارجی منتقل می‌شود یا اگر پیکربندی نمایشگر تغییر می‌کند تغییر کند. برنامه شما باید رویدادهای تغییر پیکربندی را به‌خوبی مدیریت کند و سنجه‌های نمایش را به‌جای ذخیره کردن در حافظه نهان به‌صورت پویا پُرسمان کند.
  • حساب برای تغییرات پیکربندی تراکم: نمایشگرهای خارجی می‌توانند تراکم پیکسل بسیار متفاوتی نسبت‌به صفحه دستگاه اصلی داشته باشند. مطمئن شوید که چیدمان‌ها و منابع شما به‌درستی با این تغییرات تطبیق پیدا می‌کنند تا شفافیت و کاربردپذیری میانای کاربری حفظ شود. از پیکسل‌های مستقل از تراکم (dp) برای چیدمان‌ها استفاده کنید، منابع مختص تراکم ارائه دهید، و مطمئن شوید که میانای کاربرتان به‌طور مناسب مقیاس‌بندی می‌شود.
  • پشتیبانی صحیحاز لوازم جانبی خارجی: وقتی کاربران به یک مانیتور خارجی متصل می‌شوند، اغلب محیطی شبیه به رایانه ایجاد می‌کنند. این کار اغلب شامل استفاده از صفحه‌کلیدهای خارجی، موشواره‌ها، صفحه لمسی‌ها، وب‌کم‌ها، میکروفون‌ها و بلندگوها می‌شود. پشتیبانی از تعاملات صفحه‌کلید و موشواره را بهبود دهید.

ساختن برای آینده رایانه با ابزارهای مدرن

ما چندین ابزار برای کمک به شما در ساختن تجربه رایانه ارائه می‌دهیم. بیایید جدیدترین به‌روزرسانی‌های کتابخانه‌های تطبیقی اصلی خود را خلاصه کنیم!

کلاس‌های اندازه پنجره جدید: بزرگ و خیلی بزرگ

بزرگ‌ترین به‌روزرسانی در Jetpack WindowManager 1.5.0 اضافه شدن دو کلاس جدید اندازه پنجره عرض است: «بزرگ» و «خیلی بزرگ».

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

در اینجا نقاط گسست عرض جدید را می‌بینید:

  • بزرگ: برای عرض‌های بین ۱۲۰۰dp و ۱۶۰۰dp
  • خیلی بزرگ: برای عرض‌های ≥۱۶۰۰ پیکسل
windowClasses.png

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

در سطوح بسیار بزرگ، صرفاً بزرگ کردن چیدمان ازهم بازشده تبلت همیشه بهترین تجربه کاربری نیست. برای مثال، کارخواه ایمیل ممکن است به‌راحتی دو قاب (صندوق ایمیل و پیام) را در کلاس اندازه پنجره «ازهم بازشده» نشان دهد. اما در یک نمایشگر میز کار بسیار بزرگ، کارخواه ایمیل می‌تواند به‌طور زیبا سه یا حتی چهار قاب را نمایش دهد، شاید یک صندوق ورودی، یک فهرست پیام، محتوای کامل پیام، و یک پانل تقویم/تکالیف، همه به‌طور هم‌زمان.

برای افزودن کلاس‌های اندازه پنجره جدید به پروژه، کافی است تابع را از مجموعه WindowSizeClass.BREAKPOINTS_V2 به‌جای WindowSizeClass.BREAKPOINTS_V1 فراخوانی کنید:

val currentWindowMetrics =
    WindowMetricsCalculator.getOrCreate()
    .computeCurrentWindowMetrics(LocalContext.current)

val sizeClass = WindowSizeClass.BREAKPOINTS_V2
    .computeWindowSizeClass(currentWindowMetrics)

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

if(sizeClass.isWidthAtLeastBreakpoint(
    WindowSizeClass.WIDTH_DP_LARGE_LOWER_BOUND)){
    ...
	// Window is at least 1200 dp wide.
}

ساختن چیدمان‌های تطبیقی با Jetpack Navigation 3

Navigation 3 جدیدترین افزودنی به مجموعه Jetpack است. «ناوبری ۳» که به‌تازگی به اولین نسخه پایدار خود رسیده است، کتابخانه ناوبری قدرتمندی است که برای کار با Compose طراحی شده است.

«ناوبری ۳» همچنین ابزاری عالی برای ساختن چیدمان‌های تطبیقی است که به چندین مقصد اجازه می‌دهد هم‌زمان نمایش داده شوند و امکان می‌دهد بین این چیدمان‌ها به‌طور یکپارچه جابه‌جا شوید.�
این سیستم برای مدیریت جریان واسط کاربر برنامه شما براساس «صحنه‌ها» است.
صحنه چیدمانی است که یک یا چند مقصد را به‌طور هم‌زمان نمایش می‌دهد. SceneStrategy تعیین می‌کند که آیا می‌تواند «صحنه» ایجاد کند یا نه. با به‌هم پیوند دادن نمونه‌های SceneStrategy می‌توانید صحنه‌های مختلفی برای اندازه‌های مختلف صفحه و پیکربندی‌های دستگاه ایجاد و نمایش دهید.

برای چیدمان‌های متعارف آماده، مثل فهرست-جزئیات و قاب پشتیبان، می‌توانید از «صحنه‌ها» در کتابخانه «انطباقی Compose Material 3» (دردسترس در نسخه ۱.۳ و بالاتر) استفاده کنید.

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

class ThreePaneScene<T : Any>(
    override val key: Any,
    override val previousEntries: List<NavEntry<T>>,
    val firstEntry: NavEntry<T>,
    val secondEntry: NavEntry<T>,
    val thirdEntry: NavEntry<T>
) : Scene<T> {
    override val entries: List<NavEntry<T>> = listOf(firstEntry, secondEntry, thirdEntry)
    override val content: @Composable (() -> Unit) = {
        Row(modifier = Modifier.fillMaxSize()) {
            Column(modifier = Modifier.weight(1f)) {
                firstEntry.Content()
            }
            Column(modifier = Modifier.weight(1f)) {
                secondEntry.Content()
            }
            Column(modifier = Modifier.weight(1f)) {
                thirdEntry.Content()
            }
        }
    }

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

class ThreePaneSceneStrategy<T : Any>(val windowSizeClass: WindowSizeClass) : SceneStrategy<T> {
    override fun SceneStrategyScope<T>.calculateScene(entries: List<NavEntry<T>>): Scene<T>? {
        if (windowSizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_LARGE_LOWER_BOUND)) {
            val lastThree = entries.takeLast(3)
            if (lastThree.size == 3 && lastThree.all { it.metadata.containsKey(MULTI_PANE_KEY) }) {
                val firstEntry = lastThree[0]
                val secondEntry = lastThree[1]
                val thirdEntry = lastThree[2]


                return ThreePaneScene(
                    key = Triple(firstEntry.contentKey, secondEntry.contentKey, thirdEntry.contentKey),
                    previousEntries = entries.dropLast(3),
                    firstEntry = firstEntry,
                    secondEntry = secondEntry,
                    thirdEntry = thirdEntry
                )
            }
        }
        return null
    }
}

هنگام ایجاد NavDisplay، می‌توانید از ThreePaneSceneStrategy با استراتژی‌های دیگر استفاده کنید. برای مثال، می‌توانیم TwoPaneStrategy را نیز اضافه کنیم تا وقتی فضای کافی برای نمایش سه قاب وجود ندارد، دو قاب را کنار هم نمایش دهد.

val strategy = ThreePaneSceneStrategy() then TwoPaneSceneStrategy()

NavDisplay(..., 
  sceneStrategy = strategy,
  entryProvider = entryProvider { 
    entry<MyScreen>(metadata = mapOf(MULTI_PANE_KEY to true))) { ... }
    ... other entries...
  }
)

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

بااستفاده از صحنه‌ها و استراتژی‌ها، می‌توانید چیدمان‌های یک، دو، و سه پانلی را به برنامه‌تان اضافه کنید!

adaptivepane.gif

برنامه تطبیقی که ناوبری سه‌تایی را در صفحه‌نمایش‌های عریض نشان می‌دهد.

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

چیدمان‌های تطبیقی مستقل

اگر به چیدمان مستقل نیاز دارید، کتابخانه تطبیقی Compose Material 3 به شما کمک می‌کند واسط‌های کاربر تطبیقی مانند چیدمان‌های فهرست-جزئیات و قاب پشتیبان ایجاد کنید که براساس کلاس‌های اندازه پنجره یا وضعیت‌های دستگاه، به‌طور خودکار با پیکربندی‌های پنجره تطبیق پیدا می‌کنند. 

خبر خوب این است که کتابخانه ازقبل با نقاط گسست جدید به‌روز است! از نسخه ۱.۲، توابع دستورات داربست قاب پیش‌فرض از کلاس‌های اندازه پنجره «بزرگ» و «خیلی بزرگ» پشتیبانی می‌کنند.

فقط کافی است با اعلام در فایل ساخت Gradle خود که می‌خواهید از نقاط گسست جدید استفاده کنید، موافقت کنید:

currentWindowAdaptiveInfo(supportLargeAndXLargeWidth = true)

شروع کردن

ویژگی نمایشگر متصل را در جدیدترین نسخه Android کاوش کنید. Android 16 QPR3 را در دستگاه پشتیبانی‌شده دریافت کنید، سپس آن را به نمایشگر خارجی وصل کنید تا آزمایش برنامه‌تان را از امروز شروع کنید! 

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

بازخورد

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

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


*توجه: در زمان نگارش این مقاله، نمایشگرهای متصل در سری Pixel 8،‏ 9،‏ 10 و در طیف گسترده‌ای از دستگاه‌های Samsung، ازجمله S26،‏ Fold7،‏ Flip7، و Tab S11 پشتیبانی می‌شوند.

نوشته:
ادامه خواندن