2015-09-24 60 views
0

如何使用curvedmotion實現此動畫,因爲文檔沒有很好的示例。 或者我不明白。 https://www.google.com/design/spec/animation/meaningful-transitions.html#meaningful-transitions-hierarchical-timingAndroid有意義的轉換示例

Consistent choreography

先進的感謝。

+0

[檢查](http://developer.android.com/intl/ru/training/material/animations.html#CurvedMotion)。它就在您提到的文檔底部。 – Skynet

+0

另外,Topeka https://github.com/googlesamples/android-topeka/releases/tag/09072015 – freddieptf

回答

1

這很容易,可以使用非常簡單的動畫師來完成。

正如你所看到的,路徑基本上是一個橢圓的四分之一。橢圓的參數方程是這樣的:

X = A * COS(T) Y = B * COS(T)

參見:http://www.mathopenref.com/coordparamellipse.html

所以,你有三個參數。其中兩個(a,b)是四分之一橢圓的邊界框的寬度和高度。第三個可以從動畫插補器中獲取。要獲得正確的季度,您需要一個範圍[PI * 3/2,PI * 2]的值。

final View fab; 
final int startX = fab.getTranslationX(),startY = fab.getTranslationY(); 
final int endX = 100,endY = 0; 
ValueAnimator animator = ValueAnimator.ofFloat((float)(Math.PI*3/2),(float)(Math.PI*2)); 
animator.setInterpolator(new DecelerateInterpolator()); 
animator.setDuration(500); 
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator valueAnimator) { 
     float t = (float) valueAnimator.getAnimatedValue(); 
     float a = endX-startX; 
     float b = endY-startY; 
     fab.setTranslationX((float) (a*Math.cos(t))); 
     fab.setTranslationY((float) (b*Math.sin(t))); 
    } 
}); 
animator.start(); 
+0

非常感謝你 – schwertfisch