将缩放控件放置在MapView中

我正在尝试让缩放控件显示在mapview ,以下代码几乎可以正常工作,但缩放控件显示在mapview左上角,而不是像我通过setGravity()指定的底部中心。 有人可以告诉我我错过了什么吗?

 zoomView = (LinearLayout) mapView.getZoomControls(); zoomView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT)); zoomView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL); mapView.addView(zoomView); 

这些视图/布局都是以编程方式构建的,没有要调整的布局文件。

  • 如何在Google Map API v2中处理地图的onTouch事件?
  • Keytool别名不存在
  • 禁用在mapview中移动
  • 使用osmdroid自定义信息气泡的重叠项目
  • 平滑在地图视图上设置相机path的animation
  • 如何旋转MapView?
  • ItemizedOverlay.getIndexToDraw中的NullPointerException
  • 使用经度和纬度比较两个位置
  • OnCreate()下行添加到MapView类的OnCreate()方法:

    view.setBuiltInZoomControls(true);

    这里的技巧是将另一个Layout容器放在要放置ZoomControls的位置,然后将ZoomControls插入其中。

    真正的诀窍是使用RelativeLayout而不是LinearLayout来定位元素,如此示例layout.xml所示:

     < ?xml version="1.0" encoding="utf-8"?>     

    layout_zoom LinearLayout元素位于屏幕的底部中心,将其放置在MapView的中间/底部。

    然后在Activity的onCreate ,获取对layout_zoom元素的引用并将ZoomControl插入其中,就像你已经完成的一样:

     LinearLayout zoomLayout =(LinearLayout)findViewById(R.id.layout_zoom); View zoomView = myMapView.getZoomControls(); zoomLayout.addView(zoomView, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); myMapView.displayZoomControls(true); 

    ZoomControls现在应该长按一下,不会窃取地图触摸事件。

    以上对我不起作用,但这样做(将控件放在右下角):

     mapView.setBuiltInZoomControls(true); ZoomButtonsController zbc = mapView.getZoomButtonsController(); ViewGroup container = zbc.getContainer(); for (int i = 0; i < container.getChildCount(); i++) { View child = container.getChildAt(i); if (child instanceof ZoomControls) { FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) child.getLayoutParams(); lp.gravity = Gravity.RIGHT | Gravity.BOTTOM; child.requestLayout(); break; } } 

    Reto:感谢您的回复,但我们的想法是使用XML布局。

    我最终解决了这个问题。 由于MapView是ViewGroup的子类,因此您可以轻松添加子视图(如缩放控件)。 你需要的只是一个MapView.LayoutParams实例,你很高兴。 我做了这样的事情(将缩放控件放在mapview的底部中心)。

      // layout to insert zoomcontrols at the bottom center of a mapview MapView.LayoutParams params = MapView.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, mapViewWidth / 2, mapViewHeight, MapView.LayoutParams.BOTTOM_CENTER); // add zoom controls mapView.addView(mapView.getZoomControls(), params); 

    从谷歌团体线程我发现这个:

    没有XML的ZoomControls:

      public class MyMapActivity extends MapActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); RelativeLayout relativeLayout = new RelativeLayout(this); setContentView(relativeLayout); final MapView mapView = new MapView(this, DEBUG_MAP_API_KEY); RelativeLayout.LayoutParams mapViewLayoutParams = new RelativeLayout.LayoutParams (RelativeLayout.LayoutParams.FILL_PARENT,RelativeLayout.LayoutParams.FILL_PARENT ); relativeLayout.addView(mapView, mapViewLayoutParams); RelativeLayout.LayoutParams zoomControlsLayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT ); zoomControlsLayoutParams.addRule (RelativeLayout.ALIGN_PARENT_BOTTOM); zoomControlsLayoutParams.addRule (RelativeLayout.CENTER_HORIZONTAL); relativeLayout.addView(mapView.getZoomControls(), zoomControlsLayoutParams); mapView.setClickable(true); mapView.setEnabled(true); } 

    SDK1.1是100%为我工作

    不幸的是,我不能在11月28日6:32对Jason Hudgins批准的解决方案添加评论,但我的代码有一个小错误:

    在这一行:

     MapView.LayoutParams params = MapView.LayoutParams( 

    Eclipse给我的错误是

    “对于MapViewtypes,方法LayoutParams(int,int,int,int,int)是未定义的”

    相反,创建一个新的MapView.LayoutParams对象修复它,如下所示:

     MapView.LayoutParams params = **new** MapView.LayoutParams( 

    我花了一些时间才发现,因为我是一个n00b:D

    Reto – 使用FILL_PARENT的问题是缩放控件然后“窃取”所有触摸事件; 这样在缩放控件可见时无法平移地图。 你知道如何防止这种情况吗?