Android 百度地圖marker中圖片不顯示的解決方案

目的:

根據(jù)提供的多個經(jīng)緯度尾菇,顯示所在地的marker樣式,如下:

問題:

  • ①發(fā)現(xiàn)marker中在線加載的圖片無法顯示出來囚枪;
  • ②獲取多個對象后派诬,卻只顯示出了一個marker;

以下為官網(wǎng)實現(xiàn)方法:
通過查閱百度官網(wǎng)的文檔链沼,我們可以知道默赂,地圖標注物的實現(xiàn)方法如下:

//定義Maker坐標點  
LatLng point = new LatLng(39.963175, 116.400244);  
//構(gòu)建Marker圖標  
BitmapDescriptor bitmap = BitmapDescriptorFactory  
    .fromResource(R.drawable.icon_marka);  
//構(gòu)建MarkerOption,用于在地圖上添加Marker  
OverlayOptions option = new MarkerOptions()  
    .position(point)  
    .icon(bitmap);  
//在地圖上添加Marker括勺,并顯示  
mBaiduMap.addOverlay(option);

那么想通過更改marker的樣式缆八,也就是option中的.icon(BitmapDescriptor)方法曲掰,只需要提供BitmapDescriptor對象即可,獲取BitmapDescriptor的方式有如下幾種:

Paste_Image.png

