标记旋转后的Android Google Map InfoWindow锚点

时间:2015-10-05 07:46:03

标签: android google-maps

如何在标记旋转后重置标记的InfoWindows锚点始终位于顶部中间位置?问题是锚点与标记一起旋转。

static final LatLng PERTH = new LatLng(-31.90, 115.86);
Marker marker = mMap.addMarker(new MarkerOptions()
                    .position(PERTH)
                    .anchor(0.5,0.5)
                    .rotation(90.0)
                    .infoWindowAnchor(0.5,0));

//Update marker with new data (position and direction angle)
var angle = 130.0;
marker.setPosition(new LatLng(-30.20, 113.27)); 
marker.setRotation(angle); 
marker.setInfoWindowAnchor(x,y); // how to calculate these values?

enter image description here

1 个答案:

答案 0 :(得分:16)

var angle = 130.0; // rotation angle
var x = Math.sin(-angle * Math.PI / 180) * 0.5 + 0.5;
var y = -(Math.cos(-angle * Math.PI / 180) * 0.5 - 0.5);
marker.setInfoWindowAnchor((float)x, (float)y);

说明:

如果我们假设地图标记是圆形(最合理的旋转目的),并且我们知道InfoWindow锚点(B)可以设置为从0.0,0.0(左上角)到1,1的任何相对坐标点(右下)我们可以使用SIN和COS公式通过给定的旋转度找到圆线上的任何点。

enter image description here

  

A与B之间的X距离=半径* SIN(度);   A和B之间的Y距离=半径* COS(度);

将它们用于Android标记坐标我们得到:

var x = Math.sin(-angle * Math.PI / 180) * 0.5 + 0.5;

  1. 我们从转换的oposit旋转角度(负值)中找到SINE 至弧度(度* PI / 180);
  2. 乘以圆半径(0.5)得到X轴上的距离;
  3. 通过半径(+0.5)切换到RIGHT以处于形状的中间(在X轴上);
  4. var y = -(Math.cos(-angle * Math.PI / 180) * 0.5 - 0.5);

    1. 从oposit旋转角度(负值)转换为找到COSINE 弧度(度* PI / 180);
    2. 乘以圆半径(0.5)得到Y轴上的距离;
    3. 按半径(-0.5)向上移动到形状的顶部(在Y轴上);
    4. 使值为正(带符号),因为标记坐标系在Y轴上向下具有正值;