Hỗ trợ camera trên nhiều kiểu dáng

Các ứng dụng Android chạy trên nhiều kiểu dáng, chứ không chỉ trên điện thoại ở chế độ dọc. Với sự ra mắt của tính năng màn hình kiểu máy tính, màn hình được kết nối và thiết bị có thể gập lại, ứng dụng camera của bạn phải thích ứng với kích thước cửa sổ động, tỷ lệ khung hình đa dạng và phần cứng bên ngoài.

Hình 1. Ví dụ về ứng dụng camera trên các màn hình khác nhau.

Lý do logic điện thoại bị gián đoạn

Các ứng dụng máy ảnh thường đưa ra những giả định gây ra lỗi nghiêm trọng trong môi trường có nhiều hệ số hình dạng.

Hướng tự nhiên

  • Giả định: Hướng tự nhiên ROTATION_0 của thiết bị luôn là hướng dọc
  • Thực tế: Trên máy tính bảng, màn hình bên trong của một số thiết bị có thể gập lại và màn hình máy tính, ROTATION_0 thường ở chế độ ngang
  • Kết quả: Bản xem trước bị xoay sai 90 độ
Hình 2. Khung ngắm của camera trước và sau khi áp dụng chế độ xoay chính xác.

Căn chỉnh cảm biến

  • Giả định: Cạnh dài của cảm biến máy ảnh khớp với cạnh dài của màn hình
  • Thực tế: Cửa sổ có thể thay đổi kích thước có thể ở dạng vuông hoặc ngang trong khi cảm biến vẫn cố định (thường là 4:3)
  • Kết quả: Hình ảnh bị kéo giãn hoặc bị biến dạng
Hình 3. Khung ngắm của camera trước và sau khi áp dụng hệ số tỷ lệ chính xác.

Mật độ và kích thước màn hình

  • Giả định: Mật độ và kích thước màn hình không thay đổi trong thời gian chạy
  • Thực tế: Trong môi trường máy tính, người dùng có thể tự do đổi kích thước cửa sổ
  • Kết quả: Việc khởi động lại phiên máy ảnh trong mỗi sự kiện kéo sẽ làm gián đoạn trải nghiệm người dùng và có thể gây ra sự cố

Giải pháp 1: Sử dụng ý định hệ thống

Nếu ứng dụng của bạn cần chụp ảnh hoặc quay video nhưng không yêu cầu giao diện camera tuỳ chỉnh chuyên biệt, thì cách tốt nhất để xử lý các hệ số hình dạng khác nhau là khởi chạy camera hệ thống được cài đặt sẵn trên thiết bị (xem Ý định về camera)

Việc sử dụng một ý định hệ thống sẽ uỷ quyền toàn bộ trải nghiệm chụp cho ứng dụng camera do nhà sản xuất thiết bị gốc (OEM) của thiết bị phát triển. Điều này giúp thuê ngoài hiệu quả sự phức tạp của việc hỗ trợ hệ số hình dạng, bao gồm:

  • Hỗ trợ xoay và đổi kích thước tích hợp – Ứng dụng camera mặc định trên một thiết bị có thể gập lại hoặc máy tính bảng được nhà sản xuất thiết kế rõ ràng để xử lý hình học của thiết bị cụ thể đó. Ứng dụng được thiết kế để hoạt động đúng cách khi thiết bị được mở ra, xoay hoặc chuyển sang chế độ nhiều cửa sổ.

  • Quyền truy cập vào các tính năng nâng cao của phần cứng – Các ứng dụng camera của OEM có quyền truy cập độc quyền vào các thuật toán được điều chỉnh theo phần cứng (chế độ ban đêm, HDR, chuyển đổi ống kính cụ thể) mà người dùng khó hoặc không thể sao chép theo cách thủ công.

Giải pháp 2: Sử dụng Jetpack CameraX