(查詢地址:http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v4_3_0/index.html

因為是marker不是簡單的圖片展示奈辰,所以這里是需要自定義view給加載進來的栏妖,因此使用的是fromView()來加載自定義視圖,視圖內(nèi)容如下:

<?xml version="1.0" encoding="utf-8"?>  
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="30dp"  
    android:id="@+id/bitmapFl"  
    android:layout_height="44dp">  
  
    <ImageView  
        android:layout_width="30dp"  
        android:layout_height="44dp"  
        android:layout_gravity="center"  
        android:src="@mipmap/anchor"/>  
  
    <ImageView  
        android:id="@+id/picSdv"  
        android:layout_marginTop="1dp"  
        android:layout_width="28dp"  
        android:layout_height="28dp"  
        android:layout_gravity="center_horizontal"  
        />  
  
</FrameLayout> 

但是如果此時使用fromView來加載視圖生成BitmapDescriptor就會導致:在圖片未在線加載完畢時冯挎,整個view就已經(jīng)生成了BitmapDescriptor底哥,這個時候就出現(xiàn)了marker無法顯示圖片的問題(這就好比經(jīng)典招數(shù)“猴子偷桃”咙鞍,桃都還沒有房官,怎么偷得出來呢)。
所以解決的辦法是——>等到圖片加載完畢后再去生成BitmapDescriptor续滋,從而設置MarkerOptions翰守。

下面為我的解決方案:

以下是在fragment中加載以上的視圖文件:(具體業(yè)務情況看個人的頁面設計,所以使用的時候也不一定非得在這個方法里面初始化)

@Nullable  
  @Override  
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {  
      this.inflater = inflater;  
      this.container = container;  
      if (markerView == null) {  
          viewHolder = new ViewHolder();  
          markerView = (FrameLayout) inflater.inflate(R.layout.layout_bitmap_descriptor, container, true).findViewById(R.id.bitmapFl);//此處一定要find到bitmapFl疲酌,否則此處會報錯加載的對象不是要求的布局對象  
          viewHolder.imageView = (ImageView) markerView.findViewById(R.id.picSdv);  
          markerView.setTag(viewHolder);  
      }  
      return inflater.inflate(R.layout.fragment_main, container, false);  
  }  
  
ivate class ViewHolder {  
      ImageView imageView;  
  }

因為涉及到多個marker的加載蜡峰,意味著要對布局進行多次加載,所以此處使用ViewHolder來處理重復的操作朗恳。

然后進行初始化各個marker:

/** 
  * 初始化位置標注信息 
  * 
  * @param geoUserEntities:地理用戶數(shù)據(jù)(包含頭像地址湿颅、經(jīng)緯度) 
  */  
 private void initOverlayOptions(List<GeoUserEntity> geoUserEntities) {  
     baiduMap.clear();  
  
     AvatarEntity avatarEntityTemp;  
     for (int i = 0; i < geoUserEntities.size(); i++) {  
         if (geoUserEntities.get(i) == null) {  
             continue;  
         }  
         final Marker[] marker = {null};  
         final GeoUserEntity geoUserEntityTemp = geoUserEntities.get(i);  
         avatarEntityTemp = geoUserEntityTemp.getAvatar();  
         final BitmapDescriptor[] pic = {null};  
         if (avatarEntityTemp != null && !StringUtils.isEmpty(avatarEntityTemp.getImageUrl())) {  
             returnPicView(avatarEntityTemp.getMid(), new ResultListener() {//圖片加載完畢后的回調(diào)方法  
                 @Override  
                 public void onReturnResult(Object object) {  
                     super.onReturnResult(object);  
                     pic[0] = BitmapDescriptorFactory.fromView((View) object);  
                     putDataToMarkerOptions(pic[0], geoUserEntityTemp);  
                 }  
             });  
  
         } else if (avatarEntityTemp == null) {  
             pic[0] = BitmapDescriptorFactory.fromResource(R.mipmap.anchor);  
             putDataToMarkerOptions(pic[0], geoUserEntityTemp);  
         }  
     }  
 }  
  
  
 /** 
  * 顯示marker,設置marker傳遞的數(shù)據(jù) 
  * 
  * @param pic 
  * @param geoUserEntityTemp 
  */  
 private void putDataToMarkerOptions(BitmapDescriptor pic, GeoUserEntity geoUserEntityTemp) {  
     double[] locationTemp = geoUserEntityTemp.getLocation();  
     if (locationTemp != null && locationTemp.length == 2) {  
         LatLng point = new LatLng(locationTemp[1], locationTemp[0]);  
         MarkerOptions overlayOptions = new MarkerOptions()  
                 .position(point)  
                 .icon(pic)  
                 .animateType(MarkerOptions.MarkerAnimateType.grow);//設置marker從地上生長出來的動畫  
  
         Marker marker = (Marker) baiduMap.addOverlay(overlayOptions);  
         Bundle bundle = new Bundle();  
         bundle.putSerializable(ConstantValues.User.GEO_USER_ENTITY, geoUserEntityTemp);  
         marker.setExtraInfo(bundle);//marker點擊事件監(jiān)聽時粥诫,可以獲取到此時設置的數(shù)據(jù)  
         marker.setToTop();  
     }  
 }  
   
  
 private void returnPicView(String urlTemp, final ResultListener resultListener) {  
     viewHolder = (ViewHolder) markerView.getTag();  
     Glide.with(getContext())  
             .load(urlTemp)  
             .asBitmap()  
             .transform(new GlideCircleTransform(getContext()))  
             .into(new SimpleTarget<Bitmap>() {  
                       @Override  
                       public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {  
                           viewHolder.imageView.setImageBitmap(bitmap);  
                           resultListener.onReturnResult(markerView);  
                       }  
                   }  
             );  
 }  

通過returnPicView方法來進行異步圖片加載油航,然后用自定義的ResultListener接口來回調(diào)圖片加載完畢的結(jié)果,從而初始化BitmapDescriptor怀浆,進而設置MarkerOptions谊囚。

要點:

  • GlideCircleTransform是自定義的類,用來設置圖片為圓形(之后有實現(xiàn)方法)执赡;
  • onResourceReady是Glide框架中監(jiān)聽圖片加載完畢的回調(diào)方法镰踏,以上的實現(xiàn)能監(jiān)聽多張圖片加載完畢的事件;
  • resultListener.onReturnResult(markerView);中的markerView是一開始自定義的marker中要加載的整個布局沙合;
  • 為啥不用SimpleDraweeView來實現(xiàn)圓形圖片并進行圖片下載的監(jiān)聽奠伪?
    僅個人的使用情況:使用Glide框架無法控制SimpleDraweeView的形狀;而且首懈,SimpleDraweeView無法監(jiān)聽動態(tài)加載同一個view時的多張圖片下載的情況绊率,意味著只能監(jiān)聽到最后最后一張圖片。(也就是猜拾,類似于上面的onReturnResult方法只會回調(diào)一次即舌,這也就是本文開頭提到過的問題②:獲取多個對象后,卻只顯示出了一個marker的情況)

然后挎袜,附上GlideCircleTransform的類代碼(從其它處拷貝過來的):

public class GlideCircleTransform extends BitmapTransformation {  
    public Context context;  
  
    public GlideCircleTransform(Context context) {  
        super(context);  
        this.context = context;  
    }  
  
    @Override  
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {  
        return circleCrop(pool, toTransform);  
    }  
  
    private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {  
        if (source == null) return null;  
        int size = Math.min(source.getWidth(), source.getHeight());  
        int x = (source.getWidth() - size) / 2;  
        int y = (source.getHeight() - size) / 2;  
        // TODO this could be acquired from the pool too  
        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);  
        Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);  
        if (result == null) {  
            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);  
        }  
        Canvas canvas = new Canvas(result);  
        Paint paint = new Paint();  
        paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));  
        paint.setAntiAlias(true);  
        float r = size / 2f;  
        canvas.drawCircle(r, r, r, paint);  
  
        return result;  
    }  
  
    @Override  
    public String getId() {  
        return getClass().getName();  
    }  
} 

