Android: как вращать движущийся анимированный спрайт на основе координат его пункта назначения - PullRequest
6 голосов
/ 14 мая 2011

Мое приложение запускает экземпляры спрайтов вокруг Canvas, которые затем перемещаются по экрану в направлении координаты x / y. Я хотел бы иметь возможность вращать спрайт вокруг его центра так, чтобы он смотрел на свои координаты назначения. Я использую спрайт-лист и у меня были проблемы с отсечкой. Я также нашел много хороших примеров, но, кажется, ничто не покрывает именно то, что я ищу. Этот пример очень близок , но для эффективности я использую класс ImagePooler и не могу перезагрузить изображение при каждом рисовании / повороте. Поэтому, если бы у кого-то была идея, как вращать предварительно загруженное изображение без вырезания моего спрайта, я был бы очень благодарен.

Ответы [ 2 ]

14 голосов
/ 14 мая 2011

Сначала легко вращать спрайт, вы можете использовать холст или матрицу:

Matrix matrix = new Matrix();
matrix.postRotate(angle, (ballW / 2), (ballH / 2)); //rotate it
matrix.postTranslate(X, Y); //move it into x, y position
canvas.drawBitmap(ball, matrix, null); //draw the ball with the applied matrix

// method two 
canvas.save(); //save the position of the canvas
canvas.rotate(angle, X + (ballW / 2), Y + (ballH / 2)); //rotate the canvas' matrix
canvas.drawBitmap(ball, X, Y, null); //draw the ball on the "rotated" canvas
canvas.restore(); //rotate the canvas' matrix back
//in the second method only the ball was roteded not the entire canvas

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

spriteToDestAngle =  Math.toDegrees(Math.atan2((spriteX - destX)/(spriteY - destY)));

Теперь все, что вам нужно сделать, это использовать этот угол для поворота спрайта и настроить его с помощью константы, такой как angleShift, которая зависит от того, куда изначально указывает ваш спрайт.

Я не уверен, что это сработает, но надеюсь, что это может дать вам некоторые идеи ...

0 голосов
/ 11 сентября 2013

с использованием этой ссылки для вычисления угла:

private double angleFromCoordinate(double lat1, double long1, double lat2,
        double long2) {

    double dLon = (long2 - long1);

    double y = Math.sin(dLon) * Math.cos(lat2);
    double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1)
            * Math.cos(lat2) * Math.cos(dLon);

    double brng = Math.atan2(y, x);

    brng = Math.toDegrees(brng);
    brng = (brng + 360) % 360;
    brng = 360 - brng;

    return brng;
}

и затем поверните ImageView на этот угол

private void rotateImage(ImageView imageView, double angle) {

    Matrix matrix = new Matrix();
    imageView.setScaleType(ScaleType.MATRIX); // required
    matrix.postRotate((float) angle, imageView.getDrawable().getBounds()
            .width() / 2, imageView.getDrawable().getBounds().height() / 2);
    imageView.setImageMatrix(matrix);
}
...