在上一篇博文中介绍了APIKey的获取,有了APIKey就可以使用MapView嵌入Google Map了。下面就开始进入编程的环节。
先看看代码(囿于篇幅,导入的包省略)
public class ShowTrack extends MapActivity {
private static MapView mMapView;
private MapController mc;
protected MyLocationOverlay mOverlayController;
private Button mZin;
private Button mZout;
private Button mPanN;
private Button mPanE;
private Button mPanW;
private Button mPanS;
private Button mGps;
private Button mSat;
private Button mTraffic;
private Button mStreetview;
//activity启动时自动运行
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.show_track);
findViews();
centerOnGPSPosition();
}
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
private void findViews() {
// 获取视图中的组件
mMapView = (MapView) findViewById(R.id.mv);
mc = mMapView.getController();
mc.setZoom(10);
// 设置缩小按钮
mZin = (Button) findViewById(R.id.zin);
mZin.setOnClickListener(new OnClickListener() {
// @Override
public void onClick(View arg0) {
zoomIn();
}
});
// 设置放大按钮
mZout = (Button) findViewById(R.id.zout);
mZout.setOnClickListener(new OnClickListener() {
// @Override
public void onClick(View arg0) {
zoomOut();
}
});
// 设置向北移动按钮
mPanN = (Button) findViewById(R.id.pann);
mPanN.setOnClickListener(new OnClickListener() {
// @Override
public void onClick(View arg0) {
panNorth();
}
});
// 设置向东移动按钮
mPanE = (Button) findViewById(R.id.pane);
mPanE.setOnClickListener(new OnClickListener() {
// @Override
public void onClick(View arg0) {
panEast();
}
});
// 设置向西移动按钮
mPanW = (Button) findViewById(R.id.panw);
mPanW.setOnClickListener(new OnClickListener() {
// @Override
public void onClick(View arg0) {
panWest();
}
});
// 设置向南移动按钮
mPanS = (Button) findViewById(R.id.pans);
mPanS.setOnClickListener(new OnClickListener() {
// @Override
public void onClick(View arg0) {
panSouth();
}
});
// 设置GPS视图按钮
mGps = (Button) findViewById(R.id.gps);
mGps.setOnClickListener(new OnClickListener() {
// @Override
public void onClick(View arg0) {
centerOnGPSPosition();
}
});
// 设置卫星模式视图按钮
mSat = (Button) findViewById(R.id.sat);
mSat.setOnClickListener(new OnClickListener() {
// @Override
public void onClick(View arg0) {
toggleSatellite();
}
});
// 设置交通模式视图按钮
mTraffic = (Button) findViewById(R.id.traffic);
mTraffic.setOnClickListener(new OnClickListener() {
// @Override
public void onClick(View arg0) {
toggleTraffic();
}
});
// 设置街景模式视图按钮
mStreetview = (Button) findViewById(R.id.streetview);
mStreetview.setOnClickListener(new OnClickListener() {
// @Override
public void onClick(View arg0) {
toggleStreetView();
}
});
// 使用位置管理器获取GPS位置变化信息
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationListener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
locationListener);
}
public void panWest() {
GeoPoint pt = new GeoPoint(mMapView.getMapCenter().getLatitudeE6(),
mMapView.getMapCenter().getLongitudeE6()
- mMapView.getLongitudeSpan() / 4);
mc.setCenter(pt);
}
public void panEast() {
GeoPoint pt = new GeoPoint(mMapView.getMapCenter().getLatitudeE6(),
mMapView.getMapCenter().getLongitudeE6()
+ mMapView.getLongitudeSpan() / 4);
mc.setCenter(pt);
}
public void panNorth() {
GeoPoint pt = new GeoPoint(mMapView.getMapCenter().getLatitudeE6()
+ mMapView.getLatitudeSpan() / 4, mMapView.getMapCenter()
.getLongitudeE6());
mc.setCenter(pt);
}
public void panSouth() {
GeoPoint pt = new GeoPoint(mMapView.getMapCenter().getLatitudeE6()
- mMapView.getLatitudeSpan() / 4, mMapView.getMapCenter()
.getLongitudeE6());
mc.setCenter(pt);
}
public void zoomIn() {
mc.zoomIn();
}
public void zoomOut() {
mc.zoomOut();
}
public void toggleSatellite() {
mMapView.setSatellite(true);
mMapView.setStreetView(false);
mMapView.setTraffic(false);
}
public void toggleTraffic() {
mMapView.setTraffic(true);
mMapView.setSatellite(false);
mMapView.setStreetView(false);
}
public void toggleStreetView() {
mMapView.setStreetView(true);
mMapView.setSatellite(false);
mMapView.setTraffic(false);
}
@Override
protected void onStop() {
super.onStop();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
上面的代码实现的功能是显示谷歌地图,并可以切换不同的地图模式,以及对地图进行平移放大缩小等操作。
我们来详细分析一下代码,首先在findViews()中需要注意:
mMapView = (MapView) findViewById(R.id.mv);
mc = mMapView.getController();
这两句代码。第一句是将mMapView这个变量实例化,也就是将地图实例化。关于R.id.mv的内容,我们将在后面看到。再加上第二句便可开始对地图操作了。
紧接着的mc.setZoom(10)是设置了地图的等级。所谓地图等级可以理解成地图的放大倍数,Google map有1到15个等级,等级越大放大倍数越高。这里我们默认放大等级为10。
下面我们来看panWest()这个方法。这个方法是让地图向西平移。在这个方法中定义了一个GeoPoint类型的变量pt,GeoPoint是一组存储经纬度的整数对。它的构造方法中需要传递两个参数,分别是伟度和经度。mMapView.getMapCenter().getLatitudeE6()的意思就是火气地图中心点的纬度。那么这个函数整体的意思就是取地图中心点正西方的一点然后将其设置为地图中心,这样就实现了地图的向西移动。
zoomIn()和zoomOut()就不必我多说了,顾名思义,缩小和放大地图的函数。
而toggleSatellite(), toggleTraffic(),toggleStreetView()则是分别将地图模式显示为卫星模式、交通模式和街景模式。默认的地图显示模式是GPS模式。
下面看看布局文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<view android:id="@+id/mv"
class="com.google.android.maps.MapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:apiKey="0smZchB0ED75mON1sUT1AXI12AKaqRQF-QGVA2Q"
/>
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#550000ff"
android:padding="1px"
>
<Button android:id="@+id/sat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="40px"
android:text="@string/satellite" />
<Button android:id="@+id/traffic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/traffic" />
<Button android:id="@+id/streetview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/street" />
<Button android:id="@+id/gps"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GPS" />
</LinearLayout>
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:background="#550000ff"
android:padding="1px"
>
<Button android:id="@+id/zin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30px"
android:text="+" />
<Button android:id="@+id/zout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="-" />
<Button android:id="@+id/pann"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="N" />
<Button android:id="@+id/pane"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="E" />
<Button android:id="@+id/panw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="W" />
<Button android:id="@+id/pans"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="S" />
</LinearLayout>
</FrameLayout>
布局文件中只需要提一点,就是上面说到的mv,每台机器的APIKey都不同,这点尤其需要注意。否则在模拟器上调试出来的效果就是一些网格。
这次我简要介绍了一下google map的显示问题。在下次博文中我会介绍如何在地图上绘制图形和如何利用GPS定位。欢迎大家多提意见和建议。