經過一番研究,我還沒有發現比上飛的標記創建位圖或者任何更好的選擇。但我也在地圖上創建了帶多邊形的圓。請注意,這不是真正高性能的解決方案,但對我而言,這是一個不錯的選擇。 代碼示例:
private static final int CIRCLE_POLYGON_VERTICES = 16;
private static final double EARTH_RADIUS = 6378.1d;
private List<LatLng> createCirclePolygon(LatLng center, double r) {
List<LatLng> res = new ArrayList<LatLng>(CIRCLE_POLYGON_VERTICES);
double r_latitude = MathUtils.rad2deg(r/EARTH_RADIUS);
double r_longitude = r_latitude/Math.cos(MathUtils.deg2rad(center.latitude));
for (int point = 0; point < CIRCLE_POLYGON_VERTICES + 1; point++) {
double theta = Math.PI * ((double)point/(CIRCLE_POLYGON_VERTICES/2));
double circle_x = center.longitude + (r_longitude * Math.cos(theta));
double circle_y = center.latitude + (r_latitude * Math.sin(theta));
res.add(new LatLng(circle_y, circle_x));
}
return res;
}
private Bitmap getClusteredLabel(String cnt, Context ctx) {
Resources r = ctx.getResources();
Bitmap res = BitmapFactory.decodeResource(r, R.drawable.map_cluster_bg);
res = res.copy(Bitmap.Config.ARGB_8888, true);
Canvas c = new Canvas(res);
Paint textPaint = new Paint();
textPaint.setAntiAlias(true);
textPaint.setTextAlign(Paint.Align.CENTER);
textPaint.setTypeface(Typeface.DEFAULT_BOLD);
textPaint.setColor(Color.WHITE);
textPaint.setTextSize(21);
c.drawText(String.valueOf(cnt), res.getWidth()/2, res.getHeight()/2 + textPaint.getTextSize()/3, textPaint);
return res;
}
public void createClusteredOverlay(MapPinData point, GoogleMap map, Context ctx) {
if (point.getCount() > 1) {
map.addMarker(new MarkerOptions().position(point.getLatLng()).anchor(0.5f, 0.5f).icon(BitmapDescriptorFactory.fromBitmap(getClusteredLabel(String.valueOf(point.getCount()), ctx))));
map.addPolygon(new PolygonOptions()
.addAll(createCirclePolygon(point.getLatLng(), point.getRadius()))
.fillColor(Color.argb(50, 0, 0, 10))
.strokeWidth(0)
);
} else {
map.addMarker(new MarkerOptions().position(point.getLatLng()).title(point.getTitle()));
}
}
我MathUtils方法:
public static double deg2rad(double deg) {
return (deg * Math.PI/180.0);
}
public static double rad2deg(double rad) {
return (rad * 180.0/Math.PI);
}
如果你在方圓百里,你應該改變EARTH_RADIUS常數英里,3963 AFAIK。
我想過另一種看起來更好的替代方法:使用標記類,但不是提供靜態圖像,而是通過創建所需大小的Bitmap對象並使用Canvas對象繪製它來即時創建圖像。 Mark –
上面的替代方案可能需要省略簇半徑,因爲這會使得整個事物(而不僅僅是包含計數的圓)受到命中測試的影響,從而防止點擊到達半徑圓下面的事物計數圈。 –
使用位圖對象比使用Drawable有更好的性能嗎? –