Android - Google Map Api V2 (二)

摘要: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 的動作。