高德地圖定位

来源:https://www.cnblogs.com/wangfengdange/archive/2018/01/15/8288508.html
-Advertisement-
Play Games

對高德地圖的定位進行封裝,方便調用 如下是高德官網的指導:http://lbs.amap.com/api/android-sdk/guide/create-map/mylocation 如下是主要的代碼 定位使用的是(5.0.0版本後的),主要記錄下封裝的思路 這樣在UI界面就可以更簡便的調用了 ...


對高德地圖的定位進行封裝,方便調用

如下是高德官網的指導:http://lbs.amap.com/api/android-sdk/guide/create-map/mylocation

如下是主要的代碼  定位使用的是(5.0.0版本後的),主要記錄下封裝的思路

  1 public class MapLbsLayerImpl implements ILbsLayer {
  2 
  3     private Context mContext;
  4     private MapView mapView; // 地圖視圖對象
  5     private AMap aMap; // 地圖管理對象
  6     private AMapLocationClient mLocationClient; // 申明對象
  7     private AMapLocationClientOption mLocationOption = null; // 聲明LocationOption對象
  8     private LocationSource.OnLocationChangedListener mListener;
  9     private CommonLocationChangeListener mLocationChangeListener;
 10 
 11     public MapLbsLayerImpl(Context context) {
 12         this.mContext = context;
 13         mapView = new MapView(mContext);
 14         if (aMap == null) aMap = mapView.getMap();
 15         // 隱藏高德地圖右下角縮放的按鈕
 16         aMap.getUiSettings().setZoomControlsEnabled(false);
 17         aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
 18             @Override
 19             public boolean onMarkerClick(Marker marker) {
 20                 return true;
 21             }
 22         });
 23 
 24     }
 25 
 26     /**
 27      * 地圖控制項
 28      *
 29      * @return View
 30      */
 31     @Override
 32     public View getMapView() {
 33         return mapView;
 34     }
 35 
 36     /**
 37      * 開始定位
 38      */
 39     @Override
 40     public void getStartLocationMap() {
 41         // 設置定位監聽
 42         aMap.setLocationSource(new LocationSource() {
 43             /**
 44              * 激活定位
 45              * @param onLocationChangedListener OnLocationChangedListener
 46              */
 47             @Override
 48             public void activate(OnLocationChangedListener onLocationChangedListener) {
 49                 mListener = onLocationChangedListener;
 50                 if (mLocationClient == null) {
 51                     // 初始化定位
 52                     mLocationClient = new AMapLocationClient(mContext);
 53                     // 初始化定位參數
 54                     mLocationOption = new AMapLocationClientOption();
 55                     // 設置定位回調監聽
 56                     mLocationClient.setLocationListener(locationListener);
 57                     // 設置定位模式
 58                     if (ToastUtils.isOpGPS()) {
 59                         // 設置為高精度定位模式
 60                         mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
 61                     } else {
 62                         // 設置為低精度定位模式
 63                         mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
 64                     }
 65                     mLocationOption.setInterval(6000); // 設置多久定位一次
 66                     // mLocationOption.setOnceLocation(true);
 67                     // 設置定位參數
 68                     mLocationClient.setLocationOption(mLocationOption);
 69                     mLocationClient.startLocation(); // 啟動定位
 70                 }
 71             }
 72 
 73             /**
 74              * 停止定位
 75              */
 76             @Override
 77             public void deactivate() {
 78                 mListener = null;
 79                 if (mLocationClient != null) {
 80                     mLocationClient.stopLocation();
 81                     mLocationClient.onDestroy();
 82                 }
 83                 mLocationClient = null;
 84             }
 85         });
 86         // 設置為true表示顯示定位層並可觸發定位,false表示隱藏定位層並不可觸發定位,預設是false
 87         aMap.setMyLocationEnabled(true);
 88     }
 89 
 90     /**
 91      * 定位的監聽
 92      */
 93     private boolean isFirst = true;
 94     private AMapLocationListener locationListener = new AMapLocationListener() {
 95         @Override
 96         public void onLocationChanged(AMapLocation aMapLocation) {
 97             if (mListener != null && aMapLocation != null) {
 98                 if (aMapLocation.getErrorCode() == 0) {
 99                     Log.d("jiejie", "---------定位成功-------");
100                     LocationInfo info = new LocationInfo(aMapLocation.getLatitude(),
101                             aMapLocation.getLongitude());
102                     info.setKey("0000");
103                     if (isFirst) {
104                         isFirst = false;
105                         moveCameraToPoint(info, 15);
106                         if (mLocationChangeListener != null) {
107                             mLocationChangeListener.onLocation(info);
108                         }
109                     }
110                     if (mLocationChangeListener != null) {
111                         mLocationChangeListener.onLocationChanged(info);
112                     }
113                 } else {
114                     Log.d("jiejie", "定位失敗" + aMapLocation.getErrorCode() + " " + aMapLocation.getErrorInfo());
115                 }
116             }
117         }
118     };
119     private Map<String, Marker> markerMap = new HashMap<>(); // 管理地圖標記的集合
120 
121     /**
122      * 添加Marker
123      *
124      * @param locationInfo 位置信息
125      * @param bitmap       圖片
126      * @param isLoad       是否展示動畫
127      */
128     @Override
129     public void addOnUpdateMarker(LocationInfo locationInfo, Bitmap bitmap, boolean isLoad) {
130         Marker storeMarker = markerMap.get(locationInfo.getKey());
131         LatLng latLng = new LatLng(locationInfo.getLatitude(), locationInfo.getLongitude());
132         if (storeMarker != null) {
133             // 如果已經存在則更新
134             storeMarker.setPosition(latLng);
135         } else {
136             // 如果沒有則創建
137             MarkerOptions options = new MarkerOptions();
138             BitmapDescriptor des = BitmapDescriptorFactory.fromBitmap(bitmap);
139             options.icon(des);
140             options.anchor(0.5f, 0.5f);
141             options.position(latLng);
142             Marker marker = aMap.addMarker(options);
143             if (isLoad) startGrowAnimation(marker);
144             markerMap.put(locationInfo.getKey(), marker);
145         }
146     }
147 
148     /**
149      * 地上生長得Marker
150      *
151      * @param marker Marker
152      */
153     private void startGrowAnimation(Marker marker) {
154         if (marker != null) {
155             Animation animation = new ScaleAnimation(0, 1, 0, 1);
156             animation.setInterpolator(new LinearInterpolator());
157             // 整個移動所需要的時間
158             animation.setDuration(600);
159             // 設置動畫
160             marker.setAnimation(animation);
161             // 開始動畫
162             marker.startAnimation();
163         }
164     }
165 
166     /**
167      * 位置改變
168      *
169      * @param changeListener Change
170      */
171     @Override
172     public void setLocationChangeListener(CommonLocationChangeListener changeListener) {
173         this.mLocationChangeListener = changeListener;
174     }
175 
176     /**
177      * 移動地圖中心到某個點
178      *
179      * @param locationInfo 地址
180      * @param scale        縮放繫數
181      */
182     @Override
183     public void moveCameraToPoint(LocationInfo locationInfo, int scale) {
184         LatLng latLng = new LatLng(locationInfo.getLatitude(), locationInfo.getLongitude());
185         CameraUpdate update = CameraUpdateFactory.newCameraPosition(
186                 new CameraPosition(latLng, scale, 0, 0)
187         );
188         aMap.moveCamera(update);
189     }
190 
191 
192     @Override
193     public void onCreate(Bundle bundle) {
194         mapView.onCreate(bundle);
195     }
196 
197     @Override
198     public void onResume() {
199         mapView.onResume();
200     }
201 
202     @Override
203     public void onPause() {
204         mapView.onPause();
205     }
206 
207     @Override
208     public void onDestroy() {
209         mapView.onDestroy();
210         if (null != mLocationClient) {
211             mLocationClient.onDestroy();
212             mLocationClient = null;
213         }
214     }

