Работал ли с кастомными view

«Работал ли с кастомными view» — вопрос из категории UI и Views, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, работал. Создавал кастомные View, переопределяя методы onDraw(), onMeasure(), onLayout(). Например, для анимированного прогресс-бара:

class CustomProgressBar @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null
) : View(context, attrs) {

    private var progress = 0f
    private val paint = Paint(Paint.ANTI_ALIAS_FLAG)

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        // Рисуем прогресс
        canvas.drawRect(0f, 0f, width * progress, height.toFloat(), paint)
    }

    fun setProgress(progress: Float) {
        this.progress = progress.coerceIn(0f, 1f)
        invalidate()
    }
}

Основные моменты:

  1. Обработка атрибутов из XML через obtainStyledAttributes
  2. Корректная работа с onMeasure для wrap_content
  3. Оптимизация перерисовки через clipRect или save/restore
  4. Поддержка аппаратного ускорения