مدیریت پنجره

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

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

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

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

اندازه راه اندازی اولیه

برنامه ها می توانند اندازه راه اندازی اولیه خود را به روش های زیر درخواست کنند:

  • از اندازه راه اندازی فقط در محیط های دسکتاپ استفاده کنید. این به مدیر پنجره کمک می کند تا محدوده ها و جهت گیری مناسب را به شما بدهد. برای نشان دادن تنظیمات برگزیده هنگام استفاده در حالت دسکتاپ، متا تگ های زیر را در <activity> اضافه کنید:
<meta-data android:name="WindowManagerPreference:FreeformWindowSize"
           android:value="[phone|tablet|maximize]" />
<meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
           android:value="[portrait|landscape]" />
  • از مرزهای راه اندازی ایستا استفاده کنید. از <layout> در ورودی مانیفست فعالیت خود برای تعیین اندازه شروع "ثابت" مانند مثال زیر استفاده کنید:
<layout android:defaultHeight="500dp"
            android:defaultWidth="600dp"
            android:gravity="top|end"
            android:minHeight="450dp"
            android:minWidth="300dp" />
  • از مرزهای پرتاب پویا استفاده کنید. یک اکتیویتی می تواند هنگام ایجاد یک اکتیویتی جدید ActivityOptions.setLaunchBounds(Rect) ایجاد کرده و از آن استفاده کند. با تعیین یک مستطیل خالی، برنامه شما می تواند به حداکثر برسد.

تغییر اندازه پنجره ها

در ChromeOS، کاربران می توانند اندازه پنجره برنامه را به روش معمول تغییر دهند: با کشیدن گوشه سمت راست پایین، همانطور که در شکل 2 نشان داده شده است.

شکل 2. یک پنجره برنامه قابل تغییر اندازه.

هنگام استفاده از کلاس View دو گزینه برای مدیریت تغییر اندازه پنجره وجود دارد:

  • با فراخوانی onConfigurationChanged(..) به تغییرات پیکربندی به صورت پویا پاسخ دهید. به عنوان مثال، می‌توانید android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" را به مانیفست فعالیت اضافه کنید. برای اطلاعات بیشتر در مورد مدیریت تغییرات پیکربندی، مدیریت تغییرات پیکربندی را بخوانید.
  • اجازه دهید سیستم فعالیت را دوباره راه اندازی کند. در این حالت، onSaveInstanceState را پیاده سازی کنید و از مولفه معماری ViewModel برای بازیابی حالت ذخیره شده قبلی استفاده کنید.

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

ابعاد پنجره

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

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

توجه داشته باشید که اندازه پنجره و اندازه صفحه نمایش یکسان نیست. برای دریافت اندازه پنجره در DP، از Activity.getResources().getConfiguration().screenWidth و Activity.getResources().getConfiguration().screenHeight استفاده کنید. احتمالاً هرگز نیازی به استفاده از اندازه صفحه نمایش ندارید.

محدوده محتوا

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

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

    • NativeActivity.mLastContent[X/Y/Width/Height]()
    • findViewById(android.R.id.content).get[Width/Height]()

    نظارت مستمر را می توان با استفاده از یک ناظر انجام داد:

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • افزودن شنونده به view.addOnLayoutChangeListener(findViewById(android.R.id.content))

    اگر برنامه از قبل آثار هنری خود را مقیاس بندی می کند، هر بار که وضوح تغییر می کند این کار را انجام دهید.

تغییر اندازه فرم آزاد

ChromeOS امکان تغییر اندازه هر پنجره را آزادانه می دهد: کاربر می تواند عرض، ارتفاع و موقعیت پنجره را روی صفحه تغییر دهد. بسیاری از برنامه های اندروید بدون تغییر اندازه به صورت آزاد نوشته می شوند. این مسائل را در نظر بگیرید:

  • موقعیت صفحه ممکن است تغییر کند. همیشه از سیستم برای انجام تبدیل مختصات پنجره به صفحه و صفحه به پنجره استفاده کنید.
  • اگر از سیستم نمایش اندروید استفاده می کنید، طرح پنجره شما به طور خودکار با تغییر اندازه آن تغییر می کند.
  • اگر از سیستم view استفاده نمی کنید و سطح را در اختیار ندارید، برنامه شما باید تغییرات اندازه را به تنهایی مدیریت کند.
  • برای برنامه های بومی، از اعضای mLastContent استفاده کنید یا از نمای محتوا برای تعیین اندازه اولیه استفاده کنید.
  • هنگامی که برنامه در حال اجرا است، به رویدادهای onContentRectChangedNative یا onGlobalLayout گوش دهید تا به تغییرات اندازه واکنش نشان دهید.
  • وقتی اندازه برنامه تغییر می‌کند، طرح‌بندی‌ها و آثار هنری را مجدداً مقیاس یا بارگیری کنید و نواحی ورودی را به‌روزرسانی کنید.

