123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- <template>
- <div class="danmu" :style="{ width: `${width}px` }">
- <div class="danmu-row" :style="{ width: `${width}px` }">
- <div :style="{ left:`${width}px`}" ref="move" :id="item._id" v-for="item in danmuList1" :key="item._id" class="moveDiv">
- <image :src="item.avatar" class="img" v-if="item.avatar"></image>
- <text :class="`${platform}-title`" :style="{ color:item.color?item.color:'#fff' }">{{item.text}}</text>
- </div>
- </div>
- <div class="danmu-row" :style="{ width: `${width}px` }">
- <div :style="{ left:`${width}px`}" ref="move" :id="item._id" v-for="item in danmuList2" :key="item._id" class="moveDiv">
- <image :src="item.avatar" class="img" v-if="item.avatar"></image>
- <text :class="`${platform}-title`" :style="{ color:item.color?item.color:'#fff' }">{{item.text}}</text>
- </div>
- </div>
- <div class="danmu-row" :style="{ width: `${width}px` }">
- <div :style="{ left:`${width}px`}" ref="move" :id="item._id" v-for="item in danmuList3" :key="item._id" class="moveDiv">
- <image :src="item.avatar" class="img" v-if="item.avatar"></image>
- <text :class="`${platform}-title`" :style="{ color:item.color?item.color:'#fff' }">{{item.text}}</text>
- </div>
- </div>
- <div class="danmu-row" :style="{ width: `${width}px` }">
- <div :style="{ left:`${width}px`}" ref="move" :id="item._id" v-for="item in danmuList4" :key="item._id" class="moveDiv">
- <image :src="item.avatar" class="img" v-if="item.avatar"></image>
- <text :class="`${platform}-title`" :style="{ color:item.color?item.color:'#fff' }">{{item.text}}</text>
- </div>
- </div>
- </div>
- </template>
- <script>
- const animation = weex.requireModule('animation');
- const modal = weex.requireModule('modal');
- export default{
- props:{
- width:{
- type:Number,
- default:0
- },
- danmuList:{ //弹幕
- type:[Array],
- default:()=>[]
- },
- platform:{
- type:String,
- default:'android'
- },
- current:{
- type:Number,
- default:0
- }
- },
- data(){
- return{
- danmuList1:[],
- danmuList2:[],
- danmuList3:[],
- danmuList4:[],
- }
- },
- methods:{
- promise(){
- let promise = new Promise((resolve,reject)=>{
- setTimeout(()=>{
- resolve()
- },100)
- })
- return promise
- },
- cleanDanmu(){
- this.danmuList1 = []
- this.danmuList2 = []
- this.danmuList3 = []
- this.danmuList4 = []
- },
- randomRange(min, max) { // min最小值,max最大值
- return Math.floor(Math.random() * (max - min)) + min;
- },
- animationText(id,distance,fn){
- let el
- let elList = this.$refs.move
- for (let item of elList) {
- if(item.attr.id == id){
- el = item
- }
-
- }
- animation.transition(el, {
- styles: {
- transform: `translate( ${distance}px, 0px)`,
- },
- duration: 20000, //ms
- timingFunction: 'ease',
- delay: 0 //ms
- }, () => {
- fn()
- }
- )
- }
- },
- watch:{
- danmuList:{
- immediate:true,
- handler(newVal,oldVal){
- for (let key in newVal) {
- newVal[key]._id = key
- }
- }
- },
- current:{
- handler:async function(newVal,oldVal){
-
- //间隔0.25
- if(Math.abs(newVal-oldVal)>=0.24){
- for (let item of this.danmuList) {
- if( item.time > Math.floor(newVal*1) && item.time <= Math.floor(newVal*1+ 0.25) ) {
- let num = this.randomRange(1,5)
- this[`danmuList${num}`].push(item)
- await this.promise()
-
- //开始动画
- this.animationText(item._id,-this.width*2,()=>{
- let index
- //删除动画后的text
- for (let key in this[`danmuList${num}`]) {
- if(this[`danmuList${num}`][key]._id==item._id){
- index = key
- }
- }
- this[`danmuList${num}`].splice(index,1)
- })
- }
- }
- }
-
- }
- },
- }
- }
- </script>
- <style>
- .danmu{
- height: 160px;
- flex-direction: column;
-
- }
- .danmu-row{
- position: relative;
- height: 40px;
- flex-direction: row;
-
- }
- .moveDiv{
- position: absolute;
- flex-direction: row;
- justify-content: center;
- }
- .android-title{
- font-size: 24px;
- }
- .img{
- width: 30px;
- height: 30px;
- margin-left: 10px;
- border-radius: 15px;
- }
- .ios-title{
- font-size: 24px;
- }
- </style>
|