Evgenii Legotckoi
Қаң. 4, 2016, 9:41 Т.Қ.

QML - 022-сабақ. Материалдық дизайн стиліндегі тізім элементіндегі анимацияны басыңыз

QML не предоставляет анимацию взаимодействий кликов в стиле Material Design для Android по умолчанию, но это легко настраивается с помощью примитивов Rectangle. Анимация заключается в том, чтобы в одном родительском объекте Rectangle, при клике, необходимо второй дочерний объект Rectangle растянуть на всю область родительского. При этом дочерний объект будет растягиваться в течении определённого времени и выглядеть будет как расширяющийся круг, но при этом он не будет выходить за пределы родительского объекта.

Для наглядности создадим список элементов, по которым будем производить клики. Для отслеживания кликов будет использоваться область MouseArea, в которой будет отслеживаться несколько сигналов взаимодействия:

  • onClicked - в данном сигнале будет останавливаться анимация и выполняться результат взаимодействия со списком;
  • onPressed - при сигнале нажатия необходимо запустить анимацию, с предварительной установкой координат анимируемого объекта Rectangle.
  • onReleased - при отпускании элемента списка необходимо остановить анимацию;
  • onPositionChanged - при смене позиции области также необходимо остановить анимацию.

Для выполнения анимации используется объект PropertyAnimation. В данном объекте выбирается цель анимации, и список свойств, которые будут подвергаться изменению. В случае с анимируемым объектом Rectangl, необходимо расширять его как круг, для этого увеличиваем его свойства width, height и radius с одной и той же величиной. А для того, чтобы полностью заполнить родительский объект, выставим конечную величину свойств в три раза большую, чем ширина родительского элемента.

Также важным свойством родительского элемента является:

clip - активируя данное свойство ( true ), Мы обрезаем дочерние элементы объекта, чтобы они не выходили за границы родительского элемента.


Анимация клика - реализация в коде

  1. import QtQuick 2.5
  2. import QtQuick.Controls 1.4
  3.  
  4. ApplicationWindow {
  5. visible: true
  6. width: 640
  7. height: 480
  8. title: qsTr("Hello World")
  9.  
  10. /* Создадим список с несколькими элементами,
  11. * по которым будет производитсья анимированный клик
  12. * */
  13. ListView {
  14. anchors.fill: parent
  15.  
  16. // В объекте находится ...
  17. delegate: Item {
  18. height: 48
  19. anchors.left: parent.left
  20. anchors.right: parent.right
  21.  
  22. // ... прямоугольный фон,
  23. Rectangle {
  24. id: body
  25. anchors.fill: parent
  26. color: "white"
  27. // дочерние объекты будут обрезаться по области данного родительского элемента
  28. clip: true
  29.  
  30. /* ... в котором находится другой фон, который будет
  31. * анимированным кругом клика
  32. * */
  33. Rectangle {
  34. id: colorRect
  35. height: 0
  36. width: 0
  37. color: "#e8e8e8"
  38.  
  39. /* Свойство трансформации, в котором будут пересчитываться
  40. * стартовые координаты, чтобы был круг в центре клика
  41. * */
  42. transform: Translate {
  43. x: -colorRect.width / 2
  44. y: -colorRect.height / 2
  45. }
  46. }
  47.  
  48. // Надпись в элементе списка
  49. Text {
  50. text: fragment
  51. anchors.left: parent.left
  52. anchors.leftMargin: 72
  53. anchors.top: parent.top
  54. anchors.bottom: parent.bottom
  55. font.pixelSize: 14
  56.  
  57. renderType: Text.NativeRendering
  58. horizontalAlignment: Text.AlignLeft
  59. verticalAlignment: Text.AlignVCenter
  60. }
  61.  
  62. // Область клика по элементу
  63. MouseArea {
  64. anchors.fill: parent
  65.  
  66. onClicked: {
  67. circleAnimation.stop()
  68. }
  69. onPressed: {
  70. /* При нажатии на элемент выставляем стартовые координаты
  71. * фона для анимации круга в элементе
  72. * */
  73. colorRect.x = mouseX
  74. colorRect.y = mouseY
  75. // Запускаем анимацию
  76. circleAnimation.start()
  77. }
  78. onReleased: circleAnimation.stop()
  79. onPositionChanged: circleAnimation.stop()
  80. }
  81.  
  82. // Анимация свойств
  83. PropertyAnimation {
  84. id: circleAnimation
  85. target: colorRect // Целью задаём круговой фон
  86. properties: "width,height,radius" // В анимации изменяем высоту, ширину и радиус закругления
  87. from: 0 // Изменяем параметры от о пикселей ...
  88. to: body.width*3 // ... до тройного размера ширины элемента списка
  89. duration: 300 // в течении 300 милисекунд
  90.  
  91. // По остановке анимации обнуляем высоту и ширину анимированного фона
  92. onStopped: {
  93. colorRect.width = 0
  94. colorRect.height = 0
  95. }
  96. }
  97. }
  98. }
  99. model: listModel
  100. }
  101.  
  102. // Модель списка с элементами
  103. ListModel {
  104. id: listModel
  105.  
  106. ListElement {fragment: qsTr("1-й Фрагмент")}
  107. ListElement {fragment: qsTr("2-й Фрагмент")}
  108. ListElement {fragment: qsTr("3-й Фрагмент")}
  109. ListElement {fragment: qsTr("4-й Фрагмент")}
  110. ListElement {fragment: qsTr("5-й Фрагмент")}
  111. ListElement {fragment: qsTr("6-й Фрагмент")}
  112. ListElement {fragment: qsTr("7-й Фрагмент")}
  113. }
  114. }

Видеоурок

Результат анимации в стиле Material Design не является полностью идентичным тому, что должно быть, но показывает основную идею. Демонстрацию работы Вы можете увидеть в видеоуроке.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз