MessageVoice.vue 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <template>
  2. <view v-if="message.messageType===MessageType.voice" class="main">
  3. <view @tap="handleAudio(message)">
  4. <text>{{ message.extend.time }}"</text>
  5. <view class="sound" :class="showSpinner?'active':''">
  6. <text class="cuIcon-sound text-xxl"></text>
  7. </view>
  8. </view>
  9. </view>
  10. </template>
  11. <script setup lang="ts">
  12. import {ref} from 'vue'
  13. import MessageType from "@/utils/MessageType";
  14. import type Message from "@/mode/Message";
  15. const Audio = ref(uni.createInnerAudioContext());
  16. const showSpinner = ref(false);
  17. interface Props<T> {
  18. message: T
  19. }
  20. defineProps<Props<Message>>()
  21. //控制播放还是暂停音频文件
  22. const handleAudio = (item: Message) => {
  23. Audio.value.paused ? playAudio(item) : stopAudio();
  24. }
  25. //播放音频
  26. const playAudio = (item: Message) => {
  27. if (item.extend?.url) {
  28. showSpinner.value = true;
  29. Audio.value.src = item.extend?.url
  30. Audio.value.play();
  31. Audio.value.onEnded(() => {
  32. showSpinner.value = false;
  33. })
  34. Audio.value.onStop(() => {
  35. showSpinner.value = false;
  36. })
  37. }
  38. }
  39. //停止音频
  40. const stopAudio = () => {
  41. Audio.value.src = '';
  42. Audio.value.stop();
  43. }
  44. </script>
  45. <style scoped>
  46. /* 创建名为rotate的关键帧 */
  47. @keyframes rotate {
  48. 0% {
  49. transform: scale(1, 1);
  50. }
  51. 50% {
  52. transform: scale(1.2, 1.2);
  53. }
  54. 100% {
  55. transform: scale(1, 1);
  56. }
  57. }
  58. .sound {
  59. display: inline-flex;
  60. width: 1.25rem;
  61. height: 1.25rem;
  62. transform-origin: center;
  63. justify-content: center;
  64. align-items: center;
  65. }
  66. .active {
  67. animation-name: rotate;
  68. animation-duration: 0.5s;
  69. animation-iteration-count: infinite;
  70. animation-timing-function: linear;
  71. color: #1cbbb4;
  72. }
  73. </style>