إدارة النوافذ

يتوافق نظام التشغيل 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. ربما لا تحتاج أبدًا إلى استخدام حجم الشاشة.

حدود المحتوى

يمكن أن تتغير حدود محتوى النافذة بعد تغيير حجمها. على سبيل المثال، يمكن أن تتغير المنطقة الموجودة داخل النافذة التي يستخدمها التطبيق إذا أصبحت النافذة كبيرة جدًا بحيث لا تناسب الشاشة. عليك اتّباع الإرشادات التالية:

  • يتم إدراج التطبيقات التي تستخدم عملية تخطيط Android تلقائيًا في المساحة المتاحة.
  • تحتاج التطبيقات الأصلية إلى قراءة المنطقة المتاحة ومراقبة تغييرات الحجم لتجنب وجود عناصر في واجهة المستخدم لا يمكن الوصول إليها. قم باستدعاء الطرق التالية لتحديد الحجم الأولي المتاح لهذا السطح:

    • 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 تغيير حجم أي نافذة بحرية: يمكن للمستخدم تغيير عرض النافذة وارتفاعها وموضعها على الشاشة. تتم كتابة العديد من تطبيقات Android دون مراعاة تغيير حجم النموذج المجاني. ضع في اعتبارك هذه المشكلات:

  • قد يتغيّر موضع الشاشة. استخدام النظام دائمًا لإجراء عمليات تحويل تنسيقية من نافذة إلى شاشة ومن شاشة إلى أخرى
  • إذا كنت تستخدم نظام العرض في Android، فسيتغير تخطيط النافذة تلقائيًا عند تغيير حجمها.
  • إذا كنت لا تستخدم نظام العرض وتسيطرت على السطح، يجب أن يتعامل تطبيقك مع تغييرات الحجم من تلقاء نفسه.
  • بالنسبة إلى التطبيقات الأصلية، يمكنك استخدام عناصر mLastContent أو استخدام عرض المحتوى لتحديد الحجم الأولي.
  • عندما يكون التطبيق قيد التشغيل، يمكنك الاستماع إلى حدثَي onContentRectChangedNative أو onGlobalLayout للتفاعل مع تغييرات الحجم.
  • عندما يتغير حجم التطبيق، أعِد ضبط حجم التصاميم والأعمال الفنية أو أعِد تحميلها وعدِّل مناطق الإدخال.

وضع ملء الشاشة

يعمل وضع "ملء الشاشة" بالطريقة نفسها التي يعمل بها وضع "ملء الشاشة" على أجهزة Android. في حال كانت النافذة لا تغطي وضع ملء الشاشة، يتم تجاهل طلبات ملء الشاشة (إخفاء جميع عناصر واجهة مستخدم النظام). عند تكبير التطبيق، يتم تنفيذ الطرق والتخطيطات والوظائف العادية بملء الشاشة. يؤدي هذا إلى إخفاء عناصر واجهة المستخدم الخاصة بالنظام (شريط التحكم في النافذة والرف).

اتجاه الشاشة

الاتجاه الأكثر شيوعًا لتطبيق Android هو الاتجاه الرأسي، لأن هذه هي طريقة حمل معظم الهواتف. في حين أن الوضع العمودي مناسب للهواتف، إلا أنه سيئ لأجهزة الكمبيوتر المحمولة والأجهزة اللوحية، حيث يفضل الوضع الأفقي. للحصول على أفضل النتائج لتطبيقك، ضع في اعتبارك دعم كلا الاتجاهين.

تفترض بعض تطبيقات Android أنّه عند حمل الجهاز في الوضع العمودي، تكون قيمة التدوير Surface.ROTATION_0. قد يكون هذا صحيحًا على معظم أجهزة Android. مع ذلك، عندما يكون التطبيق في وضع ARC معيّن، قد لا تكون قيمة التدوير للاتجاه الرأسي هي Surface.ROTATION_0.

للحصول على قيمة دوران دقيقة أثناء قراءة مقياس التسارع أو أجهزة الاستشعار المشابهة، استخدِم طريقة Display.getRotation() بدِّل المحور وفقًا لذلك.