CameraX là một thư viện Jetpack được thiết kế để giúp việc phát triển ứng dụng camera trở nên dễ dàng hơn. CameraX nhận biết được vòng đời và hướng đến bề mặt. Không giống như Camera2 (yêu cầu tính toán lại hướng cảm biến và kích thước bề mặt theo cách thủ công mỗi khi thiết bị gập, xoay hoặc đổi kích thước), CameraX tự động xử lý việc định cấu hình lại các phiên camera trong quá trình đổi kích thước nhiều cửa sổ hoặc khi một ứng dụng di chuyển đến màn hình được kết nối, đảm bảo luồng xem trước thích ứng mà không bị giật hoặc kéo giãn.

Các thành phần như PreviewView quản lý một cách thông minh tỷ lệ khung hình và các loại tỷ lệ trên nhiều trạng thái, chẳng hạn như thiết bị có thể gập lại chuyển đổi từ màn hình ngoài sang màn hình trong, cho phép bạn hỗ trợ nhiều loại phần cứng bằng một cách triển khai duy nhất và nhất quán thay vì một tập hợp phức tạp các trường hợp đặc biệt dành riêng cho thiết bị.

Soạn thư

Với Jetpack Compose, hãy dùng thư viện androidx.camera:camera-compose chuyên dụng. Thư viện này cung cấp thành phần kết hợp CameraXViewfinder. Thành phần này được thiết kế đặc biệt để xử lý hình học phức tạp của việc đổi kích thước, xoay và tỷ lệ khung hình trong vòng đời Compose.

Thành phần CameraXViewfinder giúp loại bỏ những nguồn lỗi phổ biến nhất trong các ứng dụng camera:

  • Tự động chuyển đổi toạ độ – Một trong những phần khó nhất khi tạo ứng dụng camera là ánh xạ thao tác nhấn của người dùng (toạ độ x, y trên màn hình) sang hệ toạ độ của cảm biến camera (0-1, 0-1 xoay) để lấy nét và đo sáng. CameraXViewfinder cung cấp một CoordinateTransformer tự động xử lý phép tính, ngay cả khi cửa sổ được đổi kích thước hoặc thiết bị được gập lại.
  • Hành vi bố cục chính xác – Không giống như SurfaceView hoặc TextureView, CameraXViewfinder hoạt động chính xác với thứ tự z của Compose. Bạn có thể phủ các phần tử trên giao diện người dùng (vòng tiêu điểm, chế độ điều khiển) hoặc áp dụng các đối tượng sửa đổi (góc bo tròn, ảnh động) mà không cần kết xuất các thành phần giả.
  • Đổi kích thước và tỷ lệ khung hình: CameraXViewfinder xử lý nội bộ logic cắt ở giữa so với vừa ở giữa, đảm bảo bản xem trước không bị kéo giãn khi cửa sổ ứng dụng được đổi kích thước thành tỷ lệ khung hình không chuẩn (ví dụ: chế độ chia đôi màn hình hoặc chế độ cửa sổ trên máy tính).

Số lượt xem

Trên các ứng dụng dựa trên khung hiển thị, hãy dùng PreviewView hoặc ViewFinderView. Nếu sử dụng trực tiếp SurfaceView hoặc TextureView, bạn phải tự tính toán tỷ lệ khung hình và áp dụng ma trận biến đổi chính xác.

Giải pháp 3: Xử lý hướng và kích thước một cách linh hoạt

Khi sử dụng trực tiếp các API nền tảng, hãy lưu ý đến chế độ xoay thiết bị, hoạt động khởi động lại và tỷ lệ khung hình.

Ngừng sử dụng tính năng xoay thiết bị

Đừng chỉ dựa vào Display#getRotation() hoặc hướng cảm biến thực để xác định bố cục giao diện người dùng.

  • Sử dụng chỉ số cửa sổ – Xác định bố cục (giao diện người dùng ngang so với dọc) bằng cách so sánh chiều rộng và chiều cao của cửa sổ ứng dụng bằng WindowManager#getCurrentWindowMetrics().
  • Bỏ qua hướng tự nhiên – Ứng dụng của bạn có thể nằm trong một cửa sổ có hình dọc trên màn hình ngang. Hướng của thiết bị không liên quan đến ranh giới giao diện người dùng.

Tránh tình trạng hoạt động khởi động lại

