1. 程式人生 > >百度地圖多個InfoWindow同時展示

百度地圖多個InfoWindow同時展示

由於百度的InfoWindow只能展示一個,marker卻不受限制,因此換了一個思路,在網上搜集了許多資料,最終實驗成功。

通過建立一個自定義的bitmap然後以marker的形式新增到地圖上。


在xml中,只有一個地圖控制元件,因為手邊沒有真機,就用模擬器進行測試的,地圖是用的是TextureMapView使用預設的MapVIew會報錯。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app
="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.pistol.markerinfos.MainActivity"> <com.baidu.mapapi.map.TextureMapView android:id="@+id/bmapView" android:layout_width=
"match_parent" android:layout_height="match_parent" android:clickable="true" /> </RelativeLayout>
activity內容如下圖:
public class MainActivity extends AppCompatActivity {

    private TextureMapView bmapView;
    private BaiduMap mBaiduMap;
    private BitmapDescriptor mIconMarker;
    private 
Bitmap bitmap = null; private List<LatLng> latList = new ArrayList<>(); // 天安門座標 private double mLat1 = 39.915291; private double mLon1 = 116.403857; // 百度大廈座標 private double mLat2 = 40.056858; private double mLon2 = 116.308194; // 西湖座標 private double mLat3 = 30.2446230000; private double mLon3 = 120.1517040000; private LatLng loc_start; private LatLng loc_end; private LatLng loc_position; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各元件之前初始化context資訊,傳入ApplicationContext //注意該方法要再setContentView方法之前實現 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); initView(); initData(); } private void initView() { bmapView = (TextureMapView) findViewById(R.id.bmapView); mBaiduMap = bmapView.getMap(); mIconMarker = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher); } int i = 0; private void initData() { loc_start = new LatLng(mLat1, mLon1); loc_end = new LatLng(mLat2, mLon2); loc_position = new LatLng(mLat3, mLon3); latList.add(loc_start); latList.add(loc_end); latList.add(loc_position); for (LatLng position : latList) { i++; showMarker(position, "第" + i + "個框"); } updateMap(); } private void updateMap() { mBaiduMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() { @Override public void onMapLoaded() { //仿照zoomToSpan()寫的自適應 LatLngBounds.Builder builder = new LatLngBounds.Builder(); for (int i = 0; i < latList.size(); i++) { builder.include(latList.get(i)); } //更新地圖 mBaiduMap.animateMapStatus(MapStatusUpdateFactory .newLatLngBounds(builder.build())); } }); } private void showMarker(LatLng latLng, String str) { // 建立bitmap drawBitMap(str); OverlayOptions option = new MarkerOptions().position(latLng).icon(BitmapDescriptorFactory.fromBitmap(bitmap)); if (mBaiduMap != null) { mBaiduMap.addOverlay(option); } gc(); } private void drawBitMap(String str) { float scale = this.getResources().getDisplayMetrics().density; Log.e("scale", "=" + scale); int width = mIconMarker.getBitmap().getWidth(), height = mIconMarker.getBitmap().getHeight();//marker的獲取寬高 bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444); //建立一個空的Bitmap bitmap = scaleWithWH(bitmap, width * scale, height * scale);//縮放 //畫筆進行新增文字(強烈推薦啟艦的自定義控制元件三部曲http://blog.csdn.net/harvic880925/article/details/50995268) Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);//抗鋸齒 paint.setDither(true); // 獲取跟清晰的影象取樣 paint.setFilterBitmap(true);// 過濾 paint.setColor(Color.RED); paint.setTextSize(14 * scale); Rect bounds = new Rect(); paint.getTextBounds(str, 0, str.length(), bounds);//獲取文字的範圍 //文字在mMarker中展示的位置 float paddingLeft = (bitmap.getWidth() - bounds.width()) / 2;//在中間 float paddingTop = (bitmap.getHeight() / scale);//在頂部 Canvas canvas = new Canvas(bitmap); canvas.drawText(str, paddingLeft, paddingTop, paint); //合併兩個bitmap為一個 canvas.drawBitmap(mIconMarker.getBitmap(), paddingLeft, paddingTop, null);//marker的位置 } private Bitmap scaleWithWH(Bitmap src, double w, double h) { if (w == 0 || h == 0 || src == null) { return src; } else { // 記錄src的寬高 int width = src.getWidth(); int height = src.getHeight(); // 建立一個matrix容器 Matrix matrix = new Matrix(); // 計算縮放比例 float scaleWidth = (float) (w / width); float scaleHeight = (float) (h / height); // 開始縮放 matrix.postScale(scaleWidth, scaleHeight); // 建立縮放後的圖片 return Bitmap.createBitmap(src, 0, 0, width, height, matrix, true); } } private void gc() { if (bitmap != null) { // 回收並且置為null bitmap.recycle(); bitmap = null; } System.gc(); } }

相關推薦

地圖InfoWindow同時展示

由於百度的InfoWindow只能展示一個,marker卻不受限制,因此換了一個思路,在網上搜集了許多資料,最終實驗成功。 通過建立一個自定義的bitmap然後以marker的形式新增到地圖上。 在xml中,只有一個地圖控制元件,因為手邊沒有真機,就用模擬器進行測試的,地

vue專案引入地圖位置寫法 (二)

標籤: <div style="height:100%" id="map"></div>  鉤子函式: methods: { //''''''''地。。。圖。。。代。。。碼'''''''''''''''''''''''''

php+js實現地圖點標註的方法

本文例項講述了php+js實現百度地圖多點標註的方法。分享給大家供大家參考,具體如下: 1.php建立json資料 ? 1

地圖 軌跡 示例

最近專案需要接百度地圖,就研究了下熱力圖和軌跡圖。 做的過程中發現軌跡圖的資料非常少,特別是多軌跡的。現在我弄出來了就分享下多軌跡的寫法,希望大家少走彎路: <!DOCTYPE html> <html> <head> <meta n

根據地圖座標點獲得兩點間距離

//地球半徑 private static final double EARTH_RADIUS = 6378.137; /** * 根據經緯度查詢距離 * @param lng1 經度

地圖demo,根據ip展示地圖顯示地區,並在地圖上高亮顯示

需求提出:使用百度地圖展示使用者註冊時的地區並高亮顯示。 方案設計:根據使用者註冊時獲取使用者的ip地址,根據ip地址獲取經緯度,再根據經緯度顯示在地圖上展示,並高亮。 解決需求: 1.獲取使用者註冊ip (比較簡單,省略); 2.根據ip地址獲取經緯度。使用百度地圖的ap

java 使用地圖顯示標註點帶彈出資訊框

直接上程式碼 <%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UT

地圖自定義覆蓋物及建立小圖示

// 百度地圖API功能var sContent ="<h4 style='margin:0 0 5px 0;padding:0.2em 0'>天安門</h4>" +"<img style='float:right;margin:4px' id

地圖根據點自適應縮放

LatLngBounds.Builder builder = new LatLngBounds.Builder(); for (LatLng latLng : mLocations) { buil

地圖-修改marker圖示(icon)及同時顯示

當前位置需另行後臺傳入 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

『實踐』地圖marker新增右鍵選單(刪除、更新)

1 $.getJSON("./GetStationPlaceServlet",function(json){ 2 for(var i=0;i<json.length;i++){ 3 var obj1 = eval(json); 4

關於地圖的數據展示

pub elong on() Coding erl cnblogs 關閉 多邊形 back toMapList [{"dataId":"1506398830646205","createTime":"2017-09-26 12:07:10","updateTime":"2

地圖手機端單觸點單擊和長按事件,解決部分手機(小米手機)地圖單擊事件失效,觸點、拖動依然觸發長按的bug

|| ble apply timeout console dto eat 問題 int /** * Author 嶽曉 * * 對百度地圖的事件擴展,目前擴展了fastclick和longclick, * 解決某些設備click不執行的問題

地圖點定位+聚合)

初始化 默認 each 直接 搜索 不能 行政 參數 全部 首先頁面引用必須的兩個JS <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的Key值">

地圖API,展示地圖和添加控件

空間 鼠標滾輪 比例尺 鼠標 right size ofo ext aid 1、申請百度賬號和AK 點我申請 2、準備頁面 根據HTML標準,每一份HTML文檔都應該聲明正確的文檔類型,我們建議您使用最新的符合HTML5規範的文檔聲明: <!DOCTYPE html

iOS Swift地圖 新增多標註

搞了一天終於把新增多個標註做出來了,又深刻的反應了寫程式碼一味的copy,不知其所以然的後果太嚴重,一點錯誤找個大半天,好了,不過多bb,說說新增多個標註要注意的一些東西吧。 首先,新增大頭針的方法要實現在_mapview.delegate = self 之後,否則過早添加

地圖之九如何在一個地圖上顯示條導航路線

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

地圖開發(六)檢索定位附近街道資訊並展示

效果:  主要程式碼就是根據經緯度獲取經緯度附近周邊的資訊 /** * 根據經緯度獲取定位周邊街道資訊 * */ private void setPopupTipsInfo(LatLng latLng) { //設定反地理編

地圖】製作途經點的線路導航,模擬運動 (vue,typescript)

  網上有從起點到終點的模擬線路和運動,途經點的比較少。 結合網上demo,再進行了一下修改。 VUE (Typescript),先在index.html裡引用 <!DOCTYPE html> <html lang="en"> <head>

Java計算兩經緯度之間的距離公式,外加地圖高德地圖轉換,和保留小數

在網上看到了很多兩個座標之間的距離公式,也都親自測試了,有很多都不可以用,後來找到一個比較好的距離演算法,分享給大家 經緯度兩點之間的距離公式 public class MapUtils { private static double rad(double d) { return