canvas控件--折線圖--區(qū)間選擇功能(下)

上一篇彼棍,我們討論了如何通過canvas繪制一個折線圖
接下來,我們將給這個折線圖實(shí)現(xiàn)鼠標(biāo)交互效果

首先咐扭,鼠標(biāo)在我們的折線圖上移動時子寓,我們要一個藍(lán)色的豎線跟隨鼠標(biāo)移動
要實(shí)現(xiàn)這個效果,我們一步一步來
1辜羊、我們需要在canvas的mousemove事件方法中踏兜,根據(jù)鼠標(biāo)位置clientX/Y词顾,和容器的top/left值,計(jì)算出鼠標(biāo)所在處的canvas坐標(biāo)碱妆;
2肉盹、根據(jù)鼠標(biāo)坐標(biāo)判斷鼠標(biāo)是否在折線圖上,如果鼠標(biāo)在折線圖上疹尾,將鼠標(biāo)x軸坐標(biāo)(即橫向坐標(biāo))保存在mousemovePositionx變量中上忍,如果鼠標(biāo)不在折線圖上,將mousemovePositionx變量設(shè)置為null;
3纳本、drow方法中判斷mousemovePositionx變量是否為null窍蓝,若不為null,則根據(jù)mousemovePositionx的值繪制藍(lán)色線段
在線展示及代碼

然后繁成,我們分解一下鼠標(biāo)拖動選擇時間區(qū)間這個操作
1吓笙、鼠標(biāo)按下; 2巾腕、鼠標(biāo)移動面睛; 3、鼠標(biāo)抬起
實(shí)際上我們只需要在鼠標(biāo)按下時記錄鼠標(biāo)按下的位置尊搬,鼠標(biāo)抬起時叁鉴,根據(jù)鼠標(biāo)抬起位置和之前記錄的鼠標(biāo)按下的位置,便可以得到拖拽動作選擇的區(qū)間
但是這樣做佛寿,鼠標(biāo)移動時沒有任何交互效果
為了更好的用戶體驗(yàn)幌墓,我們可以在鼠標(biāo)移動方法中,通過鼠標(biāo)位置與鼠標(biāo)按下位置冀泻,將已選擇區(qū)間記錄下來克锣,供draw方法繪制相應(yīng)交互效果

       mousedown = e => {
            const x = e.clientX - L,
                y = e.clientY - T;
            if (y > chartTop && y < chartBottom && x > chartLeft && x < chartRight ) {
                mouseDownZB = x;
            } else {
                mouseDownZB = null;
            }
        }
        mousemove = e => {
            const x = e.clientX - L,
                y = e.clientY - T;
            if (y > chartTop && y < chartBottom && x > chartLeft && x < chartRight ) {
                mouseMovePosition = x;
                if (mouseDownZB !== null) {
                    mouseSelected = [mouseDownZB, x];
                } else {
                    mouseSelected = null;
                }
            } else {
                mouseMovePosition = null;
            }
        }
        mouseup = e => {
            mouseDownZB = null;
            mouseSelected = null;
        }

        drawOther = () => {
            ...
            if (mouseSelected !== null) {
                ctx.save();
                ctx.fillStyle = "rgba(55, 183, 248, 0.5)";
                ctx.beginPath();
                ctx.rect(mouseSelected[0], chartTop, Math.abs(mouseSelected[0] - mouseSelected[1]), ylength);
                ctx.fill();
            }
        }

上面這段代碼,實(shí)現(xiàn)了鼠標(biāo)拖拽選擇區(qū)間腔长,mouseup中將mouseDownZB袭祟,mouseSelected兩個變量置為null,此時我們已經(jīng)選擇了一個區(qū)間捞附,需要將沒有選擇的區(qū)間置為灰色巾乳,
因此我需要在將變量mouseSelected置為null前,賦值變量hasSelected = mouseSelected
drawOther方法中添加代碼

