2014-04-11 15 views
8

Haritada özel işaretçileri içeren küme üzerinde mükemmel Android Maps Utility library kullanıyorum. Harika çalışıyor ve özelleştirmesi çok kolay.Android Maps Utility: URL adresinden görüntüler

Sorunum, yerel kaynakları demodan (R.drawable.image_demo) bir URL'den görüntülere nasıl değiştireceğinizdir. Bu görüntüleri imageView async'de yüklemek için Universal Image Loader kullanıyorum, ancak sorunlar görüntülerin karşılık gelen işaretçiye yüklenmemesi.

Herhangi bir örnek hakkında bilgi sahibi olan var mı?

Bu, görüntünün DefaultClusterRender sınıfının içine yüklenip yüklendiği koddur. Şimdiden teşekkürler.

 @Override 
    protected void onBeforeClusterItemRendered(MapFoto mapFoto, MarkerOptions markerOptions) { 
     // Draw a single person. 
     // Set the info window to show their name. 
     // mImageView.setImageResource(R.drawable.barcelona); 
     // mImageView.setScaleType(ScaleType.CENTER_CROP); 

     Log.d("", "--- url: " + mapFoto.getPictureUrl()); 
     ImageLoader.getInstance().displayImage(mapFoto.getPictureUrl(), mImageView, BlipointApp.optionsAvatarImage, new ImageLoadingListener() { 
      @Override 
      public void onLoadingStarted(String imageUri, View view) { 
      } 

      @Override 
      public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
      } 

      @Override 
      public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
       mImageView.setImageBitmap(loadedImage); 
       mImageView.setScaleType(ScaleType.CENTER_CROP); 
      } 

      @Override 
      public void onLoadingCancelled(String imageUri, View view) { 
      } 
     }); 

     Bitmap icon = mIconGenerator.makeIcon(); 
     markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)).title(mapFoto.getName()); 
    } 
+0

Görüntüyü bir yere yükleyip sonra görüntülemeniz gerekir. UIL kullanıyor musunuz? – Raghunandan

+1

Evet, UIL kullanıyorum. UIL görüntüler önbellekleri saklar ve bu yüzden endişelenmeyeceğim. Sorun, görüntünün yüklendiği görüntü görüntüsünün doğru görüntü görüntüsü olmamasıdır. Ama görüntü iyi indiriyor ve yükler! mImageView.setImageBitmap (loadedImage); – Pelanes

+0

Aynı problemim var, nasıl çözdünüz? Teşekkürler –

cevap

10

UIL kullanılarak benzer bir sorun yaşadım, tüm resimler yüklenmedi. Harita aktivitesini her çalıştırdığımda ve kümelere yerleştirdiğimde, görüntü içermeyen farklı işaretleyiciler/kümeler vardı. Sadece standart işaretleyici/küme simgeleri gösterildi.

Son iki gün denemeden ve denemeden sonra iyi çalışıyor. Geçici olarak çalışıp çalışamayacağını görmek için Picasso kütüphanesine geçtim ama orada benzer problemler yaşadım ve bunu yapamadım. Ayrıca Picasso ile web'den yüklenen tüm görüntüler (URL) 90 derece döndürüldü. Nedenini anlayamadım. Web'de bulduğum bazı yayınlara göre cihazla bir şeyler yapmak zorunda kalabilir, test için Samsung Galaxy S5 cihazını kullanıyorum. Ama emin değil ....

İşte bazı notlar nasıl yaptım: UIL yükleme işlemi tamamlanana kadar var olacak bir ImageView ile bir HardRefSimpleImageLoadingListener yarattım. Sabit referansı olmadan ImageView onLoadingCancelled çağrılır ve yükleme tamamlanmayacaktır. Ayrıca Simge jeneratörleri için bir İşaretçi, Resim Görünümü ve bitmap içeren ClusterMarkerTarget ve ClusterItemMarkerTarget nesnelerini oluşturdum. Ayrıca onları çöp toplanmasını engellemek için myClusterItemMarkerTargets ve myClusterMarkerTargets numaralı HashSet'lere koydum.

Belki biri için kullanılabilir. İşte

bazı kod:

 @Override 
     protected void onClusterItemRendered(ReportItem clusterItem, Marker marker) { 

     final ClusterItemMarkerTarget pm_ClusterItem = new ClusterItemMarkerTarget(marker); 

     myClusterItemMarkerTargets.add(pm_ClusterItem); 

     HardRefSimpleImageLoadingListener loadingListener = new HardRefSimpleImageLoadingListener() { 
      @Override 
      public void onLoadingFailed(String s, View view, FailReason failReason) { 
       myClusterItemMarkerTargets.remove(pm_ClusterItem); 
      } 

      @Override 
      public void onLoadingComplete(String s, View view, Bitmap bitmap) { 
       mClusterItemImageView.setImageBitmap(bitmap); 
       pm_ClusterItem.myIcon_cluster = mClusterItemIconGenerator.makeIcon(); 
       pm_ClusterItem.mMarker.setIcon(BitmapDescriptorFactory.fromBitmap(pm_ClusterItem.myIcon_cluster)); 
       myClusterItemMarkerTargets.remove(pm_ClusterItem); 
      } 

      @Override 
      public void onLoadingCancelled(String s, View view) { 
       myClusterItemMarkerTargets.remove(pm_ClusterItem); 
      } 
     }; 

     ImageLoader.getInstance().displayImage(clusterItem.picPath, pm_ClusterItem.myClusterItemImageView , loadingListener); 
    } 

    @Override 
    protected void onClusterRendered(Cluster<ReportItem> cluster, Marker marker) { 

     int i=0; 
     clustersize = cluster.getSize(); 

     final ClusterMarkerTarget pm_Cluster = new ClusterMarkerTarget(marker, cluster); 

     myClusterMarkerTargets.add(pm_Cluster); 

     for (ReportItem r : cluster.getItems()) { 
      // Draw 1 at most. 
      if (i == 1) { 
       break; 
      } 

      HardRefSimpleImageLoadingListener loadingListener = new HardRefSimpleImageLoadingListener() { 

       @Override 
       public void onLoadingFailed(String s, View view, FailReason failReason) { 
        myClusterMarkerTargets.remove(pm_Cluster); 
       } 

       @Override 
       public void onLoadingComplete(String s, View view, Bitmap bitmap) { 
        mClusterImageView.setImageBitmap(bitmap); // = (ImageView) view; //pm.myClusterImageView; 
        pm_Cluster.myIcon_clusterItem = mClusterIconGenerator.makeIcon(String.valueOf(clustersize)); 
        pm_Cluster.myMarker.setIcon(BitmapDescriptorFactory.fromBitmap(pm_Cluster.myIcon_clusterItem)); 
        myClusterMarkerTargets.remove(pm_Cluster); 
       } 

       @Override 
       public void onLoadingCancelled(String s, View view) { 
        myClusterMarkerTargets.remove(pm_Cluster); 
       } 
      }; 

      ImageLoader.getInstance().displayImage(r.picPath, pm_Cluster.myClusterImageView, loadingListener); 

      i++; 
     } 
    } 

