Developer sering kali mengalami kesulitan unik saat membuat aplikasi untuk perangkat foldable—terutama perangkat seperti Samsung Trifold atau Pixel Fold asli, yang dibuka dalam format lanskap (rotation_0 = lanskap). Kesalahan developer mencakup:
- Asumsi yang salah tentang orientasi perangkat
- Kasus penggunaan yang terlewatkan
- Kegagalan menghitung ulang atau menyimpan nilai dalam cache di seluruh perubahan konfigurasi
Masalah khusus terkait perangkat mencakup:
- Ketidakcocokan dalam orientasi alami perangkat antara layar penutup dan layar dalam (asumsi berdasarkan rotation_0 = potret), yang menyebabkan aplikasi gagal dalam perjalanan lipat dan bentang
- Kepadatan layar yang berbeda dan penanganan perubahan konfigurasi density yang salah
- Masalah pratinjau kamera yang disebabkan oleh dependensi sensor kamera pada orientasi alami
Untuk memberikan pengalaman pengguna berkualitas tinggi di perangkat foldable, fokuslah pada area penting berikut:
- Tentukan orientasi aplikasi berdasarkan area layar sebenarnya yang ditempati aplikasi, bukan orientasi fisik perangkat
- Perbarui pratinjau kamera untuk mengelola orientasi perangkat dan rasio lebar tinggi dengan benar, hindari pratinjau samping, dan cegah gambar yang diregangkan atau dipangkas
- Pertahankan kontinuitas aplikasi selama perangkat dilipat atau dibentangkan dengan baik
mempertahankan status dengan
ViewModelatau pendekatan serupa, atau secara manual menangani perubahan kepadatan layar dan perubahan orientasi, yang menghindari aplikasi dimulai ulang atau kehilangan status - Untuk aplikasi yang menggunakan sensor gerakan, sesuaikan sistem koordinat agar selaras dengan orientasi layar saat ini dan hindari asumsi berdasarkan rotation_0 = potret, yang menjamin interaksi pengguna yang akurat
Mem-build aplikasi adaptif
Jika aplikasi Anda sudah adaptif dan mematuhi tingkat yang dioptimalkan (Tingkat 2) yang diuraikan dalam Pedoman kualitas aplikasi adaptif, aplikasi akan berfungsi dengan baik di perangkat foldable. Jika tidak, sebelum memeriksa ulang detail spesifik perangkat foldable trifold dan lanskap, tinjau konsep pengembangan adaptif Android dasar berikut.
Tata letak adaptif
UI Anda harus menangani tidak hanya ukuran layar yang berbeda, tetapi juga perubahan rasio lebar tinggi secara real-time, seperti membentangkan dan memasuki mode multi-aplikasi atau mode jendela desktop. Lihat Tentang tata letak adaptif untuk panduan lebih lanjut tentang cara:
- Mendesain dan menerapkan tata letak adaptif
- Menyesuaikan navigasi utama aplikasi berdasarkan ukuran jendela
- Menggunakan class ukuran jendela untuk menyesuaikan UI aplikasi
- Menyederhanakan penerapan tata letak kanonis, seperti detail daftar, menggunakan Jetpack API
Class ukuran jendela
Perangkat foldable, termasuk perangkat foldable lanskap dan trifold, dapat beralih antara class ukuran jendela ringkas, sedang, dan diperluas secara instan. Memahami dan menerapkan class ini akan memastikan aplikasi Anda menampilkan komponen navigasi dan kepadatan konten yang benar untuk status perangkat saat ini.
Contoh berikut menggunakan library adaptif Material 3 untuk menentukan jumlah ruang
yang tersedia bagi aplikasi dengan memanggil fungsi
currentWindowAdaptiveInfo() terlebih dahulu, lalu menggunakan tata letak
yang sesuai untuk tiga class ukuran jendela:
val adaptiveInfo = currentWindowAdaptiveInfo()
val windowSizeClass = adaptiveInfo.windowSizeClass
when {
windowSizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_EXPANDED_LOWER_BOUND) -> // Expanded
windowSizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_MEDIUM_LOWER_BOUND) -> // Medium
else -> // Compact
}
Untuk mengetahui informasi selengkapnya, lihat Menggunakan class ukuran jendela.
Kualitas aplikasi adaptif
Mematuhi Tingkat 2 (Aplikasi adaptif dioptimalkan) atau Tingkat 1 (Aplikasi adaptif dibedakan) dari Pedoman kualitas aplikasi adaptif akan memastikan aplikasi Anda memberikan pengalaman pengguna yang menarik di perangkat trifold, perangkat foldable lanskap, dan perangkat layar besar lainnya. Pedoman ini mencakup pemeriksaan penting di beberapa tingkat untuk beralih dari siap adaptif ke pengalaman yang dibedakan.
Android 16 dan yang lebih baru
Untuk aplikasi yang menargetkan Android 16 (level API 36) dan yang lebih baru, sistem akan mengabaikan batasan orientasi, ukuran yang dapat diubah, dan rasio lebar tinggi pada layar dengan lebar terkecil >= 600 dp. Aplikasi mengisi seluruh jendela tampilan, terlepas dari rasio lebar tinggi atau orientasi pilihan pengguna, dan mode kompatibilitas letterboxing tidak lagi digunakan.
Pertimbangan khusus
Perangkat foldable trifold dan lanskap memperkenalkan perilaku hardware unik yang memerlukan penanganan khusus, terutama terkait sensor, pratinjau kamera, dan kontinuitas konfigurasi (mempertahankan status saat melipat, membentangkan, atau mengubah ukuran).
Pratinjau kamera
Masalah umum pada perangkat foldable lanskap atau perhitungan rasio lebar tinggi (dalam skenario seperti multi-aplikasi, jendela desktop, atau layar terhubung), adalah saat pratinjau kamera tampak diregangkan, samping, dipangkas, atau diputar.
Asumsi yang tidak cocok
Masalah ini sering terjadi pada perangkat layar besar dan perangkat foldable karena aplikasi dapat mengasumsikan hubungan tetap antara fitur kamera—seperti rasio lebar tinggi dan orientasi sensor—dan fitur perangkat—seperti orientasi perangkat dan orientasi alami.
Faktor bentuk baru menantang asumsi ini. Perangkat foldable dapat mengubah ukuran layar dan rasio lebar tinggi tanpa mengubah rotasi perangkat. Misalnya, membentangkan perangkat akan mengubah rasio lebar tinggi, tetapi jika pengguna tidak memutar perangkat, rotasinya akan tetap sama. Jika aplikasi mengasumsikan bahwa rasio lebar tinggi berkorelasi dengan rotasi perangkat, aplikasi mungkin akan memutar atau menskalakan pratinjau kamera secara tidak benar. Hal yang sama dapat terjadi jika aplikasi mengasumsikan orientasi sensor kamera cocok dengan orientasi perangkat potret, yang tidak selalu berlaku untuk perangkat foldable lanskap.
Solusi 1: Jetpack CameraX (Terbaik)
Solusi yang paling sederhana dan paling kuat adalah menggunakan library Jetpack CameraX. Elemen UI
PreviewView dirancang untuk menangani semua kompleksitas pratinjau
secara otomatis:
PreviewViewmenyesuaikan orientasi sensor, rotasi perangkat, dan penskalaan dengan benar.- Aplikasi ini mempertahankan rasio lebar tinggi gambar kamera, biasanya dengan memusatkan dan memangkas (FILL_CENTER).
- Anda dapat menetapkan jenis skala ke
FIT_CENTERuntuk memberi letterbox pada pratinjau jika diperlukan.
Untuk mengetahui informasi selengkapnya, lihat Mengimplementasikan pratinjau dalam dokumentasi CameraX.
Solusi 2: CameraViewfinder
Jika Anda menggunakan codebase Camera2 yang ada, library CameraViewfinder (kompatibel dengan versi sebelumnya hingga level API 21) adalah solusi modern lainnya. Library ini menyederhanakan tampilan feed kamera dengan menggunakan TextureView atau SurfaceView dan menerapkan semua transformasi yang diperlukan (rasio lebar tinggi, skala, dan rotasi) untuk Anda.
Untuk mengetahui informasi selengkapnya, lihat postingan blog Memperkenalkan Jendela Bidik Kamera dan Pratinjau kamera panduan developer.
Solusi 3: Implementasi Camera2 manual
Jika tidak dapat menggunakan CameraX atau CameraViewfinder, Anda harus menghitung orientasi dan rasio lebar tinggi secara manual dan memastikan perhitungan diperbarui pada setiap perubahan konfigurasi:
- Dapatkan orientasi sensor kamera (misalnya, 0, 90, 180, 270 derajat) dari
CameraCharacteristics. - Dapatkan rotasi tampilan perangkat saat ini (misalnya, 0, 90, 180, 270 derajat).
- Gunakan dua nilai ini untuk menentukan transformasi yang diperlukan untuk
SurfaceViewatauTextureView. - Pastikan rasio lebar tinggi
Surfaceoutput Anda cocok dengan rasio lebar tinggi pratinjau kamera untuk mencegah distorsi. - Aplikasi kamera mungkin berjalan di sebagian layar, baik dalam mode multi-aplikasi atau jendela desktop maupun di layar terhubung. Oleh karena itu, ukuran layar tidak boleh digunakan untuk menentukan dimensi jendela bidik kamera, gunakan metrik jendela.
Untuk mengetahui informasi selengkapnya, lihat panduan developer Pratinjau kamera dan video Aplikasi Kamera Anda di berbagai faktor bentuk.
Solusi 4: Melakukan tindakan kamera dasar menggunakan intent
Jika Anda tidak memerlukan banyak fitur kamera, solusi yang mudah adalah melakukan tindakan kamera dasar seperti mengambil foto atau merekam video menggunakan aplikasi kamera default perangkat. Anda tidak perlu berintegrasi dengan library kamera; sebagai gantinya, gunakan Intent.
Untuk mengetahui informasi selengkapnya, lihat Intent kamera.
Konfigurasi dan kontinuitas
Perangkat foldable meningkatkan fleksibilitas UI, tetapi dapat memulai lebih banyak perubahan konfigurasi daripada perangkat non-foldable. Aplikasi Anda harus mengelola perubahan konfigurasi ini dan kombinasinya, seperti rotasi perangkat, melipat/membentangkan, dan mengubah ukuran jendela dalam mode multi-aplikasi atau desktop, sambil mempertahankan atau memulihkan status aplikasi. Misalnya, aplikasi harus mempertahankan kontinuitas berikut:
- Status aplikasi tanpa error atau menyebabkan perubahan yang mengganggu pengguna (misalnya, saat beralih layar atau mengirim aplikasi ke latar belakang)
- Posisi scroll kolom yang dapat di-scroll
- Teks yang diketik ke dalam kolom teks dan status keyboard
- Posisi pemutaran media sehingga pemutaran dilanjutkan dari posisi terakhir saat perubahan konfigurasi dimulai
Perubahan konfigurasi yang sering dipicu mencakup screenSize, smallestScreenSize, screenLayout, orientation, density, fontScale, touchscreen, dan keyboard.
Lihat android:configChanges dan Menangani perubahan konfigurasi. Untuk
informasi tambahan tentang mengelola status aplikasi, lihat Menyimpan status UI.
Perubahan konfigurasi kepadatan
Layar luar dan dalam perangkat foldable trifold dan lanskap mungkin memiliki kepadatan piksel yang berbeda. Oleh karena itu, mengelola perubahan konfigurasi untuk density memerlukan perhatian ekstra. Android biasanya memulai ulang aktivitas saat kepadatan tampilan berubah, yang dapat menyebabkan kehilangan data. Untuk mencegah sistem memulai ulang aktivitas, deklarasikan penanganan kepadatan dalam manifes dan kelola perubahan konfigurasi secara terprogram di aplikasi Anda.
Konfigurasi AndroidManifest.xml
density: Mendeklarasikan bahwa aplikasi akan menangani perubahan kepadatan layar- Perubahan konfigurasi lainnya: Sebaiknya deklarasikan juga perubahan konfigurasi lain yang sering terjadi, misalnya,
screenSize,orientation,keyboardHidden,fontScale, dan sebagainya
Mendeklarasikan kepadatan (dan perubahan konfigurasi lainnya) akan mencegah sistem memulai ulang aktivitas dan memanggil onConfigurationChanged().
Implementasi onConfigurationChanged()
Saat terjadi perubahan kepadatan, Anda harus memperbarui resource (seperti memuat ulang bitmap atau menghitung ulang ukuran tata letak) dalam callback:
- Verifikasi bahwa DPI diubah menjadi
newConfig.densityDpi - Reset tampilan kustom, drawable kustom, dan sebagainya ke kepadatan baru
Item resource yang akan diproses
- Resource gambar: Ganti bitmap dan drawable dengan resource khusus kepadatan, atau sesuaikan skala secara langsung
- Unit tata letak (konversi dp ke px): Hitung ulang ukuran tampilan, margin, padding
- Ukuran font dan teks: Terapkan kembali ukuran teks unit sp
- Gambar
View/Canvaskustom: Perbarui nilai berbasis piksel yang digunakan untuk menggambarCanvas
Menentukan orientasi aplikasi
Jangan pernah mengandalkan rotasi perangkat fisik saat mem-build aplikasi adaptif, karena itu akan diabaikan di perangkat layar besar dan aplikasi dalam mode multi-aplikasi dapat memiliki orientasi yang berbeda dengan perangkat. Sebagai gantinya, gunakan Configuration.orientation atau WindowMetrics untuk mengidentifikasi apakah aplikasi Anda saat ini dalam orientasi lanskap atau potret berdasarkan ukuran jendela.
Solusi 1: Menggunakan Configuration.orientation
Properti ini mengidentifikasi orientasi tempat aplikasi Anda saat ini ditampilkan.
Solusi 2: Menggunakan WindowMetrics#getBounds()
Anda bisa mendapatkan batas tampilan aplikasi saat ini dan memeriksa lebar serta tingginya untuk menentukan orientasi.
Jika Anda perlu membatasi orientasi aplikasi di ponsel (atau layar luar perangkat foldable), tetapi tidak di perangkat layar besar, lihat Orientasi aplikasi dibatasi di ponsel, tetapi tidak di layar besar.
Postur dan mode tampilan
Postur dan status perangkat foldable seperti tabletop dan HALF_OPENED didukung oleh perangkat foldable potret dan perangkat foldable lanskap. Namun, perangkat foldable trifold tidak mendukung postur tabletop dan tidak dapat digunakan HALF_OPENED. Sebagai gantinya, perangkat foldable trifold menawarkan layar yang lebih besar untuk pengalaman pengguna yang unik saat dibentangkan sepenuhnya.
Untuk membedakan aplikasi Anda di perangkat foldable yang mendukung HALF_OPENED, gunakan Jetpack
WindowManager API seperti FoldingFeature.
Pelajari lebih lanjut postur, status, dan dukungan perangkat foldable untuk pratinjau kamera dalam panduan developer berikut:
Perangkat foldable menawarkan pengalaman tampilan yang unik. Mode tampilan belakang dan mode layar ganda memungkinkan Anda membangun fitur tampilan khusus untuk perangkat foldable, seperti pratinjau selfie kamera belakang dan tampilan yang bersamaan tetapi berbeda di layar dalam dan luar. Untuk mengetahui informasi selengkapnya, lihat:
Mengunci orientasi ke orientasi sensor alami
Untuk kasus penggunaan yang sangat spesifik—khususnya, aplikasi yang perlu mengambil alih seluruh layar yang tidak terkait dengan status perangkat yang dilipat—flag nosensor memungkinkan Anda mengunci aplikasi ke orientasi alami perangkat. Misalnya, di Pixel Fold, orientasi alami perangkat saat dilipat adalah potret, sedangkan orientasi alami saat dibentangkan adalah lanskap. Menambahkan flag nosensor akan memaksa aplikasi dikunci dalam mode potret saat berjalan di layar luar dan dikunci ke lanskap saat berjalan di layar dalam.
<activity
android:name=".MainActivity"
android:screenOrientation="nosensor">
Pemetaan ulang sensor game dan XR
Untuk game dan aplikasi XR, data sensor mentah (seperti giroskop atau akselerometer) disediakan dalam sistem koordinat tetap perangkat. Jika pengguna memutar perangkat untuk bermain game dalam mode lanskap, sumbu sensor tidak akan berputar dengan layar, sehingga menyebabkan kontrol game yang salah.
Untuk memperbaiki masalah ini, periksa Display.getRotation() saat ini dan petakan ulang sumbu yang sesuai:
- Rotasi 0: x=x, y=y
- Rotasi 90: x=-y, y=x
- Rotasi 180: x=-x, y=-y
- Rotasi 270: x=y, y=-x
Untuk vektor rotasi (digunakan dalam aplikasi kompas atau XR), gunakan SensorManager.remapCoordinateSystem() untuk memetakan arah lensa kamera atau bagian atas layar ke sumbu baru berdasarkan rotasi saat ini.
Kompatibilitas aplikasi
Aplikasi harus mengikuti pedoman kualitas aplikasi untuk memastikan kompatibilitas di semua faktor bentuk dan layar terhubung. Jika aplikasi tidak dapat mematuhi pedoman, produsen perangkat dapat menerapkan penanganan kompatibilitas, meskipun hal ini dapat menurunkan kualitas pengalaman pengguna.
Untuk mengetahui informasi tambahan, tinjau daftar lengkap solusi kompatibilitas kompatibilitas yang disediakan di platform, khususnya yang terkait dengan pratinjau kamera, penggantian, dan perubahan Android 16 API yang dapat mengubah perilaku aplikasi Anda.
Untuk mempelajari lebih lanjut cara mem-build aplikasi adaptif, lihat Pedoman kualitas aplikasi adaptif.