12

我一直在尝试在android 版本 2.2中为苍蝇的图像制作动画,该图像在如下图所示的路径中移动(我添加了一个清晰的想法)

好吧,这可以在 iphone 中以非常简单的方式完成,因为它们具有在使用绘制路径后设置自动旋转的属性

animation.rotationMode = kCAAnimationRotateAuto;

我相信会根据路径旋转对象`

飞行路径

我可以使用Nineoldandroid库使用方法让 ma 飞过这条路径

 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);

这样曲线是通过三次贝塞尔曲线绘制的。

现在我一直在尝试实现一些东西,让我的苍蝇沿着路径自行旋转,而我似乎无法到达任何地方。

请帮我出一些主意!!!:( :(

4

2 回答 2

1

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

https://github.com/JakeWharton/NineOldAndroids

于 2012-09-26T10:10:07.377 回答
1

如果你想使用我的解决方案,你必须下载nineoldandroids的demo和lib以及这4个java文件

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

在这里发帖太多了:

只是为了得到这个想法:

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

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

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

试想一下:你是先看你要去哪里然后走路,还是你只是走路然后选择目的地的角度。这不是必需的,因为我们有很高的显示密度并计算每个像素的角度。

这是路径评估器

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);
}

}

于 2014-05-14T22:31:46.783 回答