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

يتيح نظام التشغيل 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، يعتمد سلوك تغيير الحجم على كيفية ضبط نشاطك إذا كانت تعالج التغييرات ديناميكيًا، يتم تشغيل إعادة التركيب عندما يتغير حجم النافذة. إذا كان النشاط يعيد النظام تشغيل الجهاز، تظهر التركيبة الأولية بعد إعادة التشغيل. أيّ منهما الطريقة، من المهم إنشاء تخطيطات إنشاء تتكيف مع النافذة المتغيرة مختلفة. ولا تفترض أحجامًا ثابتة.

أبعاد النافذة

اطلب من أنشطتك قراءة أبعاد النوافذ في كل مرة تبدأ فيها ترتيب محتواها بناءً على الإعدادات الحالية.

لتحديد الإعدادات الحالية، يمكنك طلب 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 في ملف البيان
  • اختبار تطبيقك للتأكُّد من أنّه يعالج التغييرات في حجم النافذة بشكل مناسب.