حالت تمام صفحه

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

جهت صفحه نمایش

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

برخی از برنامه‌های Android فرض می‌کنند که وقتی دستگاهی در حالت عمودی نگه داشته می‌شود، مقدار چرخش Surface.ROTATION_0 است.ROTATION_0. این ممکن است برای اکثر دستگاه های اندرویدی صادق باشد. با این حال، هنگامی که برنامه در حالت ARC خاصی است، مقدار چرخش برای جهت عمودی ممکن است Surface.ROTATION_0 نباشد.ROTATION_0.

برای به دست آوردن یک مقدار چرخش دقیق هنگام خواندن شتاب سنج یا حسگرهای مشابه، از روش Display.getRotation() استفاده کنید و محور را بر این اساس تغییر دهید.

فعالیت ریشه و جهت گیری

یک پنجره Chromebook از مجموعه ای از پنجره های فعالیت تشکیل شده است. هر پنجره در پشته اندازه و جهت یکسانی دارد.

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

حالت دستگاه در اینجا تأثیر دارد: در حالت تبلت، جهت قفل نمی شود و هر پنجره جهت خود را حفظ می کند، همانطور که در اندروید عادی است.

دستورالعمل های جهت گیری

این دستورالعمل‌ها را برای جهت‌گیری مدیریت دنبال کنید:

  • اگر فقط یک جهت را پشتیبانی می کنید، اطلاعات را به مانیفست اضافه کنید تا مدیر پنجره قبل از شروع برنامه از آن مطلع شود. هنگامی که جهت را مشخص می کنید، جهت گیری سنسور را نیز در صورت امکان مشخص کنید. کروم بوک ها اغلب قابل تبدیل هستند و یک برنامه وارونه تجربه کاربری بدی است.
  • سعی کنید با یک جهت گیری انتخاب شده باقی بمانید. از درخواست یک جهت در مانیفست و تنظیم برنامه نویسی دیگری بعداً خودداری کنید.
  • مراقب تغییر جهت بر اساس اندازه پنجره باشید. کاربر ممکن است در یک پنجره کوچک با اندازه پرتره گیر کند و نتواند به یک پنجره افقی بزرگتر بازگردد.
  • کنترل‌های پنجره‌ای در کروم برای جابه‌جایی بین همه طرح‌بندی‌های موجود وجود دارد. با انتخاب گزینه جهت گیری صحیح، می توانید اطمینان حاصل کنید که کاربر پس از راه اندازی برنامه، طرح بندی صحیحی دارد. اگر برنامه ای به صورت عمودی و افقی در دسترس است، در صورت امکان آن را به صورت پیش فرض روی افقی قرار دهید. پس از تنظیم این گزینه، بر اساس هر برنامه به خاطر سپرده می شود.
  • سعی کنید از تغییرات غیر ضروری جهت گیری خودداری کنید. به عنوان مثال، اگر جهت فعالیت عمودی باشد، اما برنامه در زمان اجرا setRequestedOrientation(LANDSCAPE) را فراخوانی کند، این باعث تغییر اندازه پنجره غیرضروری می شود که برای کاربر آزاردهنده است و ممکن است برنامه را راه اندازی مجدد کند که برنامه نتواند آن را مدیریت کند. بهتر است جهت را یکبار مثلاً در مانیفست تنظیم کنید و فقط در صورت لزوم آن را تغییر دهید.

ملاحظات دیگر

در اینجا موارد دیگری وجود دارد که باید هنگام کار با برنامه های Android در ChromeOS در نظر بگیرید:

  • در متد onDestroy فعالیت خود finish() فراخوانی نکنید. این باعث می شود برنامه با تغییر اندازه بسته شود و دوباره راه اندازی نشود.
  • از انواع پنجره‌هایی که سازگار نیستند، مانند TYPE_KEYGUARD و TYPE_APPLICATION_MEDIA استفاده نکنید.
  • با ذخیره کردن اشیایی که قبلا تخصیص داده شده اند، فعالیت را سریع راه اندازی کنید.
  • اگر نمی خواهید کاربر اندازه برنامه شما را تغییر دهد، android:resizeableActivity=false در فایل مانیفست خود مشخص کنید.
  • برنامه خود را آزمایش کنید تا مطمئن شوید که تغییرات اندازه پنجره را به درستی مدیریت می کند.