上篇把界面畫出來了, 接下來就是顯示里面的功能了,那這篇內容就比較豐富了。
主要有這么幾道菜:
1、在地圖上彈出泡泡顯示信息,并且能相應泡泡的點擊時間
2、自動定位當前位置(也就是我的位置) --添加了 GPS定位和基站定位。
3、獲取經緯度對應的接到地址名稱
那下面就開始代碼把,理論知識能講多少是多少。
一 、 地圖彈出泡泡的制作
1 、overlay_popup.xml 直接把layout放出來
還有泡泡的效果圖 ,很多同學做項目都是時間很緊張的,別人貼出來代碼都覺得不夠直觀,有截圖是王道,
順應大部分懶人的習慣,我編截圖邊發:
看到了吧, 泡泡上有title ,有 desc ,還有一個小icon。我把整個layout 設置成:
android:clickable="true" android:focusable="true"
這樣這個layout就相當余一個button了,可以點擊。
2、那代碼怎么實現呢? FzMapActivity里加入下面代碼
在進入主界面是 初始化一下view。
private View popView;當然這個變量定義也不能少。
3、自定義itemizedOverlay MyItemizedOverlay
好把,先把代碼放出來,光描述怎么寫太費勁了。
主要是繼承 OnFocusChangeListener 監聽地圖層的變化, 為了方便監聽button事件也繼承了OnClickListener。
下面這方法監聽這個層改變的時間,把泡泡彈出來。
public void onFocusChanged(ItemizedOverlay overlay, OverlayItem newFocus) {
Log.d(TAG , "item focus changed!");
if (null != newFocus) {
Log.d(TAG , "centerY : " + itemDrawable.getBounds().centerY() + "; centerX :" + itemDrawable.getBounds().centerX());
Log.d(TAG , " height : " + itemDrawable.getBounds().height());
MapView.LayoutParams params = (MapView.LayoutParams) mPopView.getLayoutParams();
params.x = this.layout_x;//Y軸偏移
params.y = this.layout_y;//Y軸偏移
point = newFocus.getPoint();
params.point = point;
mMapCtrl.animateTo(point);
TextView title_TextView = (TextView) mPopView.findViewById(R.id.map_bubbleTitle);
title_TextView.setText(newFocus.getTitle());
TextView desc_TextView = (TextView) mPopView.findViewById(R.id.map_bubbleText);
if(null == newFocus.getSnippet() || "".equals(newFocus.getSnippet())){
desc_TextView.setVisibility(View.GONE);
}else{
desc = newFocus.getSnippet();
desc_TextView.setText(desc);
desc_TextView.setVisibility(View.VISIBLE);
}
RelativeLayout button = (RelativeLayout) mPopView.findViewById(R.id.map_bubblebtn);
button.setOnClickListener(this);
mMapView.updateViewLayout(mPopView, params);
mPopView.setVisibility(View.VISIBLE);
selectItem = newFocus;
}
}
二、長按地圖獲取地圖位置并彈出泡泡顯示信息
它的繼承關系 LongPressOverlay extends Overlay implements OnDoubleTapListener
LongPressOverlay這個層主要是用來接收長按事件 和雙擊地圖界面的
@Override
public void onLongPress(MotionEvent e) {
mContext.locPoint = mMapView.getProjection().fromPixels((int) e.getX(),
(int) e.getY());
mHandler.sendEmptyMessage(mContext.MSG_VIEW_LONGPRESS);
}接收到長按事件后給主界面發消息,由主界面處理。
三、FzLocationManager 這個類用來做gps,基站定位
public interface LocationCallBack{
/**
* 當前位置
* @param location
*/
void onCurrentLocation(Location location);
}
定義一個接口 ,當監聽到位置變化時,回調主界面
//locationListener注冊監聽器到位置服務管理里
networkLocationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, MINTIME, MININSTANCE,
locationListener);
//位置信息變化回調
private void updateLocation(Location location) {
lastLocation = location;
mCallback.onCurrentLocation(location);
}
四、主界面邏輯
主界面有
部分注釋寫在代碼里了
最后再上一張截圖,在室內通過基站定位到我的位置:
五、通過經緯度獲取地址
這個單獨拷貝出來讓大家看看。這個方法獲取地址有時候獲取不到的,google好像對這個接口有限制。說白了就這這個接口不靠譜。
大家可以嘗試用別的方法或手段獲取地址
我的代碼里加了個死循環去獲取位置,這樣的方案是不可取的,不過暫時用一下看看效果也好。
/**
*通過經緯度獲取地址
* @param point
* @return
*/
private String getLocationAddress(GeoPoint point){
String add = "";
Geocoder geoCoder = new Geocoder(getBaseContext(),
Locale.getDefault());
try {
List<Address> addresses = geoCoder.getFromLocation(
point.getLatitudeE6() / 1E6, point.getLongitudeE6() / 1E6, 1);
Address address = addresses.get(0);
int maxLine = address.getMaxAddressLineIndex();
if(maxLine >= 2){
add = address.getAddressLine(1) + address.getAddressLine(2);
}else {
add = address.getAddressLine(1);
}
} catch (IOException e) {
add = "";
e.printStackTrace();
}
return add;
}
好了,以上是所有代碼, AndroidManifest.xml 在 (一)里有。
最后小結
用google的api獲取到的位置放到他的地圖上是有偏差的,而且偏差還比不小,大家可以觀察一下,這個問題沒有很好的免費解決方案。
如果有哪位有什么好建議可以發出來,謝謝。
用基站和gps定位是,也沒有處理那個是更好的定位的問題。
歡迎大家提建議
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
