动画沿着自动旋转的路径,基于android中的路径

时间:2012-09-13 12:44:31

标签: android android-animation

我一直试图在 Android 2.2版

中为一只苍蝇的图像添加动画效果,该图像在下面的图像中移动(我已添加了一个清晰的想法)

嗯,这可以在iphone中以非常简单的方式完成,因为它们在使用

绘制路径后有一个属性来自动旋转这个自动旋转
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);

使曲线通过立方B zier曲线绘制。

现在我一直在尝试的是实现一些允许我的苍蝇沿路径旋转的东西,我似乎无法到达任何地方。

请帮帮我一些想法! :( :(

2 个答案:

答案 0 :(得分:1)

请查看以下链接。希望它有所帮助。

https://github.com/JakeWharton/NineOldAndroids

答案 1 :(得分:1)

如果您想使用我的解决方案,则必须下载nineoldandroidsthese 4 java files的演示版和库

这很简单,我在九十多岁的游戏中修改了评估者。

这里发布的内容太多了:

只是为了得到这个想法:

我使用场角扩展PathPoint。 然后将所有计算出的点写入堆栈(简单的float [] [])

在第一次计算之后,角度可以通过堆叠中的atan和最后2个点来计算。

如果您不想使用堆叠,您可以修改时间参数并期待下一个绘制点的位置并计算出这些角度。

想一想: 你是第一次看到你走到哪里然后走路或者你只是走路然后选择目的地的角度。这不是必要的,因为我们的显示密度很高并且计算每个像素的角度。

这里是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);
}

}