摘要:Android - Google Map Api V2 (二)
上一篇文章,只介紹申請Google Map Api key 及 呈現一個最簡單的Google Map
但實務上,可沒這麼簡單,在將第一版改成第二版的過程,花了不少時間(非常長的時間,花了一個禮拜,可能我真的是Android菜鳥的關係~這東西要花我一個禮拜到處找資源、問人,還不見得真的解決完)
這次來介紹Google Map Api V2 ,在實務上,我這次協助改版,需要用到哪些東西,
需要加地標,
需要更動視圖到指定位置,
需要當使用者移動時,要非同步再去背景撈資料,
需要按了地標後,呈現自訂的內容畫面
需要按了自訂內容畫面,移到另一個指定的內頁
不介紹太詳細的內容,大概點出幾個關鍵字給初學者參考一下(可能還會誤導初學者~~本人也是初學者)
先取得最基本的單位,GoogleMap
GoogleMap googleMap;
看使用的是什麼方法,一個是MapFragment如下
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment" />
取法是
MapFragment fm = (MapFragment)getFragmentManager().findFragmentById(R.id.map);
mMap = fm.getMap();
另一種是
<com.google.android.gms.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"/>
mMap = ((MapView) findViewById(R.id.map)).getMap();
mMapView = (MapView) findViewById(R.id.map);
使用這種方法,還需覆寫四個方法
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mMapView.onLowMemory();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMapView.onSaveInstanceState(outState);
}
使用mMap移動視點,調整Zoom
void refreshCenter(double lat,double lon){
CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(lat,lon)));
CameraUpdate zoom = CameraUpdateFactory.zoomTo(18);
mMap.moveCamera(center);
mMap.animateCamera(zoom);
}
設置地標,因為之後要找是哪個Makers被點選,我們會將產生出來的Marker 加入全域變數的HashMap裡 markerMap List<Marker,TestData>
public void addPinMakers(TestData data){
MarkerOptions maker = new MarkerOptions();
LatLng point = new LatLng(data.latitude,data.longitude);
maker.position(point);
maker.icon(BitmapDescriptorFactory.fromResource(R.drawable.pin));
maker.title(data.title);
maker.snippet(data.snippet);
Marker pinMarker = mMap.addMarker(maker);
markerMap.put(pinMarker, data);
}
按了地標,要顯視自訂的InfoWindow 則製作OnInfoWindowClickListener、InfoWindow的View、
實作OnInfoWindowClickListener 的 OnInfowWindowClick方法
@Override
public void onInfoWindowClick(Marker arg0) {
TestData data = markerMap.get(arg0);
//DO Some Thing You Want
}
將CallBack Function 設定到GoogleMap 物件
mMap.setOnInfoWindowClickListener(this);
置作InfoWindow 需設定全域的 View infoWindow變數
infoWindow = getLayoutInflater().inflate(R.layout., null);
將View設定到GoogleMap
mMap.setInfoWindowAdapter(new CustomInfoAdapter(this,infoWindow));
因要個被按到的Marker,呼叫後,會顯現自訂的InfowWindow,顯示時如何撈取資料則要另要再寫CustomInfoAdapter
寫個類別CustomInfowAdapter處理顯示的程式
public class CustomInfoAdapter implements InfoWindowAdapter {
private View mInfoWindow;
private Context mContext;
public CustomInfoAdapter(Context context,View infoView) {
mInfoWindow = infoView;
mContext = context;
}
@Override
public View getInfoContents(Marker arg0) {
displayView(arg0);
return mInfoWindow;
}
@Override
public View getInfoWindow(Marker arg0) {
return null;
}
public void displayView(Marker arg0) {
TextView tvTitle = (TextView)mInfoWindow.findViewById(R.id.info_tv_title);
tvTitle.setText(arg0.getTitle());
TextView tvContent = (TextView)mInfoWindow.findViewById(R.id.info_tv_content);
tvContent.setText(arg0.getSnippet());
}
}
移動視點時,要做背景處理
移動視點後,需處理 OnCameraChangeListener
需實作 implements OnCameraChangeListener ,及覆寫方法
@Override
public void onCameraChange(CameraPosition arg0) {
if(mMap!=null && mMapView != null)
{
int mLonE6 = (int)(mMap.getCameraPosition().target.longitude*1E6);
int mLatE6 = (int)(mMap.getCameraPosition().target.latitude*1E6);
//背景處理,SomeThing
}
}
因視點是有幾個會影響的因素,
一是Touch,從第一點,移到另一點後手指起來後,則會觸發事件,
第二個是,當點選了其他的地標時,也會觸發事件,
但如果一直觸發事件,則會影響Web Site的負擔,
所以需做一些移動多少距離的判斷條件,再做回Call 的動作。