成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 基于Canvas+Vue的彈幕組件的實(shí)現(xiàn)

基于Canvas+Vue的彈幕組件的實(shí)現(xiàn)

熱門標(biāo)簽:標(biāo)準(zhǔn)智能外呼系統(tǒng) 會聲會影怎樣做地圖標(biāo)注效果 洛陽市伊川縣地圖標(biāo)注中心官網(wǎng) 搜狗星級酒店地圖標(biāo)注 平頂山電子地圖標(biāo)注怎么修改 電銷機(jī)器人視頻 地圖標(biāo)注自己去過的地方 江蘇高頻外呼系統(tǒng)線路 高德地圖標(biāo)注錯誤怎么修改

最近由于項(xiàng)目需要定制化一個彈幕功能,所以嘗試使用canvas來開發(fā)組件。經(jīng)過測試在一些低端機(jī)的效果也沒有明顯的卡頓,和大家交流一下

彈幕效果

 功能介紹

  • 支持循環(huán)彈幕
  • 彈幕不重疊
  • 支持選擇軌道數(shù)
  • 支持彈幕發(fā)送

使用

npm i vue-barrage

參數(shù)配置 

name type default desc
barrageList Array [] 彈幕數(shù)據(jù)
speed Number 4 彈幕滾動速度
loop Boolean true 是否循環(huán)滾動
channels Number 2 彈幕軌道數(shù)

功能實(shí)現(xiàn)

html樣式

<template>
    <div class="barrage-container">
        <div
            class="container"
            :style="{height: barrageHeight/2+'px'}">
            <canvas
                id="canvas"
                ref="canvas"
                :width="barrageWidth"
                :height="barrageHeight"
                :style="{'width': barrageWidth/2 + 'px','height': barrageHeight/2 + 'px'}"/>
        </div>
    </div>
</template>

js實(shí)現(xiàn)

監(jiān)聽數(shù)據(jù)源

watch: {
    barrageList (val) {
        if (val.length !== 0) {
            this.initData() // 數(shù)據(jù)初始化
            this.render() // 開始渲染
        }
    }
}

數(shù)據(jù)初始化

barrageArray 是存儲彈幕數(shù)據(jù)用的,包括默認(rèn)彈幕列表和新增彈幕項(xiàng)

/**
 * 數(shù)據(jù)初始化
 */
initData () {
    for (let i = 0; i < this.barrageList.length; i++) { // 此處處理只顯示40個字符
        let content = this.barrageList[i].content.length > 40 ? `${this.barrageList[i].content.substring(0, 40)}...` : this.barrageList[i].content
        this.pushMessage(content, this.barrageList[i].color)
    }
},
/**
 * 增加數(shù)據(jù)
 * @param content
 * @param color
 */
pushMessage (content, color) {
    let position = this.getPosition() // 確定跑道位置
    let x = this.barrageWidth // 初始位置
    let offsetWidth = 0
    for (let i = 0, len = this.barrageArray.length; i < len; i++) {
        let item = this.barrageArray[i]
        if (position === item.position) { // 如果同跑道,則往后排
            offsetWidth += Math.floor(this.ctx.measureText(item.content).width * 3 + 60)
        }
    }
    this.barrageArray.push({
        content: content, // 彈幕內(nèi)容
        x: x + offsetWidth, // 確定每一條彈幕的初始位置
        originX: x + offsetWidth, // 存儲當(dāng)前彈幕的位置,以便在循環(huán)的時候使用
        position: position,
        width: this.ctx.measureText(content).width * 3, // canvas繪制內(nèi)容寬度
        color: color || this.getColor() // 自定義顏色
    })
},

初始化數(shù)據(jù)需要處理的就是計(jì)算當(dāng)前彈幕的軌道、位置、寬度,以便在 canvas 繪制的時候使用

繪制 canvas

/**
 * 渲染
 */