Hành vi mặc định của Android sẽ huỷ hoạt động của ứng dụng khi có thay đổi về cấu hình (chẳng hạn như thay đổi kích thước cửa sổ). Đối với các ứng dụng camera, hiện tượng này xuất hiện dưới dạng màn hình nhấp nháy hoặc kết nối bị gián đoạn trong các cuộc gọi video.

Tỷ lệ khung hình và việc cắt

Một vấn đề thường gặp trên thiết bị có thể gập lại và cửa sổ trên máy tính là kéo giãn bản xem trước, trong đó nguồn cấp dữ liệu camera 4:3 bị ép vào cửa sổ 16:9 hoặc 1:1.

  • Không kéo giãn – Không bao giờ buộc vùng đệm camera khớp chính xác với ranh giới khung hiển thị nếu tỷ lệ khung hình của bản xem trước và cửa sổ khác nhau.
  • Cắt ở giữa (nên dùng): Điều chỉnh tỷ lệ bản xem trước để lấp đầy chiều ngắn nhất của cửa sổ và cắt phần thừa. Điều này đảm bảo đối tượng không bị biến dạng và lấp đầy khung hình.
  • Căn giữa cho vừa (lựa chọn thay thế): Nếu việc hiển thị toàn bộ trường nhìn là rất quan trọng (ví dụ: quét tài liệu), hãy tạo hiệu ứng hòm thư cho bản xem trước bên trong cửa sổ.
  • Căn giữa cho vừa (lựa chọn thay thế): Nếu việc hiển thị toàn bộ trường nhìn là rất quan trọng (ví dụ: quét tài liệu), hãy tạo hiệu ứng hòm thư cho bản xem trước bên trong cửa sổ.

Phần thưởng: Hỗ trợ trải nghiệm ưu tiên thiết bị có thể gập lại

Thiết bị có thể gập lại không chỉ là điện thoại có thể uốn cong, mà còn có các trạng thái phần cứng riêng biệt có thể cải thiện đáng kể cách người dùng chụp ảnh và quay video. Thay vì coi nếp gấp là một vấn đề cần giải quyết, hãy sử dụng nếp gấp để tạo các tính năng không thể có trên các thiết bị không gập lại được.

Chế độ mặt bàn (chụp ảnh không dùng tay)

Chế độ trên mặt bàn cho phép người dùng gập thiết bị một nửa và đặt thiết bị trên một bề mặt để thực hiện cuộc gọi video kéo dài, chụp ảnh tua nhanh thời gian và chụp ảnh đêm phơi sáng lâu.

Hình 5. Một ứng dụng giao tiếp ở chế độ mặt bàn: kính ngắm của camera nằm ở phía trên bản lề và các chế độ điều khiển nằm ở phía dưới.

Chế độ màn hình sau (ảnh tự chụp chân dung chất lượng cao)

  • Trên thiết bị có thể gập lại, camera sau thường có chất lượng cao hơn camera trước. Chế độ màn hình sau cho phép người dùng mở thiết bị và xoay thiết bị, sử dụng màn hình ngoài nhỏ làm kính ngắm trực tiếp cho camera sau chính.
  • Chế độ màn hình sau cho phép chụp ảnh tự sướng 50 MP trở lên, chụp ảnh nhóm siêu rộng và quay vlog chất lượng cao mà không cần mang theo thiết bị bổ sung.

Chế độ Dual Screen (bản xem trước về chủ đề)

  • Chế độ Dual Screen cho phép bạn trình chiếu bản xem trước của camera trên cả màn hình trong và ngoài cùng lúc. Tính năng này rất phù hợp để chụp ảnh người: đối tượng trong ảnh có thể nhìn thấy chính mình trên màn hình ngoài và điều chỉnh tư thế trong khi bạn căn khung hình trên màn hình trong.
  • Không giống như chế độ màn hình sau (di chuyển toàn bộ ứng dụng), chế độ màn hình đôi sẽ tạo một cửa sổ trình chiếu phụ trên màn hình ngoài.
Hình 5. Ứng dụng máy ảnh ở chế độ Dual Screen.