本文使用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);
}