Подтвердить что ты не робот

Анимация По пути с автоматическим поворотом на основе пути в андроиде

Я пытаюсь оживить изображение мухи, которая перемещается по пути, подобному следующему изображению (которое я добавил для четкой идеи) в версии android 2.2

Ну, это можно сделать очень простым способом в iphone, поскольку у них есть свойство, устанавливающее это автоматическое вращение после рисования пути с помощью

animation.rotationMode = kCAAnimationRotateAuto;

который, я полагаю, повернет объект на основе пути

Fly path

Я могу анимировать ma fly через этот путь, используя библиотеку 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);

Таким образом, кривые рисуются по кубической кривой Бизье.

Теперь то, что я пытался, - это реализовать что-то, что позволит моей мухе вращаться по пути, и я просто не могу добраться где угодно.

Пожалуйста, помогите мне с некоторыми идеями!!!:(: (

4b9b3361

Ответ 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);
}

}