2012-09-13 86 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