0Pricing
Android Academy · Pelajaran

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 (memanggil onDraw). Gunakan saat konten berubah tetapi ukurannya tetap sama.
  • requestLayout() — mengukur ulang dan menggambar ulang (memanggil onMeasure lalu onDraw). 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 = 75f

Compound 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 View dengan @JvmOverloads constructor
  • onMeasure() — laporkan ukuran yang diinginkan dengan setMeasuredDimension()
  • Paint — tentukan gaya; buat sekali, bukan di dalam onDraw()
  • onDraw(canvas) — gambar lingkaran, busur, teks, bitmap
  • invalidate() untuk menggambar ulang, requestLayout() untuk mengukur ulang
  • Atribut kustom melalui attrs.xml untuk 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.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar Material Design
  2. Tema & Gaya
  3. View Kustom
  4. Animasi & Transisi
  5. Navigasi Bawah & Tab
← Kembali ke Android Academy