Android中基于路径的自动旋转沿路径动画

12
我一直在尝试动画化一张飞蝇的图片,其移动路径如下图所示(我已经添加了该图以便更清晰地理解),并且需要在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);

使曲线通过三次贝塞尔曲线绘制。

现在我一直在尝试实现一个能让我的飞行物沿着路径自旋转的东西,但我似乎无法取得任何进展。

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


我提到了ANDROID版本2.2,因为这个应用程序必须只能在2.2中制作,因此我希望这解释了为什么我使用了NineoldAndroid库。 - John
2个回答

1
如果您想使用我的解决方案,您需要下载nineoldandroids的演示和库以及这4个java文件

很简单,我修改了nineoldandroids演示中的评估器。

这里就不一一列举了:

简单来说:

我用字段角度扩展了PathPoint。然后将所有计算出的点写入一个堆栈(一个简单的float[][])

在第一次计算之后,可以通过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);
}

}


Java文件与zip引用不再有效,您是否有可能再次更新它,以便它包含4个Java文件的代码? - crazyPixel

1

我在问题中提到了,我也使用了NineOldAndroid jar文件.....不管怎样...谢谢。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接