مدیریت پنجره

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

یک پنجره برنامه در دستگاه‌های مختلف.
شکل ۱ .: عنوان اینجا قرار می‌گیرد.

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

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

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

اندازه پرتاب اولیه

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

  • فقط در محیط‌های دسکتاپ از اندازه‌ی راه‌اندازی استفاده کنید. این به مدیر پنجره کمک می‌کند تا مرزها و جهت‌گیری مناسب را به شما ارائه دهد. برای نشان دادن تنظیمات برگزیده هنگام استفاده در حالت دسکتاپ، متا تگ‌های زیر را داخل <activity> اضافه کنید:

    &lt;meta-data android:name=&#34;WindowManagerPreference:FreeformWindowSize&#34;
               android:value=&#34;[phone|tablet|maximize]&#34; /&gt;
    &lt;meta-data android:name=&#34;WindowManagerPreference:FreeformWindowOrientation&#34;
               android:value=&#34;[portrait|landscape]&#34; /&gt;
    
  • از محدوده‌های راه‌اندازی استاتیک استفاده کنید. از <layout> در ورودی مانیفست فعالیت خود برای مشخص کردن اندازه شروع "ثابت" استفاده کنید، مانند مثال زیر:

    &lt;layout android:defaultHeight=&#34;500dp&#34;
                android:defaultWidth=&#34;600dp&#34;
                android:gravity=&#34;top|end&#34;
                android:minHeight=&#34;450dp&#34;
                android:minWidth=&#34;300dp&#34; /&gt;
    
  • از محدوده‌های راه‌اندازی پویا استفاده کنید. یک فعالیت می‌تواند ActivityOptions.setLaunchBounds(Rect) را ایجاد و هنگام ایجاد یک فعالیت جدید از آن استفاده کند. با مشخص کردن یک مستطیل خالی، برنامه شما می‌تواند به حداکثر اندازه خود برسد.

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

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

شکل ۲. : عنوان اینجا قرار می‌گیرد.

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

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

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

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

ابعاد پنجره

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

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

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

مرزهای محتوا

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

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

    • 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)) اضافه کنید.

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

تغییر اندازه به صورت آزاد

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ملاحظات دیگر

در اینجا چند نکته دیگر وجود دارد که باید هنگام کار با برنامه‌های اندروید در ChromeOS در نظر بگیرید:

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