Android: как вращать движущийся анимированный спрайт на основе координат его пункта назначения
Мое приложение запускает экземпляры спрайтов вокруг Canvas, которые затем перемещаются по экрану в направлении координаты a x/y. Я хотел бы иметь возможность вращать спрайт вокруг его центра так, чтобы он смотрел на свои координаты назначения. Я использую спрайт-лист и у меня были проблемы с отсечкой. Я также нашел много хороших примеров, но, кажется, ничто не покрывает именно то, что я ищу. Этот пример очень близок, но для эффективности я использую класс ImagePooler и не могу перезагрузить изображение при каждом рисовании / повороте. Поэтому, если бы у кого-то была идея, как вращать предварительно загруженное изображение без вырезания моего спрайт-листа, я был бы очень благодарен.
2 ответа
Сначала легко повернуть спрайт, используя холст или матрицу:
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, которая зависит от того, куда изначально указывает ваш спрайт.
Я не уверен, что это сработает, но надеюсь, что это может дать вам некоторые идеи...
Используя эту ссылку для расчета угла:
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);
}