在對未知進行探索時顽聂,一點是興奮的肥惭,兩點是開心的,三點是積極的紊搪,太多太多的點則是痛苦的蜜葱,而解決了迷惑之后內(nèi)心是舒坦的!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耀石,一起剝皮案震驚了整個濱河市牵囤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滞伟,老刑警劉巖揭鳞,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異梆奈,居然都是意外死亡野崇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門亩钟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乓梨,“玉大人,你說我怎么就攤上這事清酥》龆疲” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵焰轻,是天一觀的道長臭觉。 經(jīng)常有香客問我,道長鹦马,這世上最難降的妖魔是什么胧谈? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮荸频,結(jié)果婚禮上菱肖,老公的妹妹穿的比我還像新娘。我一直安慰自己旭从,他們只是感情好稳强,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著和悦,像睡著了一般退疫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸽素,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天褒繁,我揣著相機與錄音,去河邊找鬼馍忽。 笑死棒坏,一個胖子當著我的面吹牛燕差,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坝冕,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼徒探,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喂窟?” 一聲冷哼從身側(cè)響起测暗,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎磨澡,沒想到半個月后碗啄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡钱贯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年挫掏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秩命。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖褒傅,靈堂內(nèi)的尸體忽然破棺而出弃锐,到底是詐尸還是另有隱情,我是刑警寧澤殿托,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布霹菊,位于F島的核電站,受9級特大地震影響支竹,放射性物質(zhì)發(fā)生泄漏旋廷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一礼搁、第九天 我趴在偏房一處隱蔽的房頂上張望饶碘。 院中可真熱鬧,春花似錦馒吴、人聲如沸扎运。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豪治。三九已至,卻和暖如春扯罐,著一層夾襖步出監(jiān)牢的瞬間负拟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工歹河, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掩浙,地道東北人琉挖。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像涣脚,于是被迫代替她去往敵國和親示辈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進度條TabLayout圖標下拉刷新...
    皇小弟閱讀 46,762評論 22 665
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,152評論 25 707
  • 新的一年遣蚀,希望每個人都身體健康
    撿妹幾閱讀 116評論 0 0
  • 昨天晚上12點以后睡覺矾麻,帶著許多未完成的事,包括兩篇約稿芭梯,閱讀小升初的系列構(gòu)想险耀。 今天早晨五點醒來,煮了飯玖喘,還是繼...
    躲進小樓看燈火閱讀 221評論 0 0
  • 文/沐小木 初中那會甩牺,是我叛逆期最嚴重的時候。 最喜歡看武俠小說累奈,夾帶著校園青春類或傷感或唯美的故事贬派,每每手不釋卷...
    小迎喝飽了閱讀 717評論 0 0