2012-09-13 87 views
12

我一直在嘗試動畫的動畫圖像在下面的圖像(我已添加一個清晰的想法)在一個路徑中移動在Android版本2.2動畫沿自動旋轉的路徑基於Android中的路徑

那麼,這可以在iphone非常簡單的方式來完成,因爲他們有一個屬性forsetting該自動旋轉的路徑是用繪製後

animation.rotationMode = kCAAnimationRotateAuto; 

,我相信會旋轉基於對象在路徑上#

Fly path

我能夠使用nineoldandroid庫使用方法

path.moveTo(float x, float y); 
path.lineTo(float x, float y); 
path.curveTo(float c0X, float c0Y, float c1X, float c1Y, float x, float y); 

使得曲線經過三次貝塞爾曲線繪製動畫MA通過此路徑飛行。

現在我一直在努力實現的東西,將允許我的蒼蠅沿路徑自轉,我只是不能夠到達任何地方。

請幫助我一些想法! :(:(

+0

,我已經提到的Android版本2.2怎麼把這個程序有2作出。2只,因此我希望它解釋了爲什麼我使用NineoldAndroid庫 – John

回答

1

你要下載演示和nineoldandroids的lib和these 4 java files,如果你想用我的解決方案

這很簡單,我修改了評估在nineoldandroids的演示。

這是太多張貼在這裏:

只是爲了讓這個想法:

我與視場角擴大pathPoint都會。 然後將所有計算的點寫入堆棧(簡單浮點數[] [])

第一次計算後,可以通過堆棧中的atan和最後2個點計算角度。

如果您不想使用堆棧,您可以修改timeparam並期待下一個點的繪製位置,並計算出這些點的角度。

想一想: 你首先看你走到哪裏然後走路或者你走路然後選擇角度作爲目的地。這並不是必需的,因爲我們的顯示密度很高並計算出每個像素的角度。

這裏的PathEvaluator

public class PathEvaluatorAngle implements TypeEvaluator<PathPointAngle> { 

private static final int POINT_COUNT = 5000; 
private float[][] stack = new float[POINT_COUNT][2]; 
private int stackC = 0; 

@Override 
public PathPointAngle evaluate(float t, PathPointAngle startValue, PathPointAngle endValue) { 
    float x, y; 
    if (endValue.mOperation == PathPointAngle.CURVE) { 
     float oneMinusT = 1 - t; 
     x = oneMinusT * oneMinusT * oneMinusT * startValue.mX + 
       3 * oneMinusT * oneMinusT * t * endValue.mControl0X + 
       3 * oneMinusT * t * t * endValue.mControl1X + 
       t * t * t * endValue.mX; 
     y = oneMinusT * oneMinusT * oneMinusT * startValue.mY + 
       3 * oneMinusT * oneMinusT * t * endValue.mControl0Y + 
       3 * oneMinusT * t * t * endValue.mControl1Y + 
       t * t * t * endValue.mY; 
    } else if (endValue.mOperation == PathPointAngle.LINE) { 
     x = startValue.mX + t * (endValue.mX - startValue.mX); 
     y = startValue.mY + t * (endValue.mY - startValue.mY); 
    } else { 
     x = endValue.mX; 
     y = endValue.mY; 
    } 

    stack[stackC][0] = x; 
    stack[stackC][1] = y; 

    double angle; 

    if (stackC == 0){ 
     angle = 0; 
    } else if (stackC >= POINT_COUNT){ 
     throw new IllegalStateException("set the stack POINT_COUNT higher!"); 
    } else { 
     angle = Math.atan(
       (stack[stackC][1] - stack[stackC-1][1])/
       (stack[stackC][0] - stack[stackC-1][0])  
       ) * 180d/Math.PI; 
    } 
    stackC++; 
    return PathPointAngle.moveTo(x, y, angle); 
} 

}

+0

帶zip參考的java文件是沒有的更長的有效期,有沒有機會再次更新它,所以它會有4個java文件的代碼? – crazyPixel