Cara Android Menggambar Tampilan

Saat menerima fokus, Activity akan diminta untuk menggambar tata letaknya. Framework Android akan menangani prosedur menggambar, tetapi Activity harus menyediakan node root hierarki tata letaknya.

Proses menggambar dimulai dengan node root tata letak. Struktur tata letak harus diukur dan digambar. Proses menggambar ditangani dengan mengikuti struktur tersebut dan merender setiap View yang berpotongan dengan area yang tidak valid. Selanjutnya, setiap ViewGroup bertanggung jawab meminta agar setiap turunannya digambar (dengan metode draw()) dan setiap View bertanggung jawab untuk menggambar dirinya sendiri. Karena struktur ini dilalui sesuai urutan yang ditentukan sebelumnya, tampilan induk harus digambar sebelum (artinya, di belakang) turunannya, sedangkan tampilan yang setara digambar sesuai urutan kemunculannya dalam struktur.

Catatan: Framework tidak menggambar objek View yang berada di luar area yang valid, dan juga menangani proses menggambar latar belakang View untuk Anda.

Anda dapat memaksa View untuk digambar, dengan memanggil invalidate().

Menggambar tata letak adalah proses dua tahap: tahap pengukuran dan tahap tata letak.

Tahap pengukuran

Tahap pengukuran diimplementasikan dalam measure(int, int) dan mengikuti urutan struktur View dari atas ke bawah. Setiap View mendorong spesifikasi dimensi ke bawah dalam struktur selama rekursi. Pada akhir tahap pengukuran, setiap View telah menyimpan ukurannya. Tahap kedua berlangsung di layout(int, int, int, int) dan juga dari atas ke bawah. Selama tahap ini, setiap induk bertanggung jawab untuk menentukan posisi semua turunannya berdasarkan ukuran yang dihitung selama tahap pengukuran.

Saat metode measure() dari objek View ditampilkan, nilai getMeasuredWidth() dan getMeasuredHeight()-nya harus ditetapkan, begitu juga nilai untuk semua keturunan objek View tersebut. Nilai tinggi dan lebar terukur objek View harus mengikuti batasan yang diberlakukan oleh induk objek View. Hal ini menjamin bahwa pada akhir tahap pengukuran, semua induk menyetujui ukuran untuk semua turunannya. View induk dapat memanggil measure() lebih dari sekali di lokasi turunannya. Misalnya, induk dapat mengukur setiap turunan satu kali dengan dimensi yang tidak ditentukan untuk mengetahui sebesar apa ukuran yang diinginkan, lalu memanggil kembali measure() dengan dimensi yang sebenarnya jika jumlah ukuran yang tidak dibatasi untuk semua turunan terlalu besar atau terlalu kecil (dengan kata lain, jika turunan tidak saling bersesuaian dari segi ruang yang tersedia, induk akan mengintervensi dan menetapkan aturan pada tahap kedua).

Tahap pengukuran menggunakan dua class untuk mengomunikasikan dimensi. Class ViewGroup.LayoutParams digunakan oleh objek View untuk memberitahukan ukuran dan posisi yang diinginkan kepada induknya. Class ViewGroup.LayoutParams dasar hanya menjelaskan seberapa besar tinggi dan lebar yang diharapkan View. Untuk setiap dimensi, salah satu dari berikut ini dapat ditetapkan:

  • dimensi persis
  • MATCH_PARENT, yang berarti View ingin sebesar induknya (dikurangi padding)
  • WRAP_CONTENT, yang berarti View ingin cukup besar sehingga dapat mencakup isinya (plus padding).

Terdapat subclass ViewGroup.LayoutParams untuk subclass yang berbeda dari ViewGroup. Misalnya, RelativeLayout memiliki subclass-nya sendiri, yaitu ViewGroup.LayoutParams, yang memiliki kemampuan untuk menempatkan objek View turunan di tengah-tengah baik secara horizontal maupun vertikal.

Objek MeasureSpec digunakan untuk mendorong persyaratan ke bawah dalam struktur dari induk ke turunan. MeasureSpec dapat berupa salah satu dari tiga mode berikut:

  • UNSPECIFIED: Digunakan oleh induk untuk menentukan dimensi yang diinginkan untuk View turunan. Misalnya, LinearLayout dapat memanggil measure() di lokasi turunannya dengan tinggi ditetapkan ke UNSPECIFIED dan lebar EXACTLY 240 untuk mengetahui tinggi View turunan yang diinginkan jika lebar ditetapkan ke 240 piksel.
  • EXACTLY: Digunakan oleh induk untuk menerapkan ukuran persis pada turunan. Turunan harus menggunakan ukuran ini, dan menjamin bahwa semua turunannya akan cocok dalam ukuran tersebut.
  • AT MOST: Digunakan oleh induk untuk menerapkan ukuran maksimum pada turunan. Turunan harus menjamin bahwa ia beserta semua keturunannya akan cocok dalam ukuran ini.

Tahap tata letak

Untuk memulai sebuah tata letak, panggil requestLayout(). Metode ini biasanya dipanggil oleh View di lokasinya sendiri jika merasa tidak pas lagi dalam batas-batasnya saat ini.