如果你想使用我的解决方案,你必须下载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);
}
}