View Kustom
Gambar komponen antarmuka kustom dari awal. Perluas View, implementasikan onMeasure dan onDraw dengan Canvas serta Paint, definisikan atribut XML kustom, dan buat view gabungan.
View Kustom adalah pelajaran Android Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 5. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Android Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Android Academy mencakup 5 pelajaran total.
Mengapa Menggunakan Tampilan Kustom?
Terkadang tampilan bawaan Android tidak melakukan persis seperti yang Anda perlukan. Tampilan kustom memungkinkan Anda:
- Menggambar bentuk, grafik, cincin progres, atau diagram yang tidak tersedia di SDK
- Membuat komponen UI bermerek yang digunakan secara konsisten di seluruh aplikasi
- Menggabungkan beberapa tampilan menjadi satu komponen yang dapat digunakan kembali (Compound View)
- Meningkatkan performa dengan menghilangkan hierarki tata letak bertingkat
Memperluas View
Buat tampilan kustom dengan memperluas View (atau subkelas seperti ImageView). Timpa konstruktor yang diperlukan:
class CircleProgressView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
var progress: Float = 0f
set(value) {
field = value.coerceIn(0f, 100f)
invalidate() // trigger redraw
}
// onMeasure and onDraw go here
}onMeasure()
onMeasure() memberi tahu induk seberapa besar ukuran yang diinginkan tampilan ini. Selalu panggil setMeasuredDimension() di akhir:
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val desiredSize = 200 // dp → pixels
val px = (desiredSize * resources.displayMetrics.density).toInt()
val width = resolveSize(px, widthMeasureSpec)
val height = resolveSize(px, heightMeasureSpec)
// Square: same width and height
val size = minOf(width, height)
setMeasuredDimension(size, size)
}Paint — Alat Menggambar
Objek Paint menyimpan informasi gaya untuk menggambar (warna, lebar garis, antialiasing). Buat sekali — jangan pernah di dalam onDraw():
class CircleProgressView ... : View(...) {
// Create Paint in init, not in onDraw!
private val backgroundPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.LTGRAY
style = Paint.Style.STROKE
strokeWidth = 20f
strokeCap = Paint.Cap.ROUND
}
private val progressPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.parseColor("#6750A4")
style = Paint.Style.STROKE
strokeWidth = 20f
strokeCap = Paint.Cap.ROUND
}
}onDraw() — Menggambar Tampilan
onDraw(canvas) dipanggil setiap kali tampilan perlu digambar ulang. Gunakan Canvas untuk menggambar bentuk, teks, dan bitmap:
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val cx = width / 2f
val cy = height / 2f
val radius = (minOf(width, height) / 2f) - 30f
// Draw background circle
canvas.drawCircle(cx, cy, radius, backgroundPaint)
// Draw progress arc
val oval = RectF(cx - radius, cy - radius, cx + radius, cy + radius)
val sweepAngle = 360f * (progress / 100f)
canvas.drawArc(oval, -90f, sweepAngle, false, progressPaint)
}invalidate() vs requestLayout()
Dua metode untuk memicu pembaruan:
invalidate()— menggambar ulang tampilan (memanggilonDraw). Gunakan saat konten berubah tetapi ukurannya tetap sama.requestLayout()— mengukur ulang dan menggambar ulang (memanggilonMeasurelaluonDraw). Gunakan saat ukuran tampilan berubah.
Atribut Kustom (attrs.xml)
Deklarasikan atribut XML kustom agar tampilan dapat dikonfigurasi dari file tata letak:
<!-- res/values/attrs.xml -->
<resources>
<declare-styleable name="CircleProgressView">
<attr name="progressColor" format="color" />
<attr name="trackColor" format="color" />
<attr name="strokeWidth" format="dimension" />
<attr name="progress" format="float" />
</declare-styleable>
</resources>Membaca Atribut Kustom
Baca attrs di konstruktor menggunakan obtainStyledAttributes:
init {
context.obtainStyledAttributes(attrs, R.styleable.CircleProgressView).use { ta ->
progressPaint.color = ta.getColor(
R.styleable.CircleProgressView_progressColor,
Color.parseColor("#6750A4")
)
backgroundPaint.color = ta.getColor(
R.styleable.CircleProgressView_trackColor,
Color.LTGRAY
)
val sw = ta.getDimension(R.styleable.CircleProgressView_strokeWidth, 20f)
progressPaint.strokeWidth = sw
backgroundPaint.strokeWidth = sw
progress = ta.getFloat(R.styleable.CircleProgressView_progress, 0f)
}
}Menggunakan Tampilan Kustom dalam XML
Gunakan tampilan kustom Anda dalam XML tata letak dengan jalur kelas lengkap dan atribut kustom:
<!-- In any layout XML -->
<com.example.myapp.CircleProgressView
android:id="@+id/progressView"
android:layout_width="120dp"
android:layout_height="120dp"
app:progress="65"
app:progressColor="@color/primary"
app:trackColor="@color/surface_variant"
app:strokeWidth="12dp" />
<!-- Control in code: -->
binding.progressView.progress = 75fCompound View
Compound view menggabungkan tampilan yang sudah ada menjadi satu komponen yang dapat digunakan kembali. Perluas kelas tata letak seperti LinearLayout:
class SearchBarView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null
) : LinearLayout(context, attrs) {
private val binding = ViewSearchBarBinding.inflate(LayoutInflater.from(context), this)
init {
orientation = HORIZONTAL
binding.ivSearch.setOnClickListener {
onSearchClick?.invoke(binding.etSearch.text.toString())
}
}
var onSearchClick: ((String) -> Unit)? = null
fun setHint(hint: String) { binding.etSearch.hint = hint }
}Menggambar Teks
Gambarkan teks pada Canvas dengan drawText(). Pusatkan secara presisi menggunakan Paint.getFontMetrics():
private val textPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.BLACK
textSize = 48f
textAlign = Paint.Align.CENTER
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val cx = width / 2f
val cy = height / 2f
// Vertically center the text:
val fm = textPaint.fontMetrics
val textY = cy - (fm.ascent + fm.descent) / 2f
canvas.drawText("${progress.toInt()}%", cx, textY, textPaint)
}Pemeriksaan Singkat
Metode apa yang harus Anda panggil untuk memicu penggambaran ulang tampilan kustom saat data berubah tetapi ukurannya tetap sama?
Ringkasan: Tampilan Kustom
Sekarang Anda dapat menggambar apa pun di layar:
- Perluas
Viewdengan@JvmOverloads constructor onMeasure()— laporkan ukuran yang diinginkan dengansetMeasuredDimension()Paint— tentukan gaya; buat sekali, bukan di dalamonDraw()onDraw(canvas)— gambar lingkaran, busur, teks, bitmapinvalidate()untuk menggambar ulang,requestLayout()untuk mengukur ulang- Atribut kustom melalui
attrs.xmluntuk konfigurasi XML - Compound view — perluas tata letak untuk menggabungkan tampilan yang sudah ada
Berikutnya: hidupkan UI Anda dengan Animasi & Transisi.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “View Kustom” gratis?
Ya — teks lengkap “View Kustom” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Android Academy, upgrade ke CoddyKit PRO. Kursus Android Academy mencakup 5 pelajaran total.
Apa yang akan aku pelajari di “View Kustom”?
Gambar komponen antarmuka kustom dari awal. Perluas View, implementasikan onMeasure dan onDraw dengan Canvas serta Paint, definisikan atribut XML kustom, dan buat view gabungan. Kamu berlatih Android Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Android Academy?
Tidak diperlukan pengalaman sebelumnya. Android Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 5.
Berapa lama pelajaran “View Kustom” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Android Academy ini?
Ya. Setiap pelajaran Android Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.