Qt

QML Сделать задержку перед началом анимации

QML Animation Delay

Понадобилось, что бы перед началом анимации была задержка — например, что бы подсказка не всплывала, если курсор просто мимо пролетал.


Обычно, это делается через Timer или добавлением промежуточной анимации. Мне же хотелось ограничится behavior и лишь одной анимацией, что бы не геммороиться с запуском таймеров и т.п.

Решение оказалось довольно простым, достаточно использовать сплайн из двух кривых Безье, которые фактически представляет собой пару отрезков (линейных кривых Безье) и вместе выглядят вот так: «_/»

...
visible: opacity>0
opacity: myButton.containsMouse? 1 : 0

Behavior on opacity {
  NumberAnimation {
    duration: 600
    easing.type: Easing.BezierSpline
    easing.bezierCurve: [0.8,0, 0.8,0, 0.8,0, 1,1, 1,1, 1,1] //-- 80% времени ждём (480 мс), потом линейно (120 мс)
  }
}

...

Можно изменить 0.8 — это процент ожидания от duration. Основная строчка это easing.bezierCurve: [], в которой мы задаём две кривых Безье, в каждой три параы координат — две контрольные точки и конечная. Конечная обязаны быть в (1, 1), иначе Qt выдаст ошибку, что не валидное значение.

Результат:

Вот как-то так =)

Related posts

QtCreator не открывает диалог выбора файлов, проектов, не открывает проект

Сборка Qt 6.8 (Dev) из исходников в Docker контейнере (Linux)

Упрощение работы с динамическими структурами в C++