Android 通过谷歌地图添加视图

Android 通过谷歌地图添加视图,android,google-maps,Android,Google Maps,我试图在谷歌地图片段的标记上添加一个视图 即使在旧的不推荐使用的函数中,我也到处搜索,但似乎无论我使用什么方法,maps都会在我创建的视图上调用canvas.draw(),将其转换为位图“Picture”,但我希望在包含textview的标记上显示一个气泡,从用户输入文本以不显示某些文本 有什么可行的方法可以做到这一点吗 注意:我试图避免创建视图并将其放置在realtivelayout中的片段上,因为如果可能的话,我试图避免计算标记的位置 我本来会把我的一些代码,但我不能决定这是相关的 不幸的是

我试图在谷歌地图片段的标记上添加一个视图 即使在旧的不推荐使用的函数中,我也到处搜索,但似乎无论我使用什么方法,maps都会在我创建的视图上调用canvas.draw(),将其转换为位图“Picture”,但我希望在包含textview的标记上显示一个气泡,从用户输入文本以不显示某些文本

有什么可行的方法可以做到这一点吗

注意:我试图避免创建视图并将其放置在realtivelayout中的片段上,因为如果可能的话,我试图避免计算标记的位置


我本来会把我的一些代码,但我不能决定这是相关的

不幸的是,对于当前版本的Maps v2 api,除了监视标记位置之外,没有其他方法可以做到这一点

下面是如何做到这一点的示例代码

我在自己的应用程序中使用了这个方法,效果很好

AbsoluteLayout.LayoutParams overlayLayoutParams;

ViewGroup infoWindowContainer; // your custom info window


private void showInfoWindow(Marker marker) {
    /*
        prepare & show your custom info window 
    */
    trackedPosition = marker.getPosition();
    startPositionUpdater();
}

private void hideInfoWindow() {
    /*
        hide your custom info window
    */
    stopPositionUpdater();
}


private void startPositionUpdater() {
    if (trackedPosition != null && infoWindowContainer.getVisibility() == VISIBLE && map != null) {
        positionUpdaterRunnable = new PositionUpdaterRunnable();
        handler.post(positionUpdaterRunnable);
    }
}

private void stopPositionUpdater() {
    if(positionUpdaterRunnable != null) {
        handler.removeCallbacks(positionUpdaterRunnable);
        positionUpdaterRunnable = null;
    }
}    


private class PositionUpdaterRunnable implements Runnable {
    private int lastXPosition = Integer.MIN_VALUE;
    private int lastYPosition = Integer.MIN_VALUE;

    @Override
    public void run() {
        if (trackedPosition != null && isInfoWindowShown() && map != null && handler != null) {

            Projection projection = map.getProjection();
            Point targetPosition = projection.toScreenLocation(trackedPosition);

            if (lastXPosition != targetPosition.x || lastYPosition != targetPosition.y) {
                overlayLayoutParams.x = targetPosition.x - popupXOffset;
                overlayLayoutParams.y = targetPosition.y - popupYOffset;
                infoWindowContainer.setLayoutParams(overlayLayoutParams);

                lastXPosition = targetPosition.x;
                lastYPosition = targetPosition.y;
            }

            handler.postDelayed(this, INFO_WINDOW_POSITION_REFRESH_INTERVAL);
        }
    }
}