使用MapView创建地图浏览程序【转】

本文使用Spinner和MapView创建一个地图浏览程序。你可以从这里下载代码,此代码是与M5 SDK兼容的。TourGuide的运行结果如下所示:

  TourGuide的主类扩展了MapActivity,因为只有MapActivity才可以创建并使用MapView。由于某些原因我们不能在xml文件中使用MapView标签,而必须使用View,然后指定class属性为com.google.android.maps.MapView。至少在M5 SDK上还是如此的。main.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"> 
 
    <view class="com.google.android.maps.MapView"
        android:id="@+id/map" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"/> 
        
    <Spinner android:id="@+id/spinner1"
        android:layout_alignParentTop="true"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:drawSelectorOnTop="true" 
        android:paddingTop="10dip"
        android:paddingBottom="10dip" />
 
</RelativeLayout>

  我们使用RelativeLayout来布局,MapView铺满整个屏幕,然后让Spinner漂浮在MapView之上。接下来我们创建TourGudie类。如下所示;
public class TourGuide extends MapActivity {
 
    private String[][] locations = { { "Area 51", "-115.800155,37.248040" },
            { "Bill Gates' house", "-122.242135,47.627787" },
            { "Shepshed Dynamo Football Grounds", "-1.286913,52.774472" },
            { "Michael Jackson's Neverland Ranch", "-120.088012,34.745527" },
            { "Leaning Tower of Pisa", "10.396473,43.723002" },
            { "Airplane Graveyard", "-110.834026,32.150899" },
            { "Grand Canyon", "-112.298641,36.142788" },
            { "Lake Kariba", "27.990417,-17.235252" },
            { "White House", "-77.036519,38.897605" },
            { "World Trade Center site", "-74.012253,40.711641" },
            { "Las Vegas Strip", "-115.162296,36.133347" } };
 
    private Spinner spinner;
    private MapView map;
    private MapController mc;
 
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
 
        spinner = (Spinner) this.findViewById(R.id.spinner1);
        map = (MapView) findViewById(R.id.map);
        mc = map.getController();
 
        ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(
                this, android.R.layout.simple_spinner_dropdown_item);
 
        for (int i = 0; i < locations.length; i++)
            adapter.addObject(locations[i][0]);
 
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(selectListener);
        gotoSelected();
    }
 
    private OnItemSelectedListener selectListener = new OnItemSelectedListener() {
        public void onItemSelected(AdapterView parent, View v, int position, long id) {
            gotoSelected();
        }
        public void onNothingSelected(AdapterView arg0) {}
    };

  在onCreate()方法中,创建了MapView和Spinner组件,并且用前面创建的locations数组来填充ArrayAdapter,最后把它和Spinner绑定到一起,以达到下拉菜单的效果。我们还需要实现一个OnItemSelectedListener监听器,并且注册给spinner,当条目被选中的时候,gotoSelected()方法将被调用。
public void gotoSelected() {
    int pos = spinner.getSelectedItemPosition();
 
    String[] loc = locations[pos][1].split(",");
    double lat = Double.parseDouble(loc[1]);
    double lon = Double.parseDouble(loc[0]);
 
    Point p = new Point((int) (lat * 1E6), (int) (lon * 1E6));
    mc.animateTo(p);
    mc.zoomTo(18);
 
    if (!map.isSatellite())
        map.toggleSatellite();
 
    map.invalidate();
}

  MapController是另外一个很重要的类,它提供了简单的API来控制和现实MapView中的数据,包括缩放等。读者可以去参考Android的API Doc。
  这里我们还实现了放大和缩小的功能,通过实现onKeyDown()方法来控制放大和缩小,当用户按下I则放大,按下O则缩小。onKeyDown()的方法如下所示:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
    case KeyEvent.KEYCODE_I:
        mc.zoomTo(map.getZoomLevel() + 1);
        break;
    case KeyEvent.KEYCODE_O:
        mc.zoomTo(map.getZoomLevel() - 1);
        break;
    }
    return super.onKeyDown(keyCode, event);
}

posted on 2013-04-17 13:41  liyingming  阅读(220)  评论(0编辑  收藏  举报

导航