您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

AudioLevelIndicator.js 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import React, { Component } from 'react';
  2. /**
  3. * The number of dots to display in AudioLevelIndicator.
  4. *
  5. * IMPORTANT: AudioLevelIndicator assumes that this is an odd number.
  6. */
  7. const AUDIO_LEVEL_DOTS = 5;
  8. /**
  9. * The index of the dot that is at the direct middle of all other dots.
  10. */
  11. const CENTER_DOT_INDEX = Math.floor(AUDIO_LEVEL_DOTS / 2);
  12. /**
  13. * Creates a ReactElement responsible for drawing audio levels.
  14. *
  15. * @extends {Component}
  16. */
  17. class AudioLevelIndicator extends Component {
  18. /**
  19. * {@code AudioLevelIndicator}'s property types.
  20. *
  21. * @static
  22. */
  23. static propTypes = {
  24. /**
  25. * The current audio level to display. The value should be a number
  26. * between 0 and 1.
  27. *
  28. * @type {number}
  29. */
  30. audioLevel: React.PropTypes.number
  31. };
  32. /**
  33. * Implements React's {@link Component#render()}.
  34. *
  35. * @inheritdoc
  36. * @returns {ReactElement}
  37. */
  38. render() {
  39. // First make sure we are sensitive enough.
  40. const audioLevel = Math.min(this.props.audioLevel * 1.2, 1);
  41. // Let's now stretch the audio level over the number of dots we have.
  42. const stretchedAudioLevel = AUDIO_LEVEL_DOTS * audioLevel;
  43. const audioLevelDots = [];
  44. for (let i = 0; i < AUDIO_LEVEL_DOTS; i++) {
  45. const distanceFromCenter = CENTER_DOT_INDEX - i;
  46. const audioLevelFromCenter
  47. = stretchedAudioLevel - Math.abs(distanceFromCenter);
  48. const cappedOpacity = Math.min(
  49. 1, Math.max(0, audioLevelFromCenter));
  50. let className;
  51. if (distanceFromCenter === 0) {
  52. className = 'audiodot-middle';
  53. } else if (distanceFromCenter < 0) {
  54. className = 'audiodot-top';
  55. } else {
  56. className = 'audiodot-bottom';
  57. }
  58. audioLevelDots.push(
  59. <span
  60. className = { className }
  61. key = { i }
  62. style = {{ opacity: cappedOpacity }} />
  63. );
  64. }
  65. return (
  66. <span className = 'audioindicator in-react'>
  67. { audioLevelDots }
  68. </span>
  69. );
  70. }
  71. }
  72. export default AudioLevelIndicator;