将缩放控件放置在MapView中

最后发布: 2008-11-04 21:30:22


问题

我正在尝试让缩放控件显示在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);

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

android android-mapview
回答

OnCreate()下行添加到MapView类的OnCreate()方法:

view.setBuiltInZoomControls(true);


回答

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

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
  <com.google.android.maps.MapView
    android:id="@+id/myMapView"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:enabled="true"
    android:clickable="true"
    android:apiKey="MY_MAP_API_KEY"
  />
  <LinearLayout android:id="@+id/layout_zoom" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
  /> 
</RelativeLayout> 

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);


回答

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

在这一行:

MapView.LayoutParams params = MapView.LayoutParams(

Eclipse给我的错误是

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

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

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

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


回答

你可以试试这个:

MapView map = (MapView)findViewById(R.id.mapview);
map.setBuiltInZoomControls(true);


回答

谷歌组线程我发现这个:

没有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%为我工作


回答

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