Saya berjuang untuk memahami proses menggambar SurfaceView
dan karenanya seluruh Surface
/ Canvas
/ Bitmap
sistem, yang digunakan di Android.
Saya telah membaca semua artikel dan halaman dokumentasi API, yang dapat saya temukan di situs pengembang android, beberapa tutorial grafis android, kode sumber LunarLander dan pertanyaan ini .
Tolong beritahu saya, mana dari pernyataan ini yang benar, mana yang tidak, dan mengapa.
Canvas
memilikiBitmap
keterikatannya sendiri padanya.Surface
memilikiCanvas
keterikatannya sendiri padanya.- Semua
View
jendela berbagi samaSurface
dan karenanya berbagi samaCanvas
. SurfaceView
adalah subkelasView
, yang, tidak sepertiView
subkelas lain dan subkelasView
itu sendiri, memiliki kelebihan tersendiriSurface
.
Ada juga satu pertanyaan tambahan:
- Mengapa ada kebutuhan untuk
Surface
kelas, jika sudah adaCanvas
untuk operasi tingkat tinggi dengan bitmap. Berikan contoh situasi di manaCanvas
tidak cocok untuk melakukan pekerjaan yangSurface
bisa dilakukan.
android
android-canvas
surfaceview
fyodorananiev.dll
sumber
sumber
Jawaban:
Berikut beberapa definisi:
Surface adalah objek yang menahan piksel yang sedang digabungkan ke layar. Setiap jendela yang Anda lihat di layar (dialog, aktivitas layar penuh Anda, status bar) memiliki permukaannya sendiri yang menariknya, dan Surface Flinger menampilkannya ke tampilan akhir dalam urutan Z yang benar. Permukaan biasanya memiliki lebih dari satu buffer (biasanya dua) untuk melakukan rendering buffer ganda: aplikasi dapat menggambar status UI berikutnya sementara flinger permukaan menyusun layar menggunakan buffer terakhir, tanpa perlu menunggu aplikasi selesai gambar.
Jendela pada dasarnya seperti yang Anda pikirkan tentang jendela di desktop. Ini memiliki permukaan tunggal di mana konten jendela ditampilkan. Sebuah aplikasi berinteraksi dengan Manajer Jendela untuk membuat jendela; Manajer Jendela membuat Permukaan untuk setiap jendela dan memberikannya ke aplikasi untuk menggambar. Aplikasi dapat menggambar apa pun yang diinginkannya di Surface; bagi Pengelola Jendela, ini hanyalah persegi panjang buram.
Tampilan adalah elemen UI interaktif di dalam jendela. Jendela memiliki hierarki tampilan tunggal yang menyertainya, yang menyediakan semua perilaku jendela. Kapan pun jendela perlu digambar ulang (seperti karena tampilan telah menjadi tidak valid sendiri), ini dilakukan ke dalam Surface jendela. Surface dikunci, yang mengembalikan Canvas yang dapat digunakan untuk menggambar ke dalamnya. Draw traversal dilakukan di bawah hierarki, menurunkan Canvas untuk setiap tampilan guna menggambar bagian UI-nya. Setelah selesai, Surface dibuka kuncinya dan diposting sehingga buffer yang baru saja ditarik ditukar ke latar depan untuk kemudian digabungkan ke layar oleh Surface Flinger.
SurfaceView adalah implementasi khusus View yang juga membuat Surface khusus untuk digambar langsung oleh aplikasi (di luar hierarki tampilan normal, yang sebaliknya harus berbagi satu Surface untuk jendela). Cara kerjanya lebih sederhana dari yang Anda perkirakan - semua yang dilakukan SurfaceView adalah meminta pengelola jendela untuk membuat jendela baru, memberitahukannya ke Z-order jendela tersebut tepat di belakang atau di depan jendela SurfaceView, dan memposisikannya agar sesuai di mana SurfaceView muncul di jendela penampung. Jika permukaan ditempatkan di belakang jendela utama (dalam urutan Z), SurfaceView juga mengisi bagian jendela utama dengan transparansi sehingga permukaan tersebut dapat terlihat.
Bitmap hanyalah antarmuka ke beberapa data piksel. Piksel dapat dialokasikan oleh Bitmap itu sendiri saat Anda membuatnya secara langsung, atau mungkin mengarah ke piksel yang tidak dimilikinya seperti yang secara internal terjadi saat mengaitkan Canvas ke Surface untuk menggambar. (Bitmap dibuat dan diarahkan ke buffer gambar Surface saat ini.)
Juga harap diingat bahwa, karena ini menyiratkan, SurfaceView adalah objek yang cukup berat. Jika Anda memiliki beberapa SurfaceView dalam UI tertentu, berhenti sejenak dan pikirkan apakah ini benar-benar diperlukan. Jika Anda memiliki lebih dari dua, Anda hampir pasti memiliki terlalu banyak.
sumber
#hackbod's
menjawab,SurfaceView
juga dapat diberikan dari utas sekunder yang tidak mungkin untukView
objekBerikut adalah gambaran umum konseptual yang sangat mendasar dan sederhana tentang bagaimana interaksi terjadi antara Window, Surface, Canvas, dan Bitmap.
Kadang-kadang, representasi visual banyak membantu dalam memahami konsep-konsep yang menyimpang.
Saya harap grafik ini dapat membantu seseorang.
sumber
Bitmap hanyalah pembungkus untuk kumpulan piksel. Anggap saja sebagai array piksel dengan beberapa fungsi praktis lainnya.
Canvas adalah kelas yang berisi semua metode menggambar. Ini mirip dengan kelas Grafik di AWT / Swing jika Anda sudah terbiasa dengannya. Semua logika tentang cara menggambar lingkaran, atau kotak, dll ada di dalam kanvas. Kanvas menggambar pada Bitmap atau wadah GL terbuka tetapi tidak ada alasan mengapa di masa depan kanvas dapat diperluas untuk digambar ke jenis raster lain.
SurfaceView adalah Tampilan yang berisi Surface. Sebuah permukaan mirip dengan bitmap (memiliki penyimpanan piksel). Saya tidak tahu bagaimana penerapannya tetapi saya membayangkan itu adalah semacam pembungkus Bitmap dengan metode tambahan untuk hal-hal yang berhubungan langsung dengan tampilan layar (Itulah alasan untuk sebuah permukaan, Bitmap terlalu umum). Anda bisa mendapatkan Canvas dari Surface Anda yang benar-benar mendapatkan Canvas yang terkait dengan Bitmap yang mendasarinya.
Pertanyaan Anda.
Ya, kanvas beroperasi pada Bitmap (atau panel GL terbuka). Surface memberi Anda Canvas yang beroperasi pada apa pun yang digunakan Surface untuk penyimpanan piksel gaya Bitmap-nya.
Tidak. Anda dapat memiliki tampilan permukaan sebanyak yang Anda inginkan.
Iya. Sama seperti ListView adalah subclass View yang memiliki struktur data List sendiri. Setiap subclass View melakukan sesuatu yang berbeda.
sumber
Bitmap
danSurface
apakah hanya spesies berbeda dari penyimpanan piksel danCanvas
dapat membungkus salah satunya?