亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

HTML5中怎么用Canvas實現文字動畫特效

發布時間:2022-03-01 15:45:21 來源:億速云 閱讀:272 作者:iii 欄目:web開發

本篇內容介紹了“HTML5中怎么用Canvas實現文字動畫特效”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

  代碼總共一百來行,比較簡單,前面說過我的英文字母是用矢量繪制的,用矢量繪制圖形的好處非常多,比如圖片縮放不會失真,這樣在不同的Retina顯示屏上我也不需要提供不同尺寸的圖片;還有就是用JSON的方式來描述矢量,格式比較簡潔等等。

  矢量圖片

  接下來繪制這些矢量圖片(這里只拿出第一個H進行說明):

  {"width":10,//設置矢量的寬

  "height":10,//設置矢量的高

  "comps":[//矢量圖形的組件Array數組,每個數組對象為一個獨立的組件類型,數組的順序為組件繪制先后順序{"type":"text",//文本類型

  "text":"H",//文本內容

  "color":"rgb(69,69,69)",//文本顏色

  "align":"center",//文本在矢量中的對齊方式

  "opacity":{//文本透明度

  "func":"attr@text.opacity",//設置業務屬性,對文本進行透明度的數據綁定

  "value":1//如果func中的值為空或者undefined,那么就直接用這個值},"clipDirection":"bottom",//裁切方向為“從上到下”

  "rect":[//指定組件繪制在矢量中的矩形邊界

  0,//代表左上角坐標x

  0,//代表左上角坐標y

  10,//代表組件的width

  10//代表組件的height]

  }]

  }

  繪制矢量圖形是通過JSON格式來書寫的,主要的參數有三個:width、height以及comps。這三個參數都必須要寫上,其中width為矢量圖形的寬度,height為矢量圖形的高度,comps里面是一個Array數組,數組中是一個個獨立的對象,可以對這個對象設置一些預定義參數,也可設置一些可選的參數信息。

  這里我將所有的文本信息存儲在一個數組中,方便調用:

  arr=[

  {label:'H',image:'symbols/H.json'},

  {label:'T',image:'symbols/T.json'},

  {label:'f',image:'symbols/f.json'},

  {label:'o',image:'symbols/o.json'},

  {label:'r',image:'symbols/r.json'},

  {label:'W',image:'symbols/W.json'},

  {label:'e',image:'symbols/e.json'},

  {label:'b',image:'symbols/b.json'},

  ];

  第一個label對象為矢量圖形的名稱,第二個image對象我們設置的是json格式的圖片,但是實際上可以為img、canvas對象或圖片url或base64字符串。

  創建節點對象

  對象的圖片已經生成,接下來就是創建對象了,這里英文字母總共8個,那么我們創建8個節點對象:

  vars=80;

  arr.forEach(function(obj,index){

  vartext=obj.label;

  name='t'+text;

  window[name]=createNode(obj.image,100+s*index,100);

  });

  functioncreateNode(image,x,y){//節點對象聲明

  varnode=newht.Node();//這個類為ht中定義的節點

  node.setSize(0,0);//設置節點大小

  if(image)node.setImage(image);//設置節點圖片

  if(x&&y)node.setPosition(x,y);//設置節點擺放位置

  dm.add(node);//將節點添加進數據容器datamodel中

  returnnode;

  }

  關于上面的ht.Node節點的生成,其實這個只是HT封裝好的類,這個類上面有很多很方便的API。然后將這個生成的節點添加進數據容器dm中,這個數據容器又是整個拓撲圖gv的數據容器。

  拓撲圖生成

  來看看如何生成這個拓撲圖吧:

  dm=newht.DataModel();//數據容器gv=newht.graph.GraphView(dm);//拓撲圖通過gv.getView()可獲得這個拓撲圖的底層pgv.addToDOM();//將gv添加進body中

  實際上HT的原理就是在一個p中的canvas上繪制圖形,也就是說這個gv就是一個canvas。

  然后通過getView獲取這個canvas的底層p,這樣我們就能將這個p添加到html頁面的任何地方了,addToDOM的定義如下:

  addToDOM=function(){

  varself=this,

  view=self.getView(),//獲取底層p

  style=view.style;

  document.body.appendChild(view);//將底層p添加到body中

  style.left='0';//因為HT默認將組件的position設置為absolute所以要設置位置

  style.right='0';

  style.top='0';

  style.bottom='0';

  window.addEventListener('resize',function(){self.iv();},false);//窗口大小變化觸發事件,調用最外層組件invalidate(即iv)函數進行更新。}

  現在刷新頁面,你會看到一片空白,為什么?因為前面設置節點的大小為0啊,怎么會顯示,這個Demo的效果就是從無到有,又從有到無。那接下來看看如何“從無到有”。

  文本動畫

  就像我剛剛說過的,要想讓節點顯示,肯定是需要設置節點的大小為我們肉眼可視的范圍才會出現,但是我的目的不僅是從無到有,也是從小到大,這個能夠一氣呵成么?感覺好像代碼內容簡單,但是代碼量卻不小的一個任務,我定義了一個函數用來將節點從無到有,從小到大:

  functionsetSize(node){

  if(node){

  vars=80,

  size=node.getSize().width;//獲取節點當前的大小中的寬度,因為我知道寬高都是一樣的,所以簡寫了

  varsw=s-size;

  ht.Default.startAnim({//HT封裝的動畫函數,內容也是JSON格式的對象

  duration:1000,//動畫周期毫秒數

  easing:function(t){returnt*t},//動畫緩動函數

  action:function(v,t){//action函數必須提供,實現動畫過程中的屬性變化第一個參數v代表通過easing(t)函數運算后的值,t代表當前動畫進行的進度[0~1],一般屬性變化根據v參數進行

  node.setSize(//設置節點的大小(有一個緩動的過程通過sw*v實現的)

  size+sw*v,

  size+sw*v

  );

  }

  });

  }

  }

  從大到小,從有到無的過程也跟上面類似,我就不贅述了。

  要讓這些字母按照時間的先后順序出現和消失,肯定需要用到setTimeout方法,要想實現一次的顯示消失是非常容易的,但是我在實現的過程掉到了setTimeout的一個陷阱中,只能說自己學藝不精吧。因為我們需要給不同的字母設置不同的出現和消失時間,一般比較簡單的方法就是設置一個固定的值,然后乘以對應節點專屬的index:

  functionanimateIn(){

  for(leti=0;i<arr.length;i++){

  varname='t'+arr[i];

  animateLetterIn(window[name],i);//這個部分設置動畫

  }

  }

  可是如果我直接在for循環中設置setTimeout的時間為動態變化的,那么這個動態變化的值肯定是只取for循環的最后一個值,所以我將setTimeout的方法抽取出來作為一個單獨的函數:

  functionanimateLetterIn(node,i){

  setTimeout(function(){

  setSize(node);

  },i*200);//這時候這個i取的就是節點對應的i而不是最后一個值了

  if(i===arr.length-1){//當節點為最后一個節點時,設置節點淡出動畫

  setTimeout(function(){

  animateOut();//節點淡出動畫

  },(arr.length+3)*200);

  }

  }

  HTML5中怎么用Canvas實現文字動畫特效

“HTML5中怎么用Canvas實現文字動畫特效”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

望谟县| 濮阳市| 潞城市| 万宁市| 康乐县| 汉中市| 内乡县| 连城县| 浦江县| 伊宁市| 舞阳县| 称多县| 定南县| 梅州市| 沁源县| 石门县| 白河县| 泗阳县| 南澳县| 于田县| 藁城市| 永新县| 博白县| 合江县| 汶川县| 呈贡县| 榆中县| 资溪县| 长春市| 广平县| 荃湾区| 融水| 乡城县| 陇西县| 乌恰县| 涞水县| 汽车| 临夏县| 繁昌县| 沛县| 永宁县|