← Назад к вопросам

Что такое коллбэки View?

1.0 Junior🔥 181 комментариев
#Android компоненты#UI и вёрстка

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое коллбэки View?

Коллбэки View (View Callbacks) — это набор методов жизненного цикла и событий, которые вызываются системой Android в определенные моменты времени для визуальных компонентов (View и ViewGroup). Они позволяют контролировать процесс измерения (measure), размещения (layout) и рисования (draw) элемента на экране, а также реагировать на изменения состояния (например, изменение размера или видимости). Эти коллбэки являются фундаментальной частью механизма отрисовки UI в Android и используются для кастомной логики работы с виджетами.

Основные группы коллбэков View

1. Коллбэки жизненного цикла измерения и отрисовки

Это методы, которые вызываются во время трёх ключевых этапов рендеринга View:

  • onMeasure(int widthMeasureSpec, int heightMeasureSpec) — определяет размеры View. Система передает MeasureSpec (спецификации измерения), которые содержат информацию о желаемых размерах и режиме (точно, максимум). Здесь вычисляются конечные ширирина и высота.
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
    val desiredWidth = calculateDesiredWidth()
    val desiredHeight = calculateDesiredHeight()
    setMeasuredDimension(resolveSize(desiredWidth, widthMeasureSpec), 
                         resolveSize(desiredHeight, heightMeasureSpec))
}
  • onLayout(boolean changed, int left, int top, int right, int bottom) — размещает View внутри родительского контейнера. После onMeasure система вызывает этот метод, передавая новые координаты границ. Здесь обычно размещаются дочерние View (если это ViewGroup).
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
    // Для ViewGroup: размещение детей
    childView.layout(childLeft, childTop, childRight, childBottom)
}
  • onDraw(Canvas canvas) — выполняет фактическое рисование View на Canvas. Здесь используется объект Canvas для рисования фигур, текста, изображений.
override fun onDraw(canvas: Canvas) {
    super.onDraw(canvas)
    canvas.drawRect(rect, paint)
    canvas.drawText("Hello", x, y, textPaint)
}

2. Коллбэки событий состояния

Методы, реагирующие на изменения состояния View:

  • onVisibilityChanged(View changedView, int visibility) — вызывается при изменении видимости View (VISIBLE, INVISIBLE, GONE).
  • onSizeChanged(int w, int h, int oldw, int oldh) — вызывается при изменении размеров View (например, после onLayout с новыми значениями). Полезен для адаптации внутренней логики.
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
    super.onSizeChanged(w, h, oldw, oldh)
    reconfigureInternalLayout(w, h) // Например, пересчет позиций элементов
}
  • onAttachedToWindow() и onDetachedFromWindow() — вызываются при присоединении View к оконной системе (активность становится видимой) и при отсоединении (активность уничтожается или View удаляется). Здесь часто инициализируют/очищают ресурсы (например, анимации или слушатели).
override fun onAttachedToWindow() {
    super.onAttachedToWindow()
    startAnimation()
}

override fun onDetachedFromWindow() {
    super.onDetachedFromWindow()
    stopAnimation()
    cleanupResources()
}

3. Коллбэки обработки пользовательского взаимодействия

Это методы, связанные с событиями ввода:

  • onTouchEvent(MotionEvent event) — обработка касаний (тапов, движений). Можно переопределить для кастомного поведения.
  • onKeyEvent(KeyEvent event) — обработка клавишных событий (например, для фокусировки).

Почему коллбэки View важны?

  • Контроль над рендерингом: Они позволяют создавать полностью кастомные View с уникальной логикой измерения, размещения и рисования (например, круговые прогресс-бары, сложные графики).
  • Оптимизация производительности: Правильное использование onMeasure и onLayout помогает избежать излишних вычислений и улучшить скорость отрисовки.
  • Реакция на изменения: Коллбэки состояния позволяют адаптировать UI динамически (например, при изменении ориентации экрана или скрытии View).
  • Управление ресурсами: onAttachedToWindow и onDetachedFromWindow помогают предотвратить утечки памяти, освобождая ресурсы, когда View не активна.

Пример практического использования

Рассмотрим создание простого кастомного View, которое отображает текст с фоном и реагирует на изменение размера:

class CustomTextView(context: Context) : View(context) {
    private var text: String = "Hello"
    private val textPaint = Paint(Paint.ANTI_ALIAS_FLAG)
    private val backgroundPaint = Paint()

    init {
        textPaint.color = Color.BLACK
        textPaint.textSize = 40f
        backgroundPaint.color = Color.LTGRAY
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        val textWidth = textPaint.measureText(text)
        val desiredWidth = textWidth + paddingLeft + paddingRight
        val desiredHeight = textPaint.fontMetrics.height + paddingTop + paddingBottom
        setMeasuredDimension(
            resolveSize(desiredWidth, widthMeasureSpec),
            resolveSize(desiredHeight, heightMeasureSpec)
        )
    }

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        // Можно пересчитать что-то при изменении размера
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), backgroundPaint)
        canvas.drawText(text, paddingLeft.toFloat(), paddingTop + textPaint.textSize, textPaint)
    }
}

Ключевые выводы: Коллбэки View предоставляют глубокий контроль над жизненным циклом UI-компонентов. Их понимание критично для разработки сложных интерфейсов, оптимизации отрисовки и создания расширенного пользовательского взаимодействия.

Что такое коллбэки View? | PrepBro