Ответ 1
Вам нужно скачать демо и lib nineoldandroids и эти 4 java файла, если вы хотите использовать мое решение
Это было легко, я изменил оценщика в демо девятидвудройд.
Это слишком много, чтобы опубликовать здесь:
Просто чтобы понять:
Я расширяю PathPoint с помощью угла поля. Затем запишите все рассчитанные точки в стеке (простой float [] [])
После первого вычисления угол может быть рассчитан с помощью atan и последних двух точек в стеке.
Если вы не хотите использовать стек, вы можете изменить временной паттерн и посмотреть, где будет нарисована следующая точка, и вычислить угол из них.
Просто подумайте: Вы сначала смотрите, куда идете, а потом гуляете или просто ходите, а затем выбираете угол для цели. Это не обязательно, поскольку мы имеем плотность отображения, которая высока и вычисляет угол для каждого пикселя.
Здесь 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);
}
}