if (hasSelected !== null) {
    ctx.save();
    ctx.strokeStyle = '#CCCCCC';
    ctx.fillStyle = 'rgba(230, 230, 230, 0.8)';
    ctx.beginPath();
    ctx.rect(chartLeft, chartTop, hasSelected[0] - chartLeft, ylength);
    ctx.fill();
    ctx.stroke();
    ctx.beginPath();
    ctx.rect(hasSelected[1], chartTop, chartRight - hasSelected[1], ylength);
    ctx.fill();
    ctx.stroke();
    ctx.restore();
}

查看代碼鸟召,細(xì)心的同學(xué)可能已經(jīng)發(fā)現(xiàn)了胆绊,第一次選擇區(qū)間后,再選擇區(qū)間欧募,偶爾在上部會出現(xiàn)一道灰線压状,如下圖


這個問題與canvas劃線的方式有關(guān),有興趣的同學(xué)自行百度,這里我們只需修改一下清除畫布方法即可
ctx.clearRect(chartLeft, chartTop - 1, xlength, ylength + 1);//清除變動區(qū)域

標(biāo)記出已選擇部分還不夠种冬,我們需要計(jì)算出選擇區(qū)域起止點(diǎn)具體時間

data[Math.ceil((hasSelected[0] - chartLeft) / xstep)].date;
data[Math.floor((hasSelected[1] - chartLeft) / xstep)].date

這樣一個簡單的附帶區(qū)間選擇的折線圖就完成了
查看es6簡化版在線示例及代碼
查看es5完整版版在線示例及代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末镣丑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子娱两,更是在濱河造成了極大的恐慌莺匠,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件十兢,死亡現(xiàn)場離奇詭異趣竣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旱物,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門遥缕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宵呛,你說我怎么就攤上這事单匣。” “怎么了烤蜕?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵封孙,是天一觀的道長迹冤。 經(jīng)常有香客問我讽营,道長,這世上最難降的妖魔是什么泡徙? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任橱鹏,我火速辦了婚禮,結(jié)果婚禮上堪藐,老公的妹妹穿的比我還像新娘莉兰。我一直安慰自己,他們只是感情好礁竞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布糖荒。 她就那樣靜靜地躺著,像睡著了一般模捂。 火紅的嫁衣襯著肌膚如雪捶朵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天狂男,我揣著相機(jī)與錄音综看,去河邊找鬼。 笑死岖食,一個胖子當(dāng)著我的面吹牛红碑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泡垃,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼析珊,長吁一口氣:“原來是場噩夢啊……” “哼羡鸥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唾琼,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤兄春,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锡溯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赶舆,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年祭饭,在試婚紗的時候發(fā)現(xiàn)自己被綠了芜茵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡倡蝙,死狀恐怖九串,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寺鸥,我是刑警寧澤猪钮,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布筋栋,位于F島的核電站味抖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏玻孟。R本人自食惡果不足惜笆载,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一扑馁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凉驻,春花似錦腻要、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胀滚,卻和暖如春趟济,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛛淋。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工咙好, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人褐荷。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓勾效,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子层宫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 根據(jù)項(xiàng)目上的需求封裝的一個控件杨伙,不知道叫什么好,暫時命名為時間區(qū)間選擇器吧萌腿。簡單來講限匣,就是一個折線圖,x軸為時間毁菱,...
    王恩智閱讀 928評論 0 1
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程米死,因...
    小菜c閱讀 6,365評論 0 17
  • 基本介紹 關(guān)于 canvas 的基本使用,可以參考以下兩個網(wǎng)站: Android Canvas繪圖詳解(圖文) -...
    LiuHDme閱讀 3,223評論 0 0
  • 一場陽光清掃 點(diǎn)點(diǎn)被毀壞的暗贮庞。樹枝 斜向一座建筑物的頂端: 用石頭構(gòu)架地基與外表峦筒, 層層上升。也許能夠—— 無限延...
    一個名叫Alan的男子閱讀 248評論 1 3
  • 堅(jiān)持寫字二十天之后,我停下來了遮斥。這二十天里我每天花費(fèi)四到六個小時來寫峦失,但寫出來的僅僅是自己覺得姑且成文而已。本來以...
    Sora夜白鹿閱讀 1,458評論 52 54