編輯:關於Android編程
要求點擊一個地址,直接調用百度地圖,將地址顯示到百度地圖上,參數只有一個地址,沒有對應的坐標,這就想到了以前做的地圖是傳送一個坐標,將該地址顯示到地圖上,就有了這樣的思路:怎麼將一個詳細地址轉換成坐標,然後再傳送給百度地圖,但是這樣做好像是雖然能把詳細地址轉換成坐標,但是這個是在顯示地址之後轉換的所以就出現了空指針,具體就沒再研究,覺得再換一種思路,就在網上看到了百度地圖的api上面有一個輸入地址點擊搜索就會在將該地址顯示到了地圖上,覺得這個應該就可以,於是好好看了一下百度demo中的GeoCoder這個java文件,這個就是輸入一個地址,點擊搜索按鈕直接顯示將地址顯示在地圖上的,點擊搜索是調用的MKSearch的geocode("詳細地址","具體城市"),然後我就在我的調用地圖的那個界面 初始化地圖之後就調用了這個方法,點擊進入之後,就一直在加載,顯示不出來位置,我這裡跟他的唯一區別就是百度地圖demo是點擊觸發這個事件,而我是初始化地圖後就調用該方法。但是這是為什麼呢,我的為什麼一直就加載中,但是不顯示呢。
一下代碼是百度地圖demo的代碼
// 初始化搜索模塊,注冊事件監聽 mSearch = new MKSearch(); mSearch.init(app.mBMapMan, new MKSearchListener() { @Override public void onGetPoiDetailSearchResult(int type, int error) { } public void onGetAddrResult(MKAddrInfo res, int error) { if (error != 0) { String str = String.format("錯誤號:%d", error); Toast.makeText(GeoCoder.this, str, Toast.LENGTH_LONG).show(); return; } mMapView.getController().animateTo(res.geoPt); String strInfo = String.format("緯度:%f 經度:%f\r\n", res.geoPt.getLatitudeE6()/1e6, res.geoPt.getLongitudeE6()/1e6); Toast.makeText(GeoCoder.this, strInfo, Toast.LENGTH_LONG).show(); Drawable marker = getResources().getDrawable(R.drawable.iconmarka); //得到需要標在地圖上的資源 marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker .getIntrinsicHeight()); //為maker定義位置和邊界 mMapView.getOverlays().clear(); mMapView.getOverlays().add(new OverItemT(marker, GeoCoder.this, res.geoPt, res.strAddr)); } public void onGetPoiResult(MKPoiResult res, int type, int error) { if (error != 0 || res == null) { Toast.makeText(GeoCoder.this, "解析失敗", Toast.LENGTH_LONG).show(); return; } if (res != null && res.getCurrentNumPois() > 0) { GeoPoint ptGeo = res.getAllPoi().get(0).pt; // 移動地圖到該點: mMapView.getController().animateTo(ptGeo); String strInfo = String.format("緯度:%f 經度:%f\r\n", ptGeo.getLatitudeE6()/1e6, ptGeo.getLongitudeE6()/1e6); strInfo += "\r\n附近有:"; for (int i = 0; i < res.getAllPoi().size(); i++) { strInfo += (res.getAllPoi().get(i).name + ";"); } Toast.makeText(GeoCoder.this, strInfo, Toast.LENGTH_LONG).show(); } } public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { } public void onGetTransitRouteResult(MKTransitRouteResult res, int error) { } public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { } public void onGetBusDetailResult(MKBusLineResult result, int iError) { } @Override public void onGetSuggestionResult(MKSuggestionResult res, int arg1) { // TODO Auto-generated method stub } @Override public void onGetRGCShareUrlResult(String arg0, int arg1) { // TODO Auto-generated method stub } });
EditText editCity = (EditText)findViewById(R.id.city); EditText editGeoCodeKey = (EditText)findViewById(R.id.geocodekey); mSearch.geocode(editGeoCodeKey.getText().toString(), editCity.getText().toString());
後來網友就說該方法是被動的方法,要主動調用,建議用一個線程去調用,我就在初始化地圖之後,寫了一個線程,在線程裡調用MKSearch的geocode("詳細地址","具體城市")方法,果然加載成功了。但是有一個問題是,我必須的點擊一下屏幕,地圖才刷新,有開始在網上搜,說是把AndroidMainfest.xml文件中的androidmanifest
在說一下,這個是成功了,但是還有一個問題,讓地址顯示到地圖上之後,還想彈出一個詳細地址,一直放到地圖上,現在是可以將地標放到地圖上,如下代碼,該代碼寫到監聽事件中MKSearchListener()
Drawable marker = getResources().getDrawable(R.drawable.point_start); //得到需要標在地圖上的資源 marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker .getIntrinsicHeight()); //為maker定義位置和邊界 View mPopView = getLayoutInflater().inflate(R.layout.popview2, null); OverItemT overItemT = new OverItemT(marker, LocationActivity.this, res.geoPt, res.strAddr);
但是我想彈出個詳細地址的泡泡,這該怎麼做呢,百度地圖demo中還有一個ItemizedOverlayDemo這個Java類是可以顯示泡泡的,但是這個是點擊地標之後會彈出泡泡,如下代碼如下
// 處理當點擊事件 protected boolean onTap(int i) { setFocus(mGeoList.get(i)); // 更新氣泡位置,並使之顯示 GeoPoint pt = mGeoList.get(i).getPoint(); ItemizedOverlayDemo.mMapView.updateViewLayout( ItemizedOverlayDemo.mPopView, new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, pt, MapView.LayoutParams.BOTTOM_CENTER)); ItemizedOverlayDemo.mPopView.setVisibility(View.VISIBLE); Toast.makeText(this.mContext, mGeoList.get(i).getSnippet(), Toast.LENGTH_SHORT).show(); return true; }
哈哈,我把改代碼寫到了
我把以上代碼寫到了MKSearchListener()這個監聽事件裡,但是這時會報錯,原來是因為我沒有將彈出氣泡添加到地圖裡就update了,應該在MKSearchListener()這個監聽事件加上如下代碼
// 創建點擊mark時的彈出泡泡 mPopView=super.getLayoutInflater().inflate(R.layout.popview, null); mMapView.addView( mPopView, new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, null, MapView.LayoutParams.TOP_LEFT)); mPopView.setVisibility(View.GONE);
加上代碼之後就可以在地標的圖片位置有彈出的詳細地址泡泡了,但是這時候就是彈出的泡泡跟地標圖片重疊了,剛開始我想在update處改一下泡泡的位置,但是這個不是簡單的
point,所以後來我想到了修改泡泡的layout文件,哈哈,最後就成功了。
代碼下載地址如下:http://download.csdn.net/detail/ladyweiwei1234/7129687
參考百度地圖demo下載地址如下(1.3.5版本):http://download.csdn.net/detail/ladyweiwei1234/7129701
前面關於tween動畫寫了2篇博客,如果那2篇博客都看懂了,估計Tween動畫理解使用起來問題就不大,之前也說了Tween動畫的缺點就是在交互上有bug,今天就講下屬性動
這個CardStackViewpager的靈感來自Github上面的 FlippableStackView開源項目,而我想實現的效果方向上恰好與FlippableStac
關鍵部分代碼如下 1、Spinnner 在布局文件中: 定義對象: private
MSM8909+Android5.1.1SPI驅動開發(PSAM部分) 1. PSAM部分的硬件設計 圖1CS 片選信號SCK 時鐘信號MISO 主設