render () {
    this.ctx.clearRect(0, 0, this.barrageWidth, this.barrageHeight)
    this.ctx.font = '30px Microsoft YaHei'
    this.draw()
    window.requestAnimationFrame(this.render) // 每隔16.6毫秒渲染一次,如果使用setInterval的話在低端機(jī)型會有點(diǎn)卡頓
},
/**
 * 開始繪制 文字和背景
 */
draw () {
    for (let i = 0, len = this.barrageArray.length; i < len; i++) {
        let barrage = this.barrageArray[i]
        try {
            barrage.x -= this.speed
            if (barrage.x < -barrage.width - 100) { // 此處判斷彈幕消失時機(jī)
                if (i === this.barrageArray.length - 1) { // 最后一條消失時的判斷邏輯
                    if (!this.loop) { //如果不是循環(huán)彈幕的話就取消繪制 判斷是否循環(huán),不循環(huán)執(zhí)行cancelAnimationFrame
                        cancelAnimationFrame(this.render)
                        return
                    }
                    if (this.addArray.length !== 0) { // 此處判斷增加彈幕的邏輯
                        this.barrageArray = this.barrageArray.concat(this.addArray)
                        this.addArray = []
                    }
                    for (let j = 0; j < this.barrageArray.length; j++) { // 給每條彈幕的x初始值
                        this.barrageArray[j].x = this.barrageArray[j].originX
                    }
                }
            }
            if (barrage.x <= 2 * document.body.clientWidth + barrage.width) { // 判斷什么時候開始繪制,如果不判斷的話會導(dǎo)致彈幕滾動卡頓
                // 繪制背景
                this.drawRoundRect(this.ctx, barrage.x - 15, barrage.position - 30, barrage.width + 30, 40, 20, `rgba(0,0,0,0.75)`)
                // 繪制文字
                this.ctx.fillStyle = `${barrage.color}`
                this.ctx.fillText(barrage.content, barrage.x, barrage.position)
            }
        } catch (e) {
            console.log(e)
        }
    }
},

此處判斷繪制邏輯,包括什么時候取消,彈幕開始繪制判斷,彈幕消失判斷

其他函數(shù)

/**
 * 獲取文字位置
 * 使用pathWayIndex來確認(rèn)每一條彈幕所在的軌道
 * 返回距離頂部的距離
 * @TODO此處還可以優(yōu)化,根據(jù)每條軌道的距離來判斷下一條彈幕出現(xiàn)位置 
 */
getPosition () {
    let range = this.channels
    let top = (this.pathWayIndex % range) * 50 + 40
    this.pathWayIndex++
    return top
},
/**
 * 獲取隨機(jī)顏色
 */
getColor () {
    return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);
},
/**
 * 繪畫圓角矩形
 * @param context
 * @param x
 * @param y
 * @param width
 * @param height
 * @param radius
 * @param color
 */
drawRoundRect (context, x, y, width, height, radius, color) {
    context.beginPath()
    context.fillStyle = color
    context.arc(x + radius, y + radius, radius, Math.PI, Math.PI * 3 / 2)
    context.lineTo(width - radius + x, y)
    context.arc(width - radius + x, radius + y, radius, Math.PI * 3 / 2, Math.PI * 2)
    context.lineTo(width + x, height + y - radius)
    context.arc(width - radius + x, height - radius + y, radius, 0, Math.PI / 2)
    context.lineTo(radius + x, height + y)
    context.arc(radius + x, height - radius + y, radius, Math.PI / 2, Math.PI)
    context.fill()
    context.closePath()
}

此處為彈幕服務(wù)函數(shù)

使用

<barrage
    ref="barrage"
    class="barrage"
    :barrage-list="barrageList"
    :speed="speed"
    :loop="loop"
    :channels="channels"/>
    
import Barrage from 'vue-barrage'

