123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- <template>
- <view>
- <view v-for="(item, index) in dots" :key="index" :style="{
- position: 'fixed',
- borderRadius: '50%',
- left: item.left + 'px',
- top: item.top + 'px',
- display: item.show ? '' : 'none',
- width: size + 'px',
- height: size + 'px',
- background: color,
- zIndex: zIndex
- }">
- <image :src="item.src" mode="aspectFill" style="width: 100%;height: 100%;border-radius:inherit"
- v-if="item.src"></image>
- </view>
- </view>
- </template>
- <script>
- export default {
- props: {
- size: { // 尺寸:单位px
- type: Number,
- default: 20
- },
- color: {
- type: String,
- default: '#f5222d'
- },
- zIndex: {
- type: Number,
- default: 999
- },
- duration: {
- type: Number,
- default: 500
- }
- },
- data() {
- return {
- dots: [
- /* { src: '', left: 0, top: 0, show: false } */
- ]
- };
- },
- methods: {
- showBall({
- start,
- end,
- src
- }) {
- return new Promise(resolve => {
- let ball = this.dots.find(v => !v.show)
- if (!ball) {
- ball = {
- src: '',
- left: 0,
- top: 0,
- show: false
- }
- this.dots.push(ball)
- }
- let t = this.duration,
- starX = start.x - this.size / 2,
- starY = start.y - this.size / 2,
- endX = 50 - this.size / 2,
- endY = 640 - this.size / 2,
- starT = Date.now()
- let Sx = endX - starX,
- Sy = endY - starY,
- Ax = -(2 * Sx / (t * t)) / 5, // 加速度
- Ay = Math.abs(Ax),
- Vox = Sx / t - (Ax * t) / 2, // 初速度
- Voy = Sy / t - (Ay * t) / 2
- const run = () => {
- const To = Date.now() - starT
- const x = starX + (Vox * To + Ax * To * To / 2),
- y = starY + (Voy * To + Ay * To * To / 2)
- ball.left = x
- ball.top = y
- if (To < t) {
- setTimeout(run)
- } else {
- ball.show = false
- resolve()
- }
- }
- ball.src = src
- ball.show = true
- run()
- })
- }
- }
- }
- </script>
- <style>
- </style>
|