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

چرا منطق تلفن از کار میافتد؟
برنامههای دوربین اغلب فرضیاتی را در نظر میگیرند که باعث خرابیهای بحرانی در محیطهای چندفرمی میشود.
جهت گیری طبیعی
- فرض: جهت طبیعی دستگاه
ROTATION_0همیشه عمودی است - واقعیت: در تبلتها، صفحه نمایش داخلی برخی از دستگاههای تاشو و مانیتورهای دسکتاپ،
ROTATION_0اغلب افقی است. - نتیجه: پیشنمایش به اشتباه ۹۰ درجه میچرخد

ترازبندی حسگر
- فرض: لبه بلند سنسور دوربین با لبه بلند صفحه نمایش همتراز است
- واقعیت: یک پنجره با قابلیت تغییر اندازه میتواند مربع یا افقی باشد در حالی که حسگر ثابت میماند (معمولاً ۴:۳)
- نتیجه: تصاویر کشیده یا به هر نحوی کج و معوج

تراکم و اندازه صفحه نمایش
- فرض: چگالی و اندازه صفحه نمایش در زمان اجرا تغییر نمیکند
- واقعیت: در محیطهای دسکتاپ، کاربران آزادانه اندازه پنجرهها را تغییر میدهند
- نتیجه: راهاندازی مجدد جلسه دوربین در هر رویداد کشیدن، تجربه کاربری را مختل میکند و میتواند باعث خرابی شود.
راه حل ۱: استفاده از intent های سیستم
اگر برنامه شما نیاز به گرفتن عکس یا فیلم دارد اما به رابط کاربری دوربین سفارشی تخصصی نیاز ندارد، بهترین راه برای مدیریت فرم فاکتورهای مختلف، راهاندازی دوربین سیستم از پیش نصب شده دستگاه است (به بخش Camera intents مراجعه کنید).
استفاده از یک هدف سیستمی، کل تجربه ضبط را به برنامه دوربین توسعه داده شده توسط سازنده تجهیزات اصلی دستگاه (OEM) واگذار میکند. این امر به طور مؤثر پیچیدگی پشتیبانی از فاکتور فرم، از جمله موارد زیر را برونسپاری میکند :
پشتیبانی از تغییر اندازه و چرخش داخلی - برنامه دوربین پیشفرض روی یک گوشی تاشو یا تبلت، صریحاً توسط سازنده ساخته شده است تا هندسه خاص آن دستگاه را مدیریت کند. این برنامه به گونهای طراحی شده است که هنگام باز شدن، چرخش یا قرار گرفتن دستگاه در حالت چند پنجرهای، به درستی رفتار کند.
دسترسی به ویژگیهای سختافزاری پیشرفته - برنامههای دوربین OEM به الگوریتمهای تنظیمشده توسط سختافزار (حالت شب، HDR، تعویض لنز خاص) دسترسی انحصاری دارند که تکرار دستی آنها دشوار یا غیرممکن است.
راه حل ۲: استفاده از Jetpack CameraX
CameraX یک کتابخانه Jetpack است که برای کمک به آسانتر کردن توسعه برنامه دوربین ساخته شده است. CameraX از چرخه عمر آگاه و سطحگرا است. برخلاف Camera2 که هر زمان که دستگاه تا میشود، میچرخد یا تغییر اندازه میدهد، نیاز به محاسبه دستی جهت سنسور و اندازه سطوح دارد، CameraX به طور خودکار پیکربندی مجدد جلسات دوربین را در طول تغییر اندازه چند پنجره یا زمانی که یک برنامه به یک صفحه نمایش متصل منتقل میشود، انجام میدهد و تضمین میکند که جریان پیشنمایش بدون لکنت یا کشش تطبیق یابد.
اجزایی مانند PreviewView به طور هوشمندانه نسبت ابعاد و انواع مقیاس را در حالتهای مختلف، مانند انتقال تاشو از صفحه نمایش جلویی به صفحه نمایش داخلی، مدیریت میکنند و به شما این امکان را میدهند که به جای مجموعهای پیچیده از لبههای مخصوص دستگاه، از طیف متنوعی از سختافزارها با یک پیادهسازی واحد و سازگار پشتیبانی کنید.
نوشتن
با Jetpack Compose، از کتابخانه اختصاصی androidx.camera:camera-compose استفاده کنید. این کتابخانه، CameraXViewfinder composable را ارائه میدهد که به طور خاص برای مدیریت هندسه پیچیده تغییر اندازه، چرخش و نسبت ابعاد در چرخه عمر Compose طراحی شده است.
کامپوننت CameraXViewfinder رایجترین منابع خطا در برنامههای دوربین را از بین میبرد:
- تبدیل خودکار مختصات — یکی از سختترین بخشهای ساخت یک برنامه دوربین، نگاشت ضربه کاربر (مختصات x، y روی صفحه) به سیستم مختصات حسگر دوربین (چرخش ۰-۱، ۰-۱) برای فوکوس و نورسنجی است.
CameraXViewfinderیکCoordinateTransformerارائه میدهد که محاسبات را به طور خودکار انجام میدهد، حتی زمانی که اندازه پنجره تغییر میکند یا دستگاه تا میشود. - رفتار صحیح طرحبندی — برخلاف
SurfaceViewیاTextureView،CameraXViewfinderبه درستی با مرتبسازی z در Compose کار میکند. میتوانید عناصر رابط کاربری (حلقههای فوکوس، کنترلها) را روی هم قرار دهید یا اصلاحکنندهها (گرد کردن گوشهها، انیمیشنها) را بدون رندر کردن مصنوعات اعمال کنید. - تغییر اندازه و نسبت ابعاد :
CameraXViewfinderبه صورت داخلی منطق برش از مرکز در مقابل تناسب با مرکز را مدیریت میکند و تضمین میکند که هنگام تغییر اندازه پنجره برنامه به نسبتهای ابعاد غیراستاندارد (به عنوان مثال، حالت تقسیم صفحه یا پنجره دسکتاپ)، پیشنمایش کشیده نشود.
بازدیدها
در برنامههای مبتنی بر نما، PreviewView یا ViewFinderView استفاده کنید. اگر مستقیماً SurfaceView یا TextureView استفاده میکنید، باید نسبت ابعاد را محاسبه کرده و ماتریس تبدیل صحیح را خودتان اعمال کنید.
راه حل ۳: جهت گیری و تغییر اندازه را به صورت پویا مدیریت کنید
هنگام استفاده مستقیم از APIهای پلتفرم ، چرخش دستگاه، راهاندازی مجدد فعالیتها و نسبت ابعاد را در نظر داشته باشید.
استفاده از چرخش دستگاه را متوقف کنید
برای تعیین طرحبندی رابط کاربری خود، تنها به Display#getRotation() یا جهتگیری فیزیکی حسگر تکیه نکنید.
- استفاده از معیارهای پنجره — با مقایسه عرض و ارتفاع پنجره برنامه خود با استفاده از
WindowManager#getCurrentWindowMetrics()طرحبندی خود (رابط کاربری افقی در مقابل عمودی) را تعیین کنید. - نادیده گرفتن جهت طبیعی - ممکن است برنامه شما در یک مانیتور افقی در یک پنجره عمودی قرار داشته باشد. جهت دستگاه به محدودیتهای رابط کاربری شما ربطی ندارد.
از شروع مجدد فعالیتها خودداری کنید
رفتار پیشفرض اندروید، فعالیت برنامه شما را در هنگام تغییرات پیکربندی (مانند تغییر اندازه پنجره) از بین میبرد. برای برنامههای دوربین، این به صورت چشمک زدن صفحه نمایش یا قطع شدن اتصال در طول تماسهای ویدیویی ظاهر میشود.
- پیکربندی مانیفست — تغییرات پیکربندی را در مانیفست خود اعلام کنید تا تغییر اندازه بدون راهاندازی مجدد انجام شود.
- بهروزرسانیهای پویا — در
onConfigurationChanged()، پارامترهای طرحبندی پیشنمایش دوربین خود را بهروزرسانی کنید تا با اندازه پنجره جدید مطابقت داشته باشد.
نسبت ابعاد و برش
یک مشکل رایج در نمایشگرهای تاشو و پنجرههای دسکتاپ، کشش پیشنمایش است، که در آن تصویر دوربین با نسبت تصویر ۴:۳ به اجبار وارد یک پنجره با نسبت تصویر ۱۶:۹ یا ۱:۱ میشود.
- کشش ندهید — اگر نسبت ابعاد پیشنمایش و پنجره متفاوت است، هرگز بافر دوربین را مجبور نکنید که دقیقاً با مرزهای نما مطابقت داشته باشد.
- برش مرکزی (توصیه میشود): پیشنمایش را طوری مقیاسبندی کنید که کوتاهترین بُعد پنجره را پر کند و اضافی آن را برش دهید. این کار تضمین میکند که سوژه بدون اعوجاج باقی میماند و قاب را پر میکند.
- مرکز صفحه (جایگزین): اگر نمایش کل میدان دید بسیار مهم است (مثلاً اسکن یک سند)، پیشنمایش را در داخل پنجره با کادر حروف بزرگ نمایش دهید.
- مرکز صفحه (جایگزین): اگر نمایش کل میدان دید بسیار مهم است (مثلاً اسکن یک سند)، پیشنمایش را در داخل پنجره با کادر حروف بزرگ نمایش دهید.
مزیت: پشتیبانی از اولین تجربههای تاشو
دستگاههای تاشو فقط گوشیهایی نیستند که خم میشوند، بلکه حالتهای سختافزاری منحصر به فردی ارائه میدهند که میتوانند اساساً نحوهی عکسبرداری و فیلمبرداری کاربران را بهبود بخشند. به جای اینکه با تا شدن به عنوان یک مشکل برای حل کردن برخورد کنید، از آن برای ساخت ویژگیهایی استفاده کنید که در دستگاههای غیر تاشو غیرممکن است.
حالت تبلت (ضبط بدون دخالت دست)
حالت تبلتب به کاربران این امکان را میدهد که دستگاه را تا نیمه تا کنند و آن را برای تماسهای ویدیویی طولانی، عکاسی تایملپس و عکاسی در شب با نوردهی طولانی، روی یک سطح قرار دهند.

