1. 程式人生 > >Android----高德地圖多個Marker載入網路圖片出現圖片不顯示問題

Android----高德地圖多個Marker載入網路圖片出現圖片不顯示問題

需求說要地圖上展示的是mark,不是infowindow,加載出網路圖片,由於app的marker比較多,沒有達到需要的效果。

看了看高德地圖api中有這個方法

markerOption.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.location_marker)));

fromBitmap裡面的引數也可以是bitmap,於是可以自定義一個View把這個view轉成bitmap。

這是做好所有工作以後,發現有的圖片能顯示出來,有的顯示不出來。

由於載入圖片的時候是非同步的,有時候會在圖片還沒有載入完成的時候,view已經被轉成bitmap,而這時Glide還在載入圖片圖,當glide載入工作完成時,要把圖片展示在imageView上時,發現已經找不到這個imageView的id了,因此導致有些marker顯示不出來圖片。

於是我就添加了一個Glide圖片載入完成的監聽,在Glide圖片載入完成之時再去把View轉成bitmap,如下程式碼所示

Glide.with(this).load(list.get(i).getGasLogoSmall()).
                    placeholder(R.mipmap.gas_small_logo)
                    .transform(new GlideCircleTransform(getActivity()))
                    .error(R.mipmap.gas_small_logo)
//                    .listener(new RequestListener<String, GlideDrawable>() {
//                        @Override
//                        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
//   
//                            return false;
//                        }
//
//                        @Override
//                        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                            Bitmap bitmap = convertViewToBitmap(view); 
//                          markerOption = new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(bitmap))....            
//                          aMap.addMarker(markerOption);
//                          return false;
//                        }
//                    })
                    .into(imageView)

程式碼寫完之後除錯,發現還是不行,有的圖片還是展示不出來,於是又苦思冥想,查詢資料,發現自己錯了,Glide在呼叫into方法的時候才去展示的圖片,而RequestListener只表示圖片載入的結果,這時並未在imageView 上展示,當還沒有顯示圖片的imageView時候轉bitmap,當然在marker上也顯示不出來,是我對Glide框架了解的不夠深,其實into()方法裡不只可以填充imageView,還可以放SimpleTarget.於是又這樣寫了一下

Glide.with(this).load(list.get(i).getGasLogoSmall()).
        placeholder(R.mipmap.gas_small_logo)
        .transform(new GlideCircleTransform(getActivity()))
        .error(R.mipmap.gas_small_logo)
        .into(new SimpleTarget<GlideDrawable>() {
            @Override
            public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
                //展示圖片
                imageView.setImageDrawable(resource);
                textView.setText(list.get(I).getGasName() + "");
                Bitmap bitmap = convertViewToBitmap(view);
                markerOption = new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(bitmap))
                        .position..;
                aMap.addMarker(markerOption);
            }
        });

就這樣,在顯示圖片之後把View轉bitmap,都完美的顯示在了marker上

BitmapDescriptorFactory.fromView(view)即使這樣還是有的圖片載入不出來,檢視fromView原始碼,其實內裡也是把view轉成了Bitmap