這樣在UI界面就可以更簡便的調用了

    private void initView() {
        // 開始定位
        mLbsLayer.getStartLocationMap();
        // 定位返回的監聽
        mLbsLayer.setLocationChangeListener(new ILbsLayer.CommonLocationChangeListener() {
            @Override
            public void onLocationChanged(LocationInfo locationInfo) { // 位置改變
                Log.d("jiejie","--main---------");
            }

            @Override
            public void onLocation(LocationInfo locationInfo) { // 第一次定位
                if (mLocationBit == null || mLocationBit.isRecycled()) {
                    mLocationBit = BitmapFactory.decodeResource(getResources(), R.drawable.navi_map_gps_locked);
                }
                mLbsLayer.addOnUpdateMarker(locationInfo, mLocationBit, false); // 第一次定位添加Marker,該Marker不設置生長動畫
            }
        });
    }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 進程體繫結構 -用戶進程:連接到Oracle DB的應用程式或工具 -資料庫進程 -伺服器進程:連接到Oracle實例,在用戶建立會話時啟動 -後臺進程:在啟動Oracle實例時啟動 -守護程式/應用程式進程 -網路監聽程式 -Grid infrastructe守護程式 專用伺服器,對於每個會話,運 ...
  • 本人在網上看了很多的博客資料,感覺大家都是在相互抄襲,我就自己根據自己的理解和經驗來總結一下吧; 首先觸發器的創建: 有使用Navicat的朋友可以在上面創建一個觸發器: (本人就是簡單的複製上面的sql ) CREATE TRIGGER `c_time` BEFORE INSERT ON `stu ...
  • Explain簡介 本文主要講述如何通過 explain 命令獲取 select 語句的執行計劃,通過 explain 我們可以知道以下信息:表的讀取順序,數據讀取操作的類型,哪些索引可以使用,哪些索引實際使用了,表之間的引用,每張表有多少行被優化器查詢等信息。 下麵是使用 explain 的例子: ...
  • 學習目標 -Oracle資料庫主要結構部件 -解析記憶體結構 -描述資料庫後臺進程 -邏輯存儲和物理存儲結構之間的關聯 -描述ASM存儲部件 Oracle 資料庫 -是作為一個單元處理的一組數據。 -資料庫的目的是存儲和檢索相關信息。 -Oracle關係資料庫管理系統(RDBMS)可靠地管理多用戶環境 ...
  • SQL提供的聚合函數有求和,最大值,最小值,平均值,計數函數等。 聚合函數及其功能: 學習本節所需要的兩張表: CREATE TABLE TEACHER ( ID INT IDENTITY (1,1) PRIMARY KEY , --主鍵,自增長 TNO INT NOT NULL, --教工號 TN ...
  • 本文是對SQL Server事務日誌的總結,文章有一些內容和知識來源於官方文檔或一些技術博客,本文對引用部分的出處都有標註。 事務日誌介紹 在SQL Server中,事務日誌是資料庫的重要組件,如果系統出現故障,則可能需要使用事務日誌將資料庫恢復到一致狀態。每個SQL Server資料庫都擁有自己的... ...
  • 本項目只是單純的一個大作業,沒有考慮實際的需求,所以有設計不合理的地方,請見諒。 這個項目有三大功能,首先有單詞查詢,其次是天氣查詢,後來是機器聊天功能。單詞查詢是使用了扇貝單詞提供的免費API;天氣查詢是使用了聚合數據提供的天氣API,這裡需要註冊使用(有限的免費使用);機器聊天是使 ...
  • 1.先創建一個工程項目Test 2.創建一個倉庫Repository 3.提交到master(記得寫標題) 4.推送到github上 5.創建倉庫Respository成功 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...