Ответ
Да, работал. Создавал кастомные 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()
}
}
Основные моменты:
- Обработка атрибутов из XML через
obtainStyledAttributes - Корректная работа с
onMeasureдля wrap_content - Оптимизация перерисовки через
clipRectилиsave/restore - Поддержка аппаратного ускорения