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