// 彈幕數(shù)據(jù)初始化  
this.barrageList = [{
    content: '試數(shù)據(jù)測試數(shù)測試數(shù)據(jù)數(shù)測試數(shù)據(jù)',
    color: 'white'
}]

// 新增彈幕
this.$refs.barrage.add({
    content: '增加一條新的彈幕增加一條新的彈幕', color: 'white'
})

結(jié)語

總的來說這個組件還有可優(yōu)化的空間,后續(xù)我會繼續(xù)改進(jìn)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:松原 鄂爾多斯 阿克蘇 廣東 果洛 蚌埠 廣西 常德

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《基于Canvas+Vue的彈幕組件的實(shí)現(xiàn)》,本文關(guān)鍵詞  基于,Canvas+Vue,的,彈幕,組件,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《基于Canvas+Vue的彈幕組件的實(shí)現(xiàn)》相關(guān)的同類信息!
  • 本頁收集關(guān)于基于Canvas+Vue的彈幕組件的實(shí)現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    一本到不卡精品视频在线观看| 亚洲麻豆av| 黄色漫画在线免费观看| 欧美freesex黑人又粗又大| 久久久精品一区二区三区| 亚洲专区欧美专区| 亚洲一区二区三区视频播放| 国产一区二区三区乱码| 国产又粗又长又大视频| 乱色精品无码一区二区国产盗| 九九九九免费视频| 亚洲精品一线二线三线无人区| 99久久精品免费观看国产| 亚洲激情在线看| 色中色综合影院手机版在线观看| www在线视频观看| 美国做受三级的视频播放| 天天撸天天射| 97人妻精品一区二区三区免| 国产一级性片| 亚洲国产一区二区在线观看| 色婷婷国产精品免| 国产一区二区三区免费在线| 久久国内精品自在自线400部| 国产美女久久久久| 久久精品国产亚洲av高清色欲| 一区二区三区四区五区精品视频| 午夜久久影院| 免费在线一区二区| 欧美激情视频一区二区三区在线播放| 国产性猛交xx乱| 日韩免费不卡视频| 日韩精品免费视频一区二区三区| 拔插拔插华人永久免费| 久久99国产精品久久99大师| 男人日女人bb视频| 中文字幕免费精品一区| eeuss性xxxxxx电影| 色偷偷av一区二区三区| 精品国产乱码久久久久久浪潮| 色网在线观看| 久久男人av资源网站| 日本人妖在线| 黑人巨大40cm重口| 亚洲三级色网| 日韩免费网站| 粉嫩绯色av一区二区在线观看| 在线视频亚洲一区| 免费人成短视频在线观看网站| 国产一区二区视频在线看| 鲁一鲁一鲁一鲁一澡| 日韩精品视频三区| 国产一区二区三区不卡在线| 国产又黄又大久久| 手机看片国产1024| 狠狠综合久久av一区二区小说| 麻豆精品蜜桃视频网站| 91亚洲精品乱码久久久久久蜜桃| 亚洲精品喷潮一区二区三区| 校园春色 亚洲色图| 国产伦精品一区二区免费| 欧美日韩高清在线一区| 视频三区二区一区| 欧美 日韩 国产 在线观看| 涩涩涩视频在线观看| 国产日韩欧美在线一区| 人人爽人人爽av| 爱爱精品视频| 色中色综合网| 久久亚洲国产成人精品性色| 国产一二三四五| 国产精品1luya在线播放| 国产区在线视频| 日韩色图在线观看| 日韩有码av| 亚洲成人套图| 九九久久精品这里久久网| 中文字幕一区二区三区在线乱码| 国产免费高清视频| 亚洲黄色天堂| 亚洲精品影视在线观看| 亚洲韩国在线| 成人天堂资源www在线| 欧美美女一区二区三区| 国产精品白嫩白嫩大学美女| 精品美女国产在线| 亚洲国产999| 日产精品久久久一区二区福利| 亚洲一区二区欧美| 欧美—级高清免费播放| 久久久久久久久久久久久久久久久久av| 欧美××××黑人××性爽| 国产精品久久久久9999高清| 九九视频精品全部免费播放| 国产精品theporn| 国模gogo一区二区大胆私拍| 国产精品国模大尺度私拍| 国产欧美一区二区三区另类精品| 亚洲国产91视频| 蜜桃av噜噜一区二区三区麻豆| 亚洲精品aaaaa| 亚洲嫩草精品久久| 91理论片午午论夜理片久久| 综合久久婷婷| 久久久久久久久久久久91| 亚洲一二区在线| 国产精品久久久久久久免费看| 亚洲一区二区三区中文字幕在线观看| 一区二区三区四区蜜桃| 欧美性猛交xxxx乱大交91| 欧美日韩在线播| 99爱视频在线| 日韩精品极品视频免费观看| 欧美日韩亚洲另类| 亚洲精品电影网在线观看| 黄色大片在线观看| 欧美日本国产视频| 青娱乐精品视频| 国产精品一页| 性欧美xxxx视频在线观看| 午夜视频一区在线观看| a天堂中文在线88| 国产理论视频在线观看| 国产亚洲精品aa午夜观看| 欧美va亚洲va在线观看蝴蝶网| 久久久成人精品视频| 国产一级在线| 黄色av电影网站| 日本爱爱小视频| 欧美日韩一区二区不卡| 午夜视频在线观看一区二区| 青青草国产精品一区二区| 国产中文第一页| 中国人与牲禽动交精品| 久久国产精品久久久久久小说| 不卡av日日日| 污片免费在线观看| 91福利视频在线观看| 伊人久久一区二区三区| 国产一精品一aⅴ一免费| 99九九电视剧免费观看| 免费的av网站| 国产成人精品日本亚洲专区61| 欧美韩一区二区| 一级黄色大片免费| 国产亚洲综合色| 阿v天堂2017| 久久九九久久九九| 一本一道波多野结衣一区二区| 一区二区三区午夜视频| 色综合.com| 国产视色精品亚洲一区二区| 中文字幕av一区二区三区谷原希美| 国内视频自拍在线视频| 亚洲91精品| 亚洲一区二区在线播放相泽| 久久国产日韩欧美精品| 在线成人黄色| 神马一区二区影院| 激情综合闲人网| 亚洲天堂成人av| 米奇精品一区二区三区在线观看| 亚洲色图色老头| 久久久久久三级| 欧美成人精品福利网站| 日本免费高清一区二区| 国产精品天干天干在观线| 99久久久久久久| 中文字幕在线免费不卡| 国产精品一区免费在线观看| 好好的日comwww| 精品久久久久久中文字幕人妻最新| 精品无码久久久久久国产| 免费看黄色网址| 91av资源网| 136福利精品导航| 日韩午夜电影免费看| 亚洲a一区二区| 看黄网站在线| 麻豆影视国产在线观看| 91成人天堂久久成人| 少妇高潮一区二区三区喷水| 久热久精久品这里在线观看| 欧美本精品男人aⅴ天堂| 日本免费观看网站| 亚洲综合伊人久久| 香蕉视频污视频| 老司机精品视频网站| 精一区二区三区| 国产精品视频二区三区| 999久久久国产| 国产传媒一区二区三区| 97久久超碰精品国产| 欧美熟妇精品一区二区| 亚洲精品一线| 国产白丝在线观看| 国产精品第六页| 精品国产乱码久久久久久蜜臀网站| 亚洲欧洲日本韩国| 欧美亚洲三级| 精品视频vs精品视频| 国内自拍视频一区| 国产网站欧美日韩免费精品在线观看| 欧美猛男超大videosgay| 国产日韩欧美一区二区三区| 国产3p露脸普通话对白| 2018中文字幕在线观看| 风流老熟女一区二区三区| 福利一区视频在线观看| 91麻豆精品国产91久久久久| 国产一区二区三区天码| 粉嫩一区二区三区四区公司1| 4438全国亚洲精品在线观看视频| 亚洲综合色区另类av| 欧美日韩国产麻豆| 欧美午夜电影网| 日韩写真欧美这视频| 日韩av午夜| 在线免费观看av影视天堂| 日韩成人高清在线| 国产又粗又猛又爽又黄91精品| 久久精品欧美日韩精品| 欧美视频在线不卡| 亚洲自拍另类综合| 日韩高清三区| 无码人妻一区二区三区在线视频| 加勒比日本影视| 手机av免费在线| 日本在线免费观看一区| 日韩麻豆第一页| 午夜视频在线看| www.99精品| 亚洲狠狠婷婷综合久久久| 亚洲欧洲色图| 免费在线观看的毛片| www.99riav| 国产丝袜高跟一区| 精品亚洲国内自在自线福利| 黄视频网站在线观看| 欧美一区二区在线看| 国产成人午夜精品影院观看视频| 精品久久久久久久久国产字幕| 欧美极品aaaaabbbbb| sm国产在线调教视频| 国产乱码精品一区二区三区精东| 成年人在线观看视频免费| 91中文字幕永久在线| 国产精品久久久久999| julia一区二区三区中文字幕| 成人亚洲免费视频| 国产成人在线色| 91久久精品一区二区| fc2成人免费人成在线观看播放| 亚洲裸体俱乐部裸体舞表演av| 成人激情视频在线| 精品久久一二三| 色视频在线播放| 综合区小说区图片区在线一区| xxxwww国产| 中文天堂在线视频| 亚色视频在线播放| 椎名由奈av一区二区三区| 国产一级粉嫩xxxx| 国产免费一区二区三区网站免费| 亚洲国产成人精品一区二区三区| 国产精品久久精品牛牛影视| 91大片在线观看| 国产一区二区三区不卡视频网站| 中文字幕欧美日韩久久| 69视频在线播放| 国产青青草视频| 黄色片在线免费观看| 日韩有吗在线观看| 99久久婷婷国产综合| 一二三四区视频| 欧美激情四色| 久久www免费人成精品| 猫咪av网站| 亚洲国产精品二十页| 在线免费视频一区| av大全在线| 国产欧美在线一区二区| 亚洲一区在线日韩在线深爱| 日韩中文字幕久久久经典网| 成人免费乱码大片a毛片软件| 免看一级a毛片一片成人不卡| 疯狂做受xxxx欧美肥白少妇| 微拍福利一区二区| 性欧美大战久久久久久久免费观看| 日韩欧美电影在线观看| 婷婷五月色综合| 亚洲尤物影院| 在线播放成人av| 亚洲国产一区二区三区a毛片| 奇米777影视成人四色| 夜夜嗨av禁果av粉嫩avhd| 秋霞午夜一区二区| 国产欧美一区二区精品久久久| 久草中文在线视频| 成年女人18级毛片毛片免费| 岛国一区二区三区高清视频| 国产剧情在线视频| 美女毛片在线观看| 欧美伦理在线视频| 婷婷激情五月网| 色大18成网站www在线观看| 一本大道色婷婷在线| 久久国产精品视频| 欧美高清hd18日本| 亚洲综合无码一区二区| japanese国产精品| 亚洲夂夂婷婷色拍ww47| 污视频网站入口| 久久国产亚洲| 欧美日韩久久一区二区| 国内福利写真片视频在线| 艳色歌舞团一区二区三区| 视频一区二区三区不卡| 丰满肉嫩西川结衣av| 国产精品1024| 好吊操视频这里只有精品| 人人草在线视频| 北条麻妃99精品青青久久| 久久久久久草| 国产成人在线视频播放| 超碰国产精品久久国产精品99| 一个人在线观看免费视频www| 午夜精品理论片|