animation.uvue 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. <template>
  2. <cl-page>
  3. <view class="p-3">
  4. <demo-item :label="t('基础动画')">
  5. <view class="row">
  6. <view class="item" ref="rotateRef">
  7. <cl-text color="white" :pt="{ className: 'text-sm' }">rotate</cl-text>
  8. </view>
  9. <view class="item" ref="scaleRef">
  10. <cl-text color="white" :pt="{ className: 'text-sm' }">scale</cl-text>
  11. </view>
  12. <view class="item" ref="moveRef">
  13. <cl-text color="white" :pt="{ className: 'text-sm' }">move</cl-text>
  14. </view>
  15. <view class="item" ref="opacityRef">
  16. <cl-text color="white" :pt="{ className: 'text-sm' }">opacity</cl-text>
  17. </view>
  18. </view>
  19. </demo-item>
  20. <demo-item :label="t('淡入淡出')">
  21. <view class="row">
  22. <view class="item" ref="fadeInRef">
  23. <cl-text color="white" :pt="{ className: 'text-sm' }">fadeIn</cl-text>
  24. </view>
  25. <view class="item" ref="fadeOutRef">
  26. <cl-text color="white" :pt="{ className: 'text-sm' }">fadeOut</cl-text>
  27. </view>
  28. </view>
  29. <cl-button text border @tap="onFadeToggle">{{ t("播放动画") }}</cl-button>
  30. </demo-item>
  31. <demo-item :label="t('滑入')">
  32. <view class="row">
  33. <view class="item" ref="slideLeftRef">
  34. <cl-text color="white" :pt="{ className: 'text-sm' }">slideLeft</cl-text>
  35. </view>
  36. <view class="item" ref="slideRightRef">
  37. <cl-text color="white" :pt="{ className: 'text-sm' }">slideRight</cl-text>
  38. </view>
  39. <view class="item" ref="slideUpRef">
  40. <cl-text color="white" :pt="{ className: 'text-sm' }">slideUp</cl-text>
  41. </view>
  42. <view class="item" ref="slideDownRef">
  43. <cl-text color="white" :pt="{ className: 'text-sm' }">slideDown</cl-text>
  44. </view>
  45. </view>
  46. <cl-button text border @tap="onSlideInToggle">{{ t("播放动画") }}</cl-button>
  47. </demo-item>
  48. <demo-item label="缩放">
  49. <view class="row">
  50. <view class="item" ref="zoomInRef">
  51. <cl-text color="white" :pt="{ className: 'text-sm' }">zoomIn</cl-text>
  52. </view>
  53. <view class="item" ref="zoomOutRef">
  54. <cl-text color="white" :pt="{ className: 'text-sm' }">zoomOut</cl-text>
  55. </view>
  56. </view>
  57. <cl-button text border @tap="onZoomToggle">{{ t("播放动画") }}</cl-button>
  58. </demo-item>
  59. <demo-item :label="t('旋转翻转')">
  60. <view class="row">
  61. <view class="item" ref="rotateInRef">
  62. <cl-text color="white" :pt="{ className: 'text-sm' }">rotateIn</cl-text>
  63. </view>
  64. <view class="item" ref="flipXRef">
  65. <cl-text color="white" :pt="{ className: 'text-sm' }">flipX</cl-text>
  66. </view>
  67. <view class="item" ref="flipYRef">
  68. <cl-text color="white" :pt="{ className: 'text-sm' }">flipY</cl-text>
  69. </view>
  70. </view>
  71. <cl-button text border @tap="onRotateFlipToggle">{{ t("播放动画") }}</cl-button>
  72. </demo-item>
  73. <demo-item :label="t('摇摆抖动')">
  74. <view class="row">
  75. <view class="item" ref="shakeRef">
  76. <cl-text color="white" :pt="{ className: 'text-sm' }">shake</cl-text>
  77. </view>
  78. <view class="item" ref="swingRef">
  79. <cl-text color="white" :pt="{ className: 'text-sm' }">swing</cl-text>
  80. </view>
  81. <view class="item" ref="wobbleRef">
  82. <cl-text color="white" :pt="{ className: 'text-sm' }">wobble</cl-text>
  83. </view>
  84. </view>
  85. <cl-button text border @tap="onShakeToggle">{{ t("播放动画") }}</cl-button>
  86. </demo-item>
  87. <demo-item :label="t('特殊效果')">
  88. <view class="row">
  89. <view class="item" ref="rollInRef">
  90. <cl-text color="white" :pt="{ className: 'text-sm' }">rollIn</cl-text>
  91. </view>
  92. <view class="item" ref="lightSpeedRef">
  93. <cl-text color="white" :pt="{ className: 'text-sm' }">lightSpeed</cl-text>
  94. </view>
  95. <view class="item" ref="rippleRef">
  96. <cl-text color="white" :pt="{ className: 'text-sm' }">ripple</cl-text>
  97. </view>
  98. </view>
  99. <cl-button text border @tap="onSpecialToggle">{{ t("播放动画") }}</cl-button>
  100. </demo-item>
  101. <demo-item :label="t('组合动画')">
  102. <view class="row">
  103. <view class="item" ref="sequenceRef">
  104. <cl-text color="white" :pt="{ className: 'text-sm' }">sequence</cl-text>
  105. </view>
  106. </view>
  107. <cl-button text border @tap="onSequenceToggle">{{ t("播放动画") }}</cl-button>
  108. </demo-item>
  109. </view>
  110. </cl-page>
  111. </template>
  112. <script lang="ts" setup>
  113. import { AnimationEngine, createAnimation } from "@/cool";
  114. import { ref } from "vue";
  115. import DemoItem from "../components/item.uvue";
  116. import { t } from "@/locale";
  117. // 基础动画引用
  118. const rotateRef = ref<UniElement | null>(null);
  119. const moveRef = ref<UniElement | null>(null);
  120. const scaleRef = ref<UniElement | null>(null);
  121. const opacityRef = ref<UniElement | null>(null);
  122. // 淡入淡出动画引用
  123. const fadeInRef = ref<UniElement | null>(null);
  124. const fadeOutRef = ref<UniElement | null>(null);
  125. // 滑入动画引用
  126. const slideLeftRef = ref<UniElement | null>(null);
  127. const slideRightRef = ref<UniElement | null>(null);
  128. const slideUpRef = ref<UniElement | null>(null);
  129. const slideDownRef = ref<UniElement | null>(null);
  130. // 缩放动画引用
  131. const zoomInRef = ref<UniElement | null>(null);
  132. const zoomOutRef = ref<UniElement | null>(null);
  133. // 旋转翻转动画引用
  134. const rotateInRef = ref<UniElement | null>(null);
  135. const flipXRef = ref<UniElement | null>(null);
  136. const flipYRef = ref<UniElement | null>(null);
  137. // 摇摆抖动动画引用
  138. const shakeRef = ref<UniElement | null>(null);
  139. const swingRef = ref<UniElement | null>(null);
  140. const wobbleRef = ref<UniElement | null>(null);
  141. // 特殊效果动画引用
  142. const rollInRef = ref<UniElement | null>(null);
  143. const lightSpeedRef = ref<UniElement | null>(null);
  144. const rippleRef = ref<UniElement | null>(null);
  145. // 组合动画引用
  146. const sequenceRef = ref<UniElement | null>(null);
  147. // 基础动画方法
  148. function onRotate() {
  149. createAnimation(rotateRef.value, {
  150. duration: 1000,
  151. loop: -1
  152. })
  153. .rotate("0deg", "360deg")
  154. .play();
  155. }
  156. function onMove() {
  157. createAnimation(moveRef.value, {
  158. duration: 1000,
  159. loop: -1,
  160. alternate: true
  161. })
  162. .translateX("0rpx", "300rpx")
  163. .play();
  164. }
  165. function onScale() {
  166. createAnimation(scaleRef.value, {
  167. duration: 500,
  168. loop: -1,
  169. alternate: true
  170. })
  171. .scale("1", "1.2")
  172. .play();
  173. }
  174. function onOpacity() {
  175. createAnimation(opacityRef.value, {
  176. duration: 500,
  177. loop: -1,
  178. alternate: true
  179. })
  180. .opacity("1", "0.5")
  181. .play();
  182. }
  183. // 淡入淡出动画方法
  184. function onFadeToggle() {
  185. createAnimation(fadeInRef.value).fadeIn(500).play();
  186. createAnimation(fadeOutRef.value).fadeOut(500).play();
  187. }
  188. // 滑入动画方法
  189. function onSlideInToggle() {
  190. createAnimation(slideLeftRef.value).slideInLeft(400).play();
  191. createAnimation(slideRightRef.value).slideInRight(400).play();
  192. createAnimation(slideUpRef.value).slideInUp(400).play();
  193. createAnimation(slideDownRef.value).slideInDown(400).play();
  194. }
  195. // 缩放动画方法
  196. function onZoomToggle() {
  197. createAnimation(zoomInRef.value).zoomIn(400).play();
  198. createAnimation(zoomOutRef.value).zoomOut(400).play();
  199. }
  200. // 旋转翻转动画方法
  201. function onRotateFlipToggle() {
  202. createAnimation(rotateInRef.value).rotateIn(600).play();
  203. createAnimation(flipXRef.value).flipX(600).play();
  204. createAnimation(flipYRef.value).flipY(600).play();
  205. }
  206. // 摇摆抖动动画方法
  207. function onShakeToggle() {
  208. createAnimation(shakeRef.value).shake(200).play();
  209. createAnimation(swingRef.value).swing(200).play();
  210. createAnimation(wobbleRef.value).wobble(200).play();
  211. }
  212. // 特殊效果动画方法
  213. function onSpecialToggle() {
  214. createAnimation(rollInRef.value).rollIn(600).play();
  215. createAnimation(lightSpeedRef.value).lightSpeed(500).play();
  216. createAnimation(rippleRef.value).ripple(600).play();
  217. }
  218. // 异步序列动画方法
  219. async function onSequenceToggle() {
  220. createAnimation(sequenceRef.value)
  221. .sequence([
  222. (engine: AnimationEngine) => engine.fadeIn(300),
  223. (engine: AnimationEngine) => engine.scale("1", "1.5").setDuration(400),
  224. (engine: AnimationEngine) => engine.rotate("0deg", "360deg").setDuration(500),
  225. (engine: AnimationEngine) => engine.scale("1.5", "1").setDuration(300),
  226. (engine: AnimationEngine) => engine.fadeOut(300)
  227. ])
  228. .play();
  229. }
  230. onReady(() => {
  231. onRotate();
  232. onMove();
  233. onScale();
  234. onOpacity();
  235. });
  236. </script>
  237. <style lang="scss" scoped>
  238. .row {
  239. @apply flex flex-row justify-between items-center overflow-visible;
  240. margin: 0 -10rpx 20rpx -10rpx;
  241. .item {
  242. @apply flex items-center justify-center h-16 bg-primary-500 rounded-xl flex-1;
  243. margin: 0 10rpx;
  244. }
  245. }
  246. </style>