当前位置: 首页 > 知识库问答 >
问题:

如何将相机居中以使标记位于屏幕底部?(Google map api V2 Android)

满博
2023-03-14

当单击标记时,相机的默认行为是将其居中在屏幕上,但因为我通常在信息窗口中有很长的文本描述,所以实际更改相机位置以使标记位于屏幕底部更方便(使信息窗口位于屏幕中心)。我想我应该可以通过像下面这样覆盖onMarkerClick函数来做到这一点(当此函数返回true时,默认行为被取消)

@Override

public boolean onMarkerClick(final Marker marker) {


    // Google sample code comment : We return false to indicate that we have not

    // consumed the event and that we wish
    // for the default behavior to occur (which is for the camera to move
    // such that the
    // marker is centered and for the marker's info window to open, if it
    // has one).

    marker.showInfoWindow();

            CameraUpdate center=
                CameraUpdateFactory.newLatLng(new LatLng(XXXX,
                                                         XXXX));
            mMap.moveCamera(center);//my question is how to get this center

            // return false;
    return true;
}

编辑:

使用接受答案的步骤解决问题,代码如下:

@Override

    public boolean onMarkerClick(final Marker marker) {

                //get the map container height
        LinearLayout mapContainer = (LinearLayout) findViewById(R.id.map_container);
        container_height = mapContainer.getHeight();

        Projection projection = mMap.getProjection();

        LatLng markerLatLng = new LatLng(marker.getPosition().latitude,
                marker.getPosition().longitude);
        Point markerScreenPosition = projection.toScreenLocation(markerLatLng);
        Point pointHalfScreenAbove = new Point(markerScreenPosition.x,
                markerScreenPosition.y - (container_height / 2));

        LatLng aboveMarkerLatLng = projection
                .fromScreenLocation(pointHalfScreenAbove);

        marker.showInfoWindow();
        CameraUpdate center = CameraUpdateFactory.newLatLng(aboveMarkerLatLng);
        mMap.moveCamera(center);
        return true;



    }

谢谢帮忙^^

共有3个答案

桂梓
2023-03-14

如果你不关心地图的放大,只想把标记放在下面,我认为这是一个更简单的解决方案

double center = mMap.getCameraPosition().target.latitude;
double southMap = mMap.getProjection().getVisibleRegion().latLngBounds.southwest.latitude;

double diff = (center - southMap);

double newLat = marker.getPosition().latitude + diff;

CameraUpdate centerCam = CameraUpdateFactory.newLatLng(new LatLng(newLat, marker.getPosition().longitude));

mMap.animateCamera(centerCam);
闻人飞白
2023-03-14

我更喜欢拉里·麦肯齐(Larry McKenzie)的答案,它不依赖于屏幕投影(即mProjection.toScreenLocation()),我猜当地图缩放级别较低时,投影分辨率会变差,这让我有时无法获得准确的位置。因此,基于谷歌地图规范的计算肯定会解决这个问题。

下面是将标记从底部移动到屏幕大小的30%的示例代码。

zoom_lvl = mMap.getCameraPosition().zoom;
double dpPerdegree = 256.0*Math.pow(2, zoom_lvl)/170.0;
double screen_height = (double) mapContainer.getHeight();
double screen_height_30p = 30.0*screen_height/100.0;
double degree_30p = screen_height_30p/dpPerdegree;      
LatLng centerlatlng = new LatLng( latlng.latitude + degree_30p, latlng.longitude );         
mMap.animateCamera( CameraUpdateFactory.newLatLngZoom( centerlatlng, 15 ), 1000, null);
黎奇思
2023-03-14

我可能会稍后编辑这个答案以提供一些代码,但我认为可以工作的是:

  1. 获取所单击标记的LatLng(LatLng M)

请看这里我关于如何获得地图高度的答案。

    // googleMap is a GoogleMap object
    // view is a View object containing the inflated map
    // marker is a Marker object
    Projection projection = googleMap.getProjection();
    LatLng markerPosition = marker.getPosition();
    Point markerPoint = projection.toScreenLocation(markerPosition);
    Point targetPoint = new Point(markerPoint.x, markerPoint.y - view.getHeight() / 2);
    LatLng targetPosition = projection.fromScreenLocation(targetPoint);
    googleMap.animateCamera(CameraUpdateFactory.newLatLng(targetPosition), 1000, null);
 类似资料:
  • 我正在努力想明白为什么我不能把按钮相对于它的图像定位,而是放在屏幕的底部。我试着阅读了其他的问题,但是从前面的回答中想不出一个解决方案。也许我的情况不一样? 本质上,我试图将按钮定位在图像下方,同时保持它(按钮)居中,并保持它的响应性。我是一个长期的读者第一次问问题。如能提供任何有助于解决问题的投入,将不胜感激。 也许我的divs不在了? null null

  • 问题内容: 设置网页的最佳做法是什么,以便在该网页上显示的内容/文本很少的情况下,页脚显示在浏览器窗口的底部,而不是显示在网页的中途? 问题答案: 您正在寻找的是 CSS Sticky Footer 。

  • 在 一到三个 。有没有办法在后始终将单元格放置在屏幕底部?

  • 在我的应用程序,我有品牌页脚在所有屏幕滚动结束(屏幕有滚动)和静态在屏幕底部时(没有滚动)。 但我面临的问题,以实现这与屏幕,其中有列表。我正在使用RecycerView显示列表。我想在RecycerView的结尾显示品牌页脚,当它有滚动时,它将在底部滚动时可见。这是可以用带有页脚的RecycerView实现的。 但是当RecycerView没有滚动(当列表中的项目很少时),我希望页脚固定在屏幕底

  • 问题内容: 我有此功能可将对象居中放在屏幕中间。 我想居中QMainWindow,QInputDialog和QMessageBox。 这是我的MessageBox: 这是我的QInputDialog: 这是我的中心功能: 我只能居中QMainWindow。 逻辑是将对象移动到topLeft点(screenWidth / 2-objectWidth / 2,screenHeight / 2-obje