حالت نمایشگر پشتی (سلفیهای با کیفیت بالا)
- در گوشیهای تاشو، دوربینهای عقب معمولاً کیفیت بالاتری نسبت به دوربینهای رو به کاربر دارند. حالت نمایش از پشت به کاربر این امکان را میدهد که دستگاه را باز کرده و آن را بچرخاند و از صفحه نمایش کوچک رویی به عنوان منظرهیاب زنده برای دوربین اصلی عقب استفاده کند.
- حالت نمایشگر پشتی امکان ثبت سلفیهای ۵۰ مگاپیکسلی+، عکسهای گروهی فوق عریض و ویدئوبلاگ با کیفیت بالا را بدون حمل تجهیزات اضافی فراهم میکند.
حالت دو صفحهای (پیشنمایش سوژه)
- حالت دو صفحهای به شما امکان میدهد پیشنمایش دوربین را به طور همزمان در هر دو صفحه نمایش داخلی و خارجی نشان دهید. این حالت برای عکاسی از افراد عالی است: سوژههای عکس میتوانند خود را در صفحه نمایش خارجی ببینند و ژست خود را تنظیم کنند در حالی که شما کادربندی عکس را در صفحه نمایش داخلی انجام میدهید.
- برخلاف حالت نمایشگر پشتی (که کل برنامه را جابجا میکند)، حالت دو صفحهای یک پنجره ارائه ثانویه روی صفحه جلویی ایجاد میکند.
