2013-07-03 37 views
3

我正在嘗試使用自定義TimeInterpolator來編寫CSS立方貝塞爾動畫定時功能的等效物。我的目標是重新設計Android設計團隊提供的動畫效果,並且我已經非常接近。設計者給了我們一個用HTML和CSS編寫的例子,它使用了立方貝塞爾動畫定時功能。我已經實現了一個貝齊爾曲線函數,我在TimeInterpolator中使用它來計算我的計時的插值,但感覺就像是在反向運行。我想將我的插值與HTML/CSS中出現的插值進行比較,以查看我的位置。如何調試立方貝塞爾動畫定時功能

的CSS(一些代碼刪除)我試圖模擬天生是這樣的:

    @keyframes svgPulse { 
        0% { transform: scale(1.0) translate(22px, 22px); animation-timing-function: cubic-bezier(0.33,0.00,0.00,1.00); } 
       } 

我調用方法是這樣的:

cubicBezier(0.33, 0.00, 0.00, 1.00) 

它調用這個方法:

private TimeInterpolator cubicBezier(final double p1, final double p2, final double p3, final double p4) { 
    return new TimeInterpolator() { 
     @Override 
     public float getInterpolation(float time) { 
      return (float) Arcs.bezierPoint(p1, p2, p3, p4, time); 
     } 
    }; 
} 

其中貝塞爾點實現如下:

public static double bezierPoint(double point1, double point2, double point3, double point4, double time) { 
    double t1 = 1.0f - time; 
    return point1*t1*t1*t1 + 3*point2*time*t1*t1 + 3*point3*time*time*t1 + point4*time*time*time; 
} 

我可以設置一個斷點或添加一個日誌語句來轉儲插值,但我不知道如何在HTML動畫中插入或記錄插值,以便與之比較。最後,我想清晰一步動畫定時功能。 CSS的大量使用:

50% { transform: scale(1.0); animation-timing-function: steps(1); } 

我有腦屁,不能認爲過去這天真的實施安卓

private TimeInterpolator steps(int numSteps) { 
    return new TimeInterpolator() { 
     @Override 
     public float getInterpolation(float time) { 
      return time/numSteps; 
     } 
    }; 
} 

這甚至接近?我只簡單地瀏覽了關於步驟功能的文檔,我可以完全關閉。

回答

0

關於你的第一個問題,看到這個question;特別是第二個答案。無論如何,我會推薦你​​用一個浮點屬性來完成你的測試,而不是變換;這會給你更難記錄的矩陣。 (既然你感興趣的只是計時功能)

在另一方面,步驟功能需要一個地板()微積分,東西線:

floor (currentTime * numSteps/totalTime) 

中的步驟的情況下( n,結束);並且在步驟(n,start)的情況下遞增1(