騰訊AlloyTeam正式發佈pasition - 製做酷炫Path過渡動畫


pasition

Pasition - Path Transition with little JS code, render to anywhere - 超小尺寸的Path過渡動畫類庫javascript

最近和貝塞爾曲線槓上了,如curvejspasition 都是貝塞爾曲線的應用案例,將來還有一款和貝塞爾曲線相關的開源的東西,暫時保密。java

安裝

npm install pasition複製代碼

CDN地址下載下來使用:git

unpkg.com/pasition@1.…github

使用指南

pasition.lerp

你能夠經過 pasition.lerp 方法拿到插值中的shapes:web

var shapes  = pasition.lerp(pathA, pathB, 0.5)
//拿到shapes以後你能夠在任何你想要渲染的地方繪製,如canvas、svg、webgl等
...複製代碼

pasition.animate

pasition.animate({
    from : fromPath,
    to : toPath,
    time : time,
    easing : function(){ },
    begin :function(shapes){ },
    progress : function(shapes, percent){ },
    end : function(shapes){ }
})複製代碼

path從哪裏來?你能夠從svg的path的d屬性獲取。npm

支持全部的SVG Path命令:canvas

M/m = moveto
L/l = lineto
H/h = horizontal lineto
V/v = vertical lineto
C/c = curveto
S/s = smooth curveto
A/a = elliptical Arc
Z/z = closepath
Q/q = quadratic Belzier curve
T/t = smooth quadratic Belzier curveto複製代碼

舉個例子:數組

pasition.animate({
            from: 'M 40 40 Q 60 80 80 40T 120 40 T 160 40 z',
            to: 'M32,0C14.4,0,0,14.4,0,32s14.3,32,32,32 s32-14.3,32-32S49.7,0,32,0z',
            time: 1000,
            easing : function(){ },
            begin:function(shapes){ },
            progress : function(shapes, percent){
                //你能夠在任何你想繪製的地方繪製,如canvas、svg、webgl
            },
            end : function(shapes){ }
        });複製代碼

對上面傳入的配置項目一一解釋下:svg

  • from 起始的路徑
  • to 終點的路徑
  • time 從from到to所須要的時間
  • easing 緩動函數(不填默認是勻速運動)
  • begin 開始運動的回調函數
  • progress 運動過程當中的回調函數
  • end 運動結束的回調函數

在progress裏能夠拿到path轉變過程當中的shapes和運動進度percent(範圍是0-1)。下面來看看shapes的結構:函數

[
    [
       [],    //curve
       [],    //curve
       []    //curve 
    ],      //shape 
    [[],[],[],[],[]],     //shape 
    [[],[],[],[],[]]     //shape 
]複製代碼

在開發者工具裏截圖:

每條curve都包含8個數字,分別表明三次貝塞爾曲線的 起點 控制點 控制點 終點。

每一個shape都是閉合的,因此shape的基本規則是:

  • 每條curve的終點就是下一條curve的起點
  • 最後一條curve的終點就是第一條curve的起點

知道基本規則以後,咱們能夠進行渲染,這裏拿canvas裏渲染爲例子:

Fill模式:

function renderShapes(context, curves, color){
    context.beginPath();
    context.fillStyle = color||'black';
    context.moveTo(curves[0][0], curves[0][1]);
    curves.forEach(function(points){
        context.bezierCurveTo(points[2], points[3], points[4], points[5], points[6], points[7]);
    })
    context.closePath();
    context.fill();
}

shapes.forEach(function(curves){
    renderShapes(context,curves,"#006DF0")
})複製代碼

Stroke模式:

function renderCurve(context, points, color){
    context.beginPath();
    context.strokeStyle = color||'black';
    context.moveTo(points[0], points[1]);
    context.bezierCurveTo(points[2], points[3], points[4], points[5], points[6], points[7]);
    context.stroke();
}

shapes.forEach(function(curves){
    curves.forEach(function (curve) {
        renderCurve(context, curve, "#006DF0")
    })    
})複製代碼

固然你也能夠把shapes轉成SVG的命令在SVG渲染,這應該不是什麼困難的事情:

function toSVGPath(shapes){
        //把 shapes數組轉成 M....C........C........Z M....C.....C....C...Z 的字符串。
    }複製代碼

這個函數能夠自行嘗試一下,生成出的字符串賦值給SVG的Path的d就能夠了。

Github

github.com/AlloyTeam/p…

License

This content is released under the MIT License.

相關文章
相關標籤/搜索