vue+heatmap.js實(shí)現(xiàn)自定義圖片熱力圖并且自適應(yīng)

heatmap.png

基本實(shí)現(xiàn)

如圖就是最終效果,由于做的項(xiàng)目數(shù)據(jù)可視化選擇的是Echarts,所以一開始是打算想用Echarts直接實(shí)現(xiàn)對(duì)任意圖片的熱力圖,但本人水平有限,用Echarts沒做出來,所以找到了用heatmap.js來做。
-語法都很簡(jiǎn)單,去網(wǎng)站documents看一下一會(huì)就會(huì)了。

<div id="heatmap" style=" width:40%; height: 50%; border: 1px solid;border-color: grey;">
    <img id="baidu-img" src="images/hanzhong.png" style="width: 100%; height: 100%; ">
    <img src="images/hanzhong_re.png " style="width: 100%; height: 100%; top: 0px;position: absolute; z-index: 1">
</div>
$("canvas,heatmap").remove();
                     _this.heatmapInstance = h337.create({
                        container: document.querySelector("#heatmap"),
                        radius: 50,
                        maxOpacity: 0.5,
                        minOpacity: 0,
                        blur: 0.75
                    });
                    var data = {
                        max: _this.max,
                        data: _this.points
                    };
                    _this.heatmapInstance.setData(data);

放一點(diǎn)核心的代碼吧。應(yīng)該很容易理解。

自適應(yīng)大小

重點(diǎn)要說一下這里要實(shí)現(xiàn)自適應(yīng)大小怎么做。這里的data的數(shù)據(jù)結(jié)構(gòu)是[{x:1,y:2,value:3}]這樣的一個(gè)數(shù)組,里邊的x、y分別對(duì)應(yīng)的是從圖片左上角為(0,0)起點(diǎn),x代表距離左邊的像素距離,y代表距離上方的像素距離絕對(duì)值。
1.第一步

  //要用一個(gè)全局變量記錄初始的寬和高
_this.cavWidth = document.getElementById("heatmap").clientWidth;
_this.cavHeight = document.getElementById("heatmap").clientHeight;

2.第二步
通過Vue的watch監(jiān)聽這兩個(gè)值

            cavWidth(curVal, oldVal) {
                var _this = this;
                this.cavWidth = curVal;
                if (oldVal != 0) {
                    for (i = 0; i < this.points.length; i++) {
                        this.points[i].x = (this.points[i].x * curVal / oldVal).toFixed(0);
                    }
                    _this.init();
                }

                console.log("寬=" + curVal, oldVal);
            },
            cavHeight(curVal, oldVal) {
                var _this = this;
                this.cavHeight = curVal;
                if (oldVal != 0) {
                    for (i = 0; i < this.points.length; i++) {
                        this.points[i].y = (this.points[i].y * curVal / oldVal).toFixed(0);
                    }
                    _this.init();
                }
                console.log("高=" + curVal, oldVal);
            },

3.第三步
這樣還沒有實(shí)現(xiàn)監(jiān)聽值變化的效果,還需要用mounted鉤子函數(shù)聲明一下resize方法

       mounted() {
           var _this = this
           window.onresize = () => {
               return (() => {
                   _this.cavWidth = document.getElementById("heatmap").clientWidth;
                   _this.cavHeight = document.getElementById("heatmap").clientHeight;
               })()
           }
       },

這樣就可以實(shí)現(xiàn)自適應(yīng)的了。
但是這里有個(gè)問題,由于計(jì)算后的x、y會(huì)是小數(shù)值,這里一旦存在小數(shù)就沒辦法渲染熱力圖效果了,所以我toFixed(0)了,但是這樣會(huì)存在誤差,有知道的人可以告訴我一下。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 文章圖片上傳不正常,如需文檔,可聯(lián)系微信:1017429387 目錄 1 安裝... 4 1.1 配置探針... ...
    Mrhappy_a7eb閱讀 6,907評(píng)論 0 5
  • 【Android 動(dòng)畫】 動(dòng)畫分類補(bǔ)間動(dòng)畫(Tween動(dòng)畫)幀動(dòng)畫(Frame 動(dòng)畫)屬性動(dòng)畫(Property ...
    Rtia閱讀 6,372評(píng)論 1 38
  • 人每當(dāng)遇事不順時(shí),就開始為自己尋找理由,情形、時(shí)機(jī)、天氣、運(yùn)勢(shì),依靠種種借口來安慰自己,心想“不該是這樣的,好想重...
    Psycho_布丁閱讀 1,172評(píng)論 3 3
  • 我曾經(jīng)以為,這會(huì)是一本純粹的游記,記錄大陸那邊一個(gè)遙遠(yuǎn)夢(mèng)幻的地方和一段不真實(shí)的時(shí)空,記錄一個(gè)跨越五年的夢(mèng)想實(shí)現(xiàn)的最...
    星汨尛Novia閱讀 758評(píng)論 0 2
  • 1.意想不到,早上來后打掃衛(wèi)生的時(shí)候,陳老師去后花園拿拖布沖洗的時(shí)候,突然大聲說我去,拖布怎么結(jié)冰了,心想是啊現(xiàn)在...
    云少nn閱讀 145評(píng)論 0 0

友情鏈接更多精彩內(nèi)容