Повернуть матрицу для растрового изображения - Android
У меня есть пользовательская карта (холст), на которой я рисую указатель карты. Я обновляю его в моем методе onLocationChanged моего основного класса, однако я изо всех сил пытаюсь заставить растровое изображение вращаться. getBearing(), кажется, не работает (по крайней мере, не для меня), и поэтому я работаю, чтобы найти наклон между точками на карте. Любая помощь будет принята с благодарностью.
public void setBearing(Point prev, Point curr){
float slope = 1;
if (prev.x - curr.x !=0){
slope = (float) ((y1-y2)/(x1-x2));
bearing = (float) Math.atan(slope);
}
}
...
Paint p = new Paint();
Matrix matrix = new Matrix();
matrix.postRotate(bearing, coords.x, coords.y);
Bitmap rotatedImage = Bitmap.createBitmap(image, 0, 0, image.getWidth(),
image.getHeight(), matrix, true);
canvas.drawBitmap(rotatedImage, x-image.getWidth()/2, y-image.getHeight()/2, p);
Редактировать:
Использование координат широты и долготы для поиска направления сложнее, чем просто между двумя точками. Однако этот код (модифицированный из кода, найденного здесь) работает хорошо:
public void setBearing(Location one, Location two){
double lat1 = one.getLatitude();
double lon1 = one.getLongitude();
double lat2 = two.getLatitude();
double lon2 = two.getLongitude();
double deltaLon = lon2-lon1;
double y = Math.sin(deltaLon) * Math.cos(lat2);
double x = Math.cos(lat1)*Math.sin(lat2) - Math.sin(lat1)*Math.cos(lat2)*Math.cos(deltaLon);
bearing = (float) Math.toDegrees(Math.atan2(y, x));
}
3 ответа
Вот как вращать растровое изображение: Android: как вращать движущийся анимированный спрайт на основе координат его назначения
Чтобы правильно рассчитать угол с минимумом суеты и деления на ноль рисков, atan2()
должно быть предпочтительнее atan()
, Следующая функция возвращает угол относительно оси x ненулевого вектора из a
в b
:
public float getBearing(Point a, Point b) { // Valid for a != b.
float dx = b.x - a.x;
float dy = b.y - a.y;
return (float)Math.atan2(dy, dx);
}
Я не могу дать совет о том, как повернуть растровое изображение на заданный угол, так как я не знаком с вашим API.
Если вы хотите повернуть 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);
}