daha:

//Set for holding a reference to marker targets --> targets won't get carbage collected during looping and loading images 
Set<ReportRenderer.ClusterItemMarkerTarget> myClusterItemMarkerTargets = new HashSet<>(); 
Set<ReportRenderer.ClusterMarkerTarget>  myClusterMarkerTargets = new HashSet<>(); 

daha:

public ReportRenderer(ClusterManager<ReportItem> mClusterManager, GoogleMap map) { 

     super(MyApplication.getContext(), map, mClusterManager); 

     mDimension = (int) MyApplication.getContext().getResources().getDimension(R.dimen.custom_report_image); 
     mPadding = (int) MyApplication.getContext().getResources().getDimension(R.dimen.custom_report_padding); 

     // initialize cluster icon generator 
     View multiReport = inflater.inflate(R.layout.multi_report, null); 
     mClusterImageView = (ImageView) multiReport.findViewById(R.id.image_report); 
     mClusterIconGenerator = new IconGenerator(MyApplication.getContext()); 
     mClusterIconGenerator.setContentView(multiReport); 

     // initialize cluster item icon generator 
     mClusterItemImageView = new ImageView(MyApplication.getContext()); 
     mClusterItemImageView.setLayoutParams(new ViewGroup.LayoutParams(mDimension, mDimension)); 
     mClusterItemImageView.setPadding(mPadding, mPadding, mPadding, mPadding); 
     mClusterItemIconGenerator = new IconGenerator(MyApplication.getContext()); 
     mClusterItemIconGenerator.setContentView(mClusterItemImageView); 

     // initialize image loader 
     options = new DisplayImageOptions.Builder() 
       .showImageOnLoading(R.drawable.loading) 
       .showImageForEmptyUri(R.drawable.warning) 
       .showImageOnFail(R.drawable.fail) 
       .cacheInMemory(true) 
       .cacheOnDisk(true) 
       .considerExifParams(true) 
         //.bitmapConfig(Bitmap.Config.RGB_565) 
       .build(); 
     config = new ImageLoaderConfiguration.Builder(MyApplication.getContext()) 
       .defaultDisplayImageOptions(options) 
       .build(); 
     ImageLoader.getInstance().init(config); 
    } 

daha:

//cluster marker with image loaded by Ultimate Image Loader 
    class ClusterMarkerTarget { 

     Marker myMarker; 
     ImageView myClusterImageView; 

     public ClusterMarkerTarget(Marker marker, Cluster<ReportItem> cluster) { 
      myMarker = marker; 
      View multiReport = inflater.inflate(R.layout.multi_report, null); 
      myClusterImageView = (ImageView) multiReport.findViewById(R.id.image_report); 
     } 
    } 

    //cluster item marker with image loaded by Ultimate Image Loader 
    class ClusterItemMarkerTarget { 

     Marker  mMarker; 
     ImageView myClusterItemImageView; 

     public ClusterItemMarkerTarget(Marker marker) { 
      mMarker = marker; 
      myClusterItemImageView = new ImageView(MyApplication.getContext());//mClusterItemImageView; 
      myClusterItemImageView.setLayoutParams(new ViewGroup.LayoutParams(mDimension, mDimension)); 
      int padding = (int) MyApplication.getContext().getResources().getDimension(R.dimen.custom_report_padding); 
      myClusterItemImageView.setPadding(padding, padding, padding, padding); 
     } 
    } 

ve son olarak:

class HardRefSimpleImageLoadingListener extends SimpleImageLoadingListener { 
     public ImageView mView; 

     @Override 
     public void onLoadingStarted(String imageUri, View view) { 
      mView = (ImageView) view; 
     } 
    } 
+0

gibi diğer kütüphanelerle deneyeceğim. Çok teşekkür ederim! GoogleMapsUtil ile bir sonraki proje için kodunuzu tutacağım :) – Pelanes

+1

Teşekkürler, bir çekicilik gibi çalışır. Btw, Picasso ile çalışmasını sağlamak için herhangi bir yolu var mı? –

+0

@ franco-phong Uygulamanızda çalıştığına sevindim. Eminim Picasso'yla çalışmanın bir yolu olduğundan eminim, ama bir hafta sonra (!) Vazgeçip UIL'e geçtim. –