نشاط الجذر واتجاهه

تتكون نافذة Chromebook من حزمة من نوافذ الأنشطة. كل نافذة في المكدس لها نفس الحجم والاتجاه.

تؤدي التغييرات المفاجئة في الاتجاه والحجم إلى إرباك المستخدمين في بيئة سطح المكتب. يتجنّب مدير النوافذ في Chromebook ذلك بطريقة مشابهة للوضع جنبًا إلى جنب في Android: النشاط أسفل الحزمة يتحكم في سمات جميع الأنشطة فوقه. قد يؤدي ذلك إلى مواقف غير متوقعة حيث يصبح النشاط الذي تم بدؤه حديثًا والذي يكون عموديًا ولا يمكن تغيير حجمه أفقيًا وتغيير حجمه.

يؤثر وضع الجهاز هنا: في وضع الجهاز اللوحي، لا يكون الاتجاه مؤمّنًا، وتحافظ كل نافذة على اتجاهها الخاص، كما هو معتاد في Android.

إرشادات الاتجاه

اتّبِع الإرشادات التالية للتعامل مع الاتجاه:

  • وإذا كنت تتيح استخدام اتجاه واحد فقط، أضِف المعلومات إلى البيان حتى يعرفها مدير النوافذ قبل بدء التطبيق. عند تحديد الاتجاه، حدد أيضًا اتجاهات أداة الاستشعار متى أمكن. غالبًا ما تكون أجهزة Chromebook قابلة للتحويل، ويترك استخدام التطبيق المقلوبًا تجربة سيئة للمستخدم.
  • حاوِل تثبيت المحتوى في اتجاه واحد محدّد. تجنَّب طلب اتجاه في البيان وضبط اتجاه آخر آليًا في وقت لاحق.
  • احرص على تغيير الاتجاه استنادًا إلى حجم النافذة. قد يعلق المستخدم في نافذة صغيرة ذات حجم عمودي ولا يتمكن من العودة إلى نافذة أفقية أكبر.
  • هناك عناصر تحكم في النوافذ في Chrome للتبديل بين جميع التخطيطات المتاحة. ومن خلال تحديد خيار الاتجاه الصحيح، يمكنك التأكد من أن المستخدم لديه التنسيق الصحيح بعد تشغيل التطبيق. وإذا كان التطبيق متاحًا في الوضع العمودي والأفقي، يمكنك جعله الإعداد التلقائي للعرض الأفقي، إن أمكن. بعد تعيين هذا الخيار، يتم تذكره على أساس كل تطبيق.
  • حاول تجنُّب التغييرات غير الضرورية في الاتجاه. على سبيل المثال، إذا كان اتجاه النشاط عموديًا، ولكن يطلب التطبيق setRequestedOrientation(LANDSCAPE) في وقت التشغيل، سيتسبّب ذلك في تغيير حجم النوافذ بشكل غير ضروري، ما يزعج المستخدم وقد يعيد تشغيل التطبيق ولا يمكنه التعامل معه. من الأفضل تعيين الاتجاه مرة واحدة، على سبيل المثال، في البيان، وتغييره فقط عند الضرورة.

اعتبارات أخرى

في ما يلي بعض الأمور الأخرى التي يجب مراعاتها عند التعامل مع تطبيقات Android في نظام التشغيل ChromeOS:

  • عدم طلب الرقم finish() من خلال طريقة onDestroy الخاصة بنشاطك يؤدي هذا إلى إغلاق التطبيق عند تغيير الحجم وعدم إعادة تشغيله.
  • ولا تستخدم أنواع النوافذ غير المتوافقة، مثل TYPE_KEYGUARD وTYPE_APPLICATION_MEDIA.
  • جعل النشاط يبدأ بسرعة من خلال التخزين المؤقت للعناصر التي تم تخصيصها سابقًا.
  • إذا كنت لا تريد أن يغيِّر المستخدم حجم تطبيقك، حدِّد القيمة android:resizeableActivity=false في ملف البيان.
  • اختبر تطبيقك للتأكد من أنه يتعامل مع التغييرات في حجم النافذة بشكل مناسب.