تعمل تطبيقات Android على أشكال أجهزة أكثر من مجرد الهواتف التي يتم حملها في الوضع العمودي. مع طرح ميزة "العرض في نافذة" والشاشات المتصلة والأجهزة القابلة للطي، يجب أن يتكيّف تطبيق الكاميرا مع أحجام النوافذ الديناميكية ونسب العرض إلى الارتفاع المختلفة والأجهزة الخارجية.
أسباب تعذُّر عمل منطق الهاتف
غالبًا ما تفترض تطبيقات الكاميرا بعض الافتراضات التي تؤدي إلى حدوث أعطال خطيرة في البيئات المتعددة الأشكال.
الاتجاه الطبيعي
- الافتراض: يكون الاتجاه الطبيعي للجهاز
ROTATION_0عموديًا دائمًا - الحقيقة: على الأجهزة اللوحية والشاشة الداخلية لبعض الهواتف القابلة للطي وشاشات الكمبيوتر، يكون اتجاه
ROTATION_0أفقيًا في أغلب الأحيان. - النتيجة: يتم تدوير المعاينة بشكلٍ غير صحيح بزاوية 90 درجة
محاذاة أجهزة الاستشعار
- الافتراض: يتوافق الحافة الطويلة لجهاز استشعار الكاميرا مع الحافة الطويلة للشاشة
- الواقع: يمكن أن تكون النافذة القابلة لتغيير الحجم مربّعة أو أفقية بينما يظل المستشعر ثابتًا (عادةً 4:3)
- النتيجة: صور ممدودة أو مشوّهة بطريقة أخرى
كثافة الشاشة وحجمها
- الافتراض: لا تتغيّر كثافة الشاشة وحجمها في وقت التشغيل
- الحقيقة: في بيئات أجهزة الكمبيوتر، يمكن للمستخدمين تغيير حجم النوافذ بحرية
- النتيجة: تؤدي إعادة تشغيل جلسة الكاميرا في كل حدث سحب إلى تعطيل تجربة المستخدم وقد تتسبّب في حدوث أعطال.
الحلّ 1: استخدام أغراض النظام
إذا كان تطبيقك يحتاج إلى التقاط صورة أو فيديو ولكنّه لا يتطلّب واجهة كاميرا مخصّصة، فإنّ أفضل طريقة للتعامل مع أشكال الأجهزة المختلفة هي تشغيل كاميرا النظام المثبّتة مسبقًا على الجهاز (راجِع أهداف الكاميرا).
يؤدي استخدام هدف النظام إلى تفويض تجربة الالتقاط بأكملها إلى تطبيق الكاميرا الذي طوّره مصنّع الأجهزة الأصلية (OEM) للجهاز. يؤدي ذلك إلى الاستعانة بمصادر خارجية للتعامل مع تعقيد إتاحة عامل الشكل، بما في ذلك:
التوافق مع تغيير الحجم والتدوير المضمّن: تم تصميم تطبيق الكاميرا التلقائي على الأجهزة اللوحية أو الهواتف القابلة للطي بشكل صريح من قِبل الشركة المصنّعة للتعامل مع تصميم الجهاز المحدّد. تم تصميم التطبيق ليعمل بشكل سليم عند فتح الجهاز أو تدويره أو وضعه في وضع النوافذ المتعددة.
الوصول إلى ميزات الأجهزة المتقدّمة: يمكن لتطبيقات الكاميرا التي يوفّرها المصنّع الأصلي للجهاز الوصول حصريًا إلى الخوارزميات المعدَّلة للأجهزة (مثل الوضع الليلي والنطاق العالي الديناميكية وتبديل العدسات المحدّد) التي يصعب أو يستحيل تكرارها يدويًا.
الحلّ 2: استخدام Jetpack CameraX
CameraX هي مكتبة Jetpack مصمّمة للمساعدة في تسهيل عملية تطوير تطبيقات الكاميرا. تتضمّن CameraX ميزة التوافق مع دورة الحياة وميزة التوافق مع مساحة العرض. على عكس Camera2 التي تتطلّب إعادة احتساب اتجاه المستشعر وأحجام السطح يدويًا كلما تم طي الجهاز أو تدويره أو تغيير حجمه، تتعامل CameraX تلقائيًا مع إعادة ضبط إعدادات جلسات الكاميرا أثناء تغيير حجم النوافذ المتعددة أو عند نقل تطبيق إلى شاشة متصلة، ما يضمن تكيُّف بث المعاينة بدون تقطّع أو تمديد.
تتولّى المكوّنات، مثل PreviewView، إدارة نسبة العرض إلى الارتفاع وأنواع المقاييس بذكاء في حالات مختلفة، مثل الانتقال من شاشة الغطاء إلى الشاشة الداخلية في الأجهزة القابلة للطي، ما يتيح لك توفير الدعم لمجموعة متنوعة من الأجهزة من خلال عملية تنفيذ واحدة ومتسقة بدلاً من مجموعة معقّدة من حالات الاستخدام الخاصة بالأجهزة.
إنشاء
مع Jetpack Compose، استخدِم مكتبة androidx.camera:camera-compose المخصّصة. توفّر المكتبة العنصر القابل للإنشاء CameraXViewfinder، وهو مصمَّم خصيصًا للتعامل مع الأشكال الهندسية المعقّدة الخاصة بتغيير الحجم والتدوير ونسب العرض إلى الارتفاع ضمن دورة حياة Compose.
يزيل المكوّن CameraXViewfinder المصادر الأكثر شيوعًا للأخطاء في تطبيقات الكاميرا، وهي:
- تحويل الإحداثيات التلقائي: من أصعب جوانب إنشاء تطبيق كاميرا هو ربط نقرة المستخدم (إحداثيات x وy على الشاشة) بنظام إحداثيات مستشعر الكاميرا (0-1، 0-1 تم تدويره) للتركيز وقياس الإضاءة.
توفّر
CameraXViewfinderCoordinateTransformerيتعامل مع العمليات الحسابية تلقائيًا، حتى عند تغيير حجم النافذة أو طي الجهاز. - سلوك التنسيق الصحيح: على عكس
SurfaceViewأوTextureView، تعملCameraXViewfinderبشكل صحيح مع ترتيب العناصر حسب محور z في Compose. يمكنك إضافة عناصر واجهة المستخدم (حلقات التركيز وعناصر التحكّم) أو تطبيق معدّلات (تدوير الزوايا والحركات) بدون عرض أي تشوّهات. - تغيير الحجم ونسبة العرض إلى الارتفاع: تعالج
CameraXViewfinderداخليًا منطق القص في الوسط مقابل الملاءمة في الوسط، ما يضمن عدم تمدّد المعاينة عند تغيير حجم نافذة التطبيق إلى نسب عرض إلى ارتفاع غير عادية (على سبيل المثال، وضع تقسيم الشاشة أو وضع النوافذ على الكمبيوتر المكتبي).
المشاهدات
في التطبيقات المستندة إلى العرض، استخدِم PreviewView أو ViewFinderView.
إذا كنت تستخدم SurfaceView أو TextureView مباشرةً، عليك حساب نسبة العرض إلى الارتفاع وتطبيق مصفوفة التحويل الصحيحة بنفسك.
الحلّ 3: التعامل مع الاتجاه وتغيير الحجم بشكلٍ ديناميكي
عند استخدام واجهات برمجة التطبيقات الخاصة بالمنصة مباشرةً، ضَع في اعتبارك تدوير الجهاز وإعادة تشغيل النشاط ونسبة العرض إلى الارتفاع.
إيقاف استخدام ميزة تدوير الشاشة
لا تعتمد على Display#getRotation() أو اتجاه جهاز الاستشعار الفعلي وحدهما لتحديد تخطيط واجهة المستخدم.
- استخدام مقاييس النافذة: حدِّد تصميمك (واجهة مستخدم أفقية أو عمودية) من خلال مقارنة عرض نافذة التطبيق وارتفاعها باستخدام
WindowManager#getCurrentWindowMetrics(). - تجاهل الاتجاه الطبيعي: قد يظهر تطبيقك في نافذة عمودية الشكل على شاشة أفقية. لا صلة بين اتجاه الجهاز وحدود واجهة المستخدم.
تجنُّب إعادة تشغيل الأنشطة
يؤدي السلوك التلقائي لنظام التشغيل Android إلى إيقاف نشاط تطبيقك عند حدوث تغييرات في الإعدادات (مثل تغيير حجم النافذة). بالنسبة إلى تطبيقات الكاميرا، يظهر ذلك على شكل وميض في الشاشة أو انقطاع في الاتصال أثناء مكالمات الفيديو.
- إعدادات ملف البيان: يمكنك الإعلان عن تغييرات الإعدادات في ملف البيان للتعامل مع تغيير الحجم بدون إعادة التشغيل.
- التحديثات الديناميكية: في
onConfigurationChanged()، عدِّل مَعلمات تنسيق معاينة الكاميرا لتتطابق مع حجم النافذة الجديد.
نسبة العرض إلى الارتفاع والاقتصاص
من المشاكل الشائعة على الأجهزة القابلة للطي ونوافذ سطح المكتب توسيع المعاينة، حيث يتم فرض عرض بث الكاميرا بنسبة 4:3 في نافذة بنسبة 16:9 أو 1:1.
- عدم التمديد: لا تجبر أبدًا مخزن الكاميرا المؤقت على مطابقة حدود العرض تمامًا إذا اختلفت نسب العرض إلى الارتفاع للمعاينات والنوافذ.
- القص من الوسط (يُنصح به): يتم تغيير حجم المعاينة لملء أقصر بُعد في النافذة وقص الجزء الزائد. يضمن ذلك بقاء الجسم غير مشوّه وملء الإطار.
- توسيط الصورة (بديل): إذا كان عرض مجال الرؤية الكامل أمرًا بالغ الأهمية (على سبيل المثال، مسح مستند ضوئيًا)، يمكنك عرض معاينة الصورة داخل النافذة مع إضافة مساحة فارغة على الجانبين.
- توسيط الصورة (بديل): إذا كان عرض مجال الرؤية الكامل أمرًا بالغ الأهمية (على سبيل المثال، مسح مستند ضوئيًا)، يمكنك عرض معاينة الصورة داخل النافذة مع إضافة مساحة فارغة على الجانبين.
ميزة إضافية: توفير تجارب مخصّصة للأجهزة القابلة للطي
الأجهزة القابلة للطي ليست مجرد هواتف يمكن ثنيها، بل توفّر حالات فريدة للأجهزة يمكنها تحسين طريقة التقاط المستخدمين للصور والفيديوهات بشكل أساسي. بدلاً من التعامل مع الطي كمشكلة يجب حلّها، استخدِم الطي لإنشاء ميزات لا يمكن توفيرها على الأجهزة غير القابلة للطي.
وضع "التثبيت على سطح مستوٍ" (التقاط الصور بدون لمس الجهاز)
يتيح وضع "التثبيت على سطح مستوٍ" للمستخدمين طي الجهاز إلى نصفين ووضعه على سطح لإجراء مكالمات فيديو مطوّلة والتقاط صور بفاصل زمني وصور ليلية بتعريض ضوئي طويل.
وضع الشاشة الخلفية (صور سيلفي عالية الجودة)
- في الهواتف القابلة للطي، تكون الكاميرات الخلفية عادةً أعلى جودة من الكاميرات المواجهة للمستخدم. يتيح وضع الشاشة الخلفية للمستخدم فتح الجهاز وقلبه، واستخدام شاشة الغطاء الصغيرة كعدسة عرض مباشرة للكاميرا الخلفية الرئيسية.
- يتيح لك وضع "الشاشة الخلفية" التقاط صور سيلفي بدقة 50 ميغابكسل أو أكثر، وصور جماعية بزاوية عريضة جدًا، وإنشاء مدوّنات فيديو بجودة عالية بدون الحاجة إلى معدّات إضافية.
وضع الشاشة المزدوجة (معاينة الموضوع)
- يتيح لك وضع الشاشة المزدوجة عرض معاينة الكاميرا على كلتا الشاشتَين الداخلية والخارجية في الوقت نفسه. هذه الميزة مثالية لتصوير الأشخاص، إذ يمكن للأشخاص الذين يتم تصويرهم رؤية أنفسهم على الشاشة الخارجية وضبط وضعياتهم، بينما يمكنك ضبط إطار اللقطة على الشاشة الداخلية.
- على عكس وضع الشاشة الخلفية (الذي ينقل التطبيق بأكمله)، ينشئ وضع الشاشة المزدوجة نافذة عرض ثانوية على شاشة الغطاء.