Android, перемещать растровое изображение по пути? - PullRequest
2 голосов
/ 16 декабря 2010

Я хотел бы знать, возможно ли выбрать координаты на пути для рисования растрового изображения с течением времени, например, у меня есть изображение солнца, и я бы хотел со временем переместить его вдоль траектории дуги.

Есть ли способ определить такой путь, а затем двигаться по нему, чтобы мне не приходилось вычислять его математически?

Спасибо.

Ответы [ 3 ]

10 голосов
/ 27 января 2012

Да, можно перемещать изображение по траектории. Я предоставлю простое решение, чтобы показать принцип. Следующий код переместит и повернет ваше изображение. Если вам не нужно вращение, удалите флаг TANGENT_MATRIX_FLAG.

import android.graphics.*;
//somewhere global
int iCurStep = 0;// current step

//don't forget to initialize
Path pathMoveAlong = new Path();
private static Bitmap bmImage = null;

@Override
protected void onDraw(Canvas canvas) {
    Matrix mxTransform = new Matrix();
    PathMeasure pm = new PathMeasure(pathMoveAlong, false);
    float fSegmentLen = pm.getLength() / 20;//20 animation steps

    if (iCurStep <= 20) {
        pm.getMatrix(fSegmentLen * iCurStep, mxTransform,
            PathMeasure.POSITION_MATRIX_FLAG + PathMeasure.TANGENT_MATRIX_FLAG);
        canvas.drawBitmap(bmImage, mxTransform, null);
        iCurStep++;
        invalidate();
    } else {
        iCurStep = 0;
    };
};
4 голосов
/ 15 мая 2015

Вот аниматоры, которые я использую:

Цель: переместить представление "представление" по пути "путь"

v21 +:

ValueAnimator pathAnimator = ObjectAnimator.ofFloat(view, "x", "y", path)

v11 +:

ValueAnimator pathAnimator = ValueAnimator.ofFloat(0.0f, 1.0f);

pathAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
float[] point = new float[2];

@Override
    public void onAnimationUpdate(ValueAnimator animation) {
        float val = animation.getAnimatedFraction();
        PathMeasure pathMeasure = new PathMeasure(path, true);
        pathMeasure.getPosTan(pathMeasure.getLength() * val, point, null);
        view.setX(point[0]);
        view.setY(point[1]);
    }
});

Аналогичное требование к: https://stackoverflow.com/a/30254715/4344057

2 голосов
/ 11 февраля 2011

Я думаю об одном решении:

         _
       /   \

Если ваша дуга имеет такую ​​форму (то есть меньше половины круга и расположена горизонтально), то вы можете выполнить итерациюзначение х и для этого х получить у, который находится на пути.Затем переместите ваше растровое изображение в эту позицию.

...