在Google Maps v2 for Android上重绘位图

时间:2013-07-15 22:14:28

标签: android google-maps-android-api-2

在这种情况下,我想使用gms v2在Google地图上绘制位图,每个用户位置更新都会强制执行位图更新。目前我使用以下代码段:

public void init(){
    result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    canvas = new Canvas(result);
}

public void update(){
    // draw on canvas ...
    draw(result);
}

public void draw(Bitmap modifiedBmp) {
    if (overlay != null) {
        overlay.remove();
    }

    BitmapDescriptor descriptor = BitmapDescriptorFactory.fromBitmap(modifiedBmp);
    overlay = map.addGroundOverlay(new GroundOverlayOptions().image(descriptor).positionFromBounds(bounds).zIndex(100));
} 

每秒调用update()方法。我发现这种方法非常低效,我正在寻找更好的解决方案(即每次更新后不需要添加/删除叠加)。使用addPolygon(...)addPolyline(...)在地图上绘制图元不是一种选择,因为我需要标准API中不存在的绘图功能。

2 个答案:

答案 0 :(得分:7)

一个优化可能是检查新位置是否与旧位置相同,如果是这种情况则不重绘。另外我不认为每次都需要创建描述符。

描述移动标记的另一种方法here。这是官方样本中的那个。

答案 1 :(得分:4)

我不确定这是否是您想要的,但这就是我在Google地图中使用自定义位图的方式。

标记代码:

BitmapDescriptor iconBitmap = BitmapDescriptorFactory
                    .fromResource(R.drawable.item_map_marker);

MarkerOptions options = new MarkerOptions();
options.position(new LatLng(hs.lat, hs.lng));
options.title(hs.sitename);
options.snippet(hs.street + ", " + hs.suburb);
options.icon(iconBitmap);

mMap.addMarker(options);

工具提示适配器:

public class MyInfoWindowAdapter implements InfoWindowAdapter {

    public interface OnRenderCustomInfoWindow {

        public void onRender(Marker marker, View mWindow);
    }

    private View                     mWindow;

    private OnRenderCustomInfoWindow mRenderer;

    public MyInfoWindowAdapter(Context context, 
            OnRenderCustomInfoWindow onRender) {
        mRenderer = onRender;
        mWindow = LayoutInflater.from(context).inflate(
            R.layout.view_services_map_infowindow, null);
    }

    @Override
    public View getInfoWindow(Marker marker) {
        mRenderer.onRender(marker, mWindow);
        return mWindow;
    }

    @Override
    public View getInfoContents(Marker marker) {
        return null;
    }
}