GoJs的文本繪圖模板TextBlock使用實(shí)例
前言
文接上回,我們已經(jīng)使用gojs
實(shí)現(xiàn)了一個(gè)最最最基本的樹形布局。這次我們開始對(duì)圖形的骨架進(jìn)行一個(gè)內(nèi)容展示上的豐富和顯示風(fēng)格上的美化??梢哉f(shuō)我們圖形的節(jié)點(diǎn)部分是我們整個(gè)圖形大部分信息的一個(gè)展示載體。而我們的需求當(dāng)中,為了使一些信息更加形象,醒目。我們會(huì)用到文本,圖標(biāo),圖片,和節(jié)點(diǎn)的背景的顏色等等來(lái)顯示不同類型的節(jié)點(diǎn)。
TextBlock的使用
本次的介紹便是通過(guò)TextBlock
的屬性來(lái)控制節(jié)點(diǎn)內(nèi)的文本顯示內(nèi)容和一些樣式的修改,對(duì)我們的關(guān)系圖進(jìn)行進(jìn)一步的豐富。首先我們先準(zhǔn)備一些數(shù)據(jù)
nodes: [ { key: "1", text: "三國(guó)人物志", nodeBs: "root", }, { key: "1-1", text: "曹操", nodeBs: "cc", }, { key: "1-2", text: "劉備", nodeBs: "lb", }, { key: "1-3", text: "孫權(quán)", nodeBs: "sq", }, ], links: [ { from: "1", to: "1-1", }, { from: "1", to: "1-2", }, { from: "1", to: "1-3", }, ],
其中nodes
中的key
字段為節(jié)點(diǎn)的唯一標(biāo)識(shí),為必須。而text
字段則是我們希望顯示到節(jié)點(diǎn)上的內(nèi)容,nodeBs
主要是一個(gè)節(jié)點(diǎn)的標(biāo)識(shí),方便批量處理一些節(jié)點(diǎn)的時(shí)候進(jìn)行判斷。links
中存放的為必須的from(起點(diǎn))和to(終點(diǎn))字段。
this.myDiagram = $$(go.Diagram, "myDiagramDiv", { layout: $$(go.TreeLayout),//在初始化時(shí)畫布的布局方式 }); this.myDiagram.nodeTemplate = $$( go.Node, //節(jié)點(diǎn)的node配置項(xiàng) "Horizontal", //節(jié)點(diǎn)內(nèi)部的布局方式 $$( go.TextBlock,//指定為gojs規(guī)定的文本顯示形式 new go.Binding("text", "text") //將我們的text字段顯示到節(jié)點(diǎn)中 ) ) this.myDiagram.model = new go.GraphLinksModel(this.nodes, this.links);
在這里我們可以看一下,通過(guò)我們實(shí)例化之后的nodeTemplate
屬性來(lái)實(shí)現(xiàn)我們的node
的模板進(jìn)行一個(gè)自定義的填充內(nèi)容,來(lái)實(shí)現(xiàn)節(jié)點(diǎn)內(nèi)部不同內(nèi)容的顯示。其中go.Node
是固定搭配,就是我們是對(duì)node
模板進(jìn)行一個(gè)配置,然后就需要我們我們的操作對(duì)象為node
,然后再內(nèi)部嵌套各種其他的模板。Horizontal
是節(jié)點(diǎn)內(nèi)部的一種布局方式,這個(gè)我們后面會(huì)統(tǒng)一進(jìn)行分析。
當(dāng)然你也可以寫成這種形式
this.myDiagram.nodeTemplate = new go.Node().add(new go.TextBlock().bind("text"));
因?yàn)榈谝环N的寫法比較清晰,因此我們主要是采用第一種方式進(jìn)行節(jié)點(diǎn)內(nèi)的布局填充,這樣我們就得到了這樣一個(gè)圖形
TextBlock的配置屬性
在這里對(duì)顯示的文字修改一下樣式,這里列舉一些常用的屬性
$$( go.TextBlock,//指定為gojs規(guī)定的文本顯示形式 { stroke: "red",//設(shè)置字體顏色,默認(rèn)為黑色 background:"yellow",//字體的背景顏色,默認(rèn)透明 font: "14px,sans-serif ",//字體的名稱,大小,是否加粗等 margin:8,//類似css,外邊距 width:20,//寬度 height:20,//高度 textAlign:'left',//文本的對(duì)齊方式,有l(wèi)eft,center,right三種屬性 alignment:go.Spot.Left, // 文本在父級(jí)結(jié)構(gòu)中的對(duì)齊方式,有g(shù)o.Spot.Left,go.Spot.Center,go.Spot.Right三種屬性 minSize: new go.Size(10, 14),//文本的最小尺寸,兩個(gè)參數(shù)分別為寬和高 maxSize: new go.Size(NaN, NaN), //文本的最大寬度,如果我們?cè)O(shè)置為NaN,其尺寸會(huì)進(jìn)行自適應(yīng) overflow: go.TextBlock.OverflowClip,//文本溢出寬度之后的顯示方式,OverflowClip為換行.OverflowEllipsis是顯示省略號(hào) maxLines: 2,//換行之后最多顯示幾行 verticalAlignment:"Top"http://垂直方向上的的對(duì)齊方式,有Top,Center,Bottom三種屬性 }, )
既然textAlign
和alignment
都是文本的對(duì)齊方式,那他們之間有什么區(qū)別呢?我們把節(jié)點(diǎn)單獨(dú)給拿出來(lái),然后分別對(duì)添加這兩種屬性的三個(gè)參數(shù)值進(jìn)行對(duì)比一下。
$$(go.Panel, 'Vertical',{width:300,background:'#67B73C'},//父級(jí)模板,相當(dāng)于外層html標(biāo)簽,然后我們給外層標(biāo)簽一個(gè)寬度 $$(go.TextBlock,{textAlign:'left',text:'textAlignLeft',width:200,background:'#FF9900',margin:5}), $$(go.TextBlock,{textAlign:'center',text:'textAlignCenter',width:200,background:'#FF9900',margin:5}), $$(go.TextBlock,{textAlign:'right',text:'textAlignRight',width:200,background:'#FF9900',margin:5}), $$(go.TextBlock,{alignment:go.Spot.Left,text:'alignmentLeft',width:200,background:'#FF9900',margin:5}), $$(go.TextBlock,{alignment:go.Spot.Center,text:'alignmentCenter',width:200,background:'#FF9900',margin:5}), $$(go.TextBlock,{alignment:go.Spot.Right,text:'alignmentRight',width:200,background:'#FF9900',margin:5}) ),
我們?cè)谕鈱釉黾右粋€(gè)模板并且添加寬度之后,分別在內(nèi)層的文本標(biāo)簽設(shè)置不同的屬性和屬性值,顯示內(nèi)容可以知道。textAlign
屬性是如果設(shè)置了文本區(qū)域的寬度,在文本顯示區(qū)域內(nèi)部居左、居中、居右顯示。而alignment
屬性則是以文本區(qū)域?yàn)橐粋€(gè)整體,全部?jī)?nèi)容在父級(jí)模板中的相對(duì)位置居左、居中、居右。
然后我們看一下overflow
的兩種文本溢出方式的區(qū)別
$$(go.Panel, 'Vertical',{width:300,background:'#67B73C'}, $$(go.TextBlock,{text:'go textBlock overflowDefult overflowDefult',width:100,background:'#FF9900',margin:5}), $$(go.TextBlock,{text:'go textBlock overflowDefult overflowDefult',maxLines: 2,width:100,background:'#FF9900',margin:5}), $$(go.TextBlock,{overflow: go.TextBlock.OverflowClip,text:'go textBlock overflowClip overflowClip',width:100,background:'#FF9900',margin:5}), $$(go.TextBlock,{overflow: go.TextBlock.OverflowClip,maxLines: 2,text:'go textBlock overflowClip overflowClip',width:100,background:'#FF9900',margin:5}), $$(go.TextBlock,{overflow: go.TextBlock.OverflowEllipsis,text:'go textBlock overflowEllipsis overflowEllipsis',width:100,background:'#FF9900',margin:5}), $$(go.TextBlock,{overflow: go.TextBlock.OverflowEllipsis,maxLines: 2,text:'go textBlock overflowEllipsis overflowEllipsis',width:100,background:'#FF9900',margin:5}), ),
由此我們可以發(fā)現(xiàn)overflow
的兩種屬性go.TextBlock.OverflowClip
和go.TextBlock.OverflowEllipsis
在單獨(dú)設(shè)置的時(shí)候是和默認(rèn)效果沒(méi)有區(qū)別的,都是會(huì)默認(rèn)進(jìn)行一個(gè)換行。而如果我們?cè)偌由闲袛?shù)的限制maxLines: 2
之后就出現(xiàn)了區(qū)別go.TextBlock.OverflowClip
屬性是和默認(rèn)情況是一樣的,會(huì)對(duì)我們的文本進(jìn)行一個(gè)整詞切割,而go.TextBlock.OverflowEllipsis
則是出現(xiàn)了超出部門內(nèi)容顯示...,因此在開發(fā)過(guò)程中我們可以可以對(duì)超長(zhǎng)文本進(jìn)行go.TextBlock.OverflowEllipsis
屬性和maxLines
的結(jié)合使用,保證項(xiàng)目中的的節(jié)點(diǎn)的規(guī)格不至于過(guò)長(zhǎng)而導(dǎo)致圖形的顯示冗余。
節(jié)點(diǎn)內(nèi)文本的雙擊編輯
gojs還為我們提供了editable
屬性,可以在節(jié)點(diǎn)內(nèi)直接雙擊出現(xiàn)的輸入框?qū)ξ覀兊墓?jié)點(diǎn)內(nèi)的文本顯示進(jìn)行一個(gè)編輯,在編輯完成之后,只需要點(diǎn)擊畫布就可以把編輯后的內(nèi)容顯示到節(jié)點(diǎn)之中。
$$( go.TextBlock, { editable:true,//是否開啟雙擊編輯節(jié)點(diǎn)內(nèi)部文本功能 textEdited: function (tb, olds, news) {//編輯文本成功之后的回調(diào)函數(shù) console.log(tb.part.data,olds,news) } }, new go.Binding("text", "text") ),
在節(jié)點(diǎn)的文本框雙擊之后就可以出現(xiàn)一個(gè)輸入框的彈出,可以輸入新的內(nèi)容之后點(diǎn)擊畫布,然后在編輯成功之后的回調(diào)函數(shù)textEdited
分別有三個(gè)參數(shù),我們可以通過(guò)第一個(gè)參數(shù)的tb.part.data
來(lái)獲取我們操作的節(jié)點(diǎn)的全部數(shù)據(jù),而第二個(gè)參數(shù)則是編輯之前的內(nèi)容(也就是我們示例中的曹操),而第三個(gè)參數(shù)則是我們編輯之后的內(nèi)容(也就是我們示例中的曹操阿瞞)。因此我們可以通過(guò)獲取之后的新值來(lái)更改我們的數(shù)據(jù)來(lái)保證數(shù)據(jù)和圖中內(nèi)容對(duì)應(yīng)。
以上就是GoJs的文本繪圖模板TextBlock使用實(shí)例的詳細(xì)內(nèi)容,更多關(guān)于GoJs TextBlock文本繪圖模板的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Javascript中valueOf與toString區(qū)別淺析
Javascript中valueOf與toString區(qū)別淺析,需要的朋友可以參考一下2013-03-03微信小程序開發(fā)(一):服務(wù)器獲取數(shù)據(jù)列表渲染操作示例
這篇文章主要介紹了微信小程序開發(fā)服務(wù)器獲取數(shù)據(jù)列表渲染操作,結(jié)合實(shí)例形式分析了微信小程序后臺(tái)獲取服務(wù)器數(shù)據(jù)及前臺(tái)列表渲染相關(guān)操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-06-06深入理解JavaScript系列(6):S.O.L.I.D五大原則之單一職責(zé)SRP
Bob大叔提出并發(fā)揚(yáng)了S.O.L.I.D五大原則,用來(lái)更好地進(jìn)行面向?qū)ο缶幊?/div> 2012-01-01JS中實(shí)現(xiàn)函數(shù)return多個(gè)返回值的實(shí)例
下面小編就為大家?guī)?lái)一篇JS中實(shí)現(xiàn)函數(shù)return多個(gè)返回值的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02JS計(jì)算距當(dāng)前時(shí)間的時(shí)間差實(shí)例
下面小編就為大家分享一篇JS計(jì)算距當(dāng)前時(shí)間的時(shí)間差實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12js判斷滾動(dòng)條是否已到頁(yè)面最底部或頂部實(shí)例
這篇文章主要介紹了js判斷滾動(dòng)條是否已到頁(yè)面最底部或頂部的原理與方法,以實(shí)例的形式詳細(xì)分析了js實(shí)現(xiàn)返回頂部功能所涉及的各種技巧,并對(duì)相關(guān)知識(shí)點(diǎn)進(jìn)行了總結(jié)歸納,需要的朋友可以參考下2014-11-11JavaScript股票的動(dòng)態(tài)買賣規(guī)劃實(shí)例分析上篇
這篇文章主要介紹了JavaScript對(duì)于動(dòng)態(tài)規(guī)劃解決股票問(wèn)題的真題例舉講解。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08uni-app使用uni-download和uni.saveFile下載保存文件遇到的問(wèn)題及解決方法
這篇文章主要給大家介紹了關(guān)于uni-app使用uni-download和uni.saveFile下載保存文件遇到的問(wèn)題及解決方法的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2024-01-01最新評(píng)論