Google Map V2延迟加载标记图像 [英] Google Map V2 Lazy loading of marker image

查看:78
本文介绍了Google Map V2延迟加载标记图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

任何人都请告诉我如何进行标记的延迟加载,因为我所有的标记图像都是从服务器获取的.我可以从服务器上下载它,但是仅当有地图移动时才会显示,即标记图像仅在已缓存时更新,对象引用不再起作用,谷歌地图将标记视图转换为位图,设置它.如果用户使地图保持空闲状态,则不会加载图像. :(

Anybody please tell me how to do lazy loading of markers because all of my marker image are getting from server. I can be able to download it from server but this will be displayed only if there is a map movement ie The marker image get updated only if it's already cached, the object reference wouldn't work anymore , google map convert marker view to bitmap and set it. If the user keeps the map idle then it wouldn't load the image. :(

我花了将近一个星期的时间去做,但是已经-ve了.如果有人可以发出火花,那将真的很有帮助.

I spend almost a week and do the possible but it's -ve. If anyone can give a spark it would be really really helpful.

public class ROverViewRender extends DefaultClusterRenderer<RItem> {

    private IconGenerator mIconGenerator;
    private IconGenerator mClusterIconGenerator;
    private RImageView mImageView;
    private RImageView mImageVieStar;
    private ImageView mClusterImageView;
    private Context context;
    private ClusterManager<RItem> mClusterManager;
    private ImageLoader imageLoader;

    public ROverViewRender(Context context, GoogleMap map, ClusterManager<RItem> clusterManager) {
        super(context, map, clusterManager);

        this.mClusterManager=clusterManager;
        Activity activity = (Activity) context;
        this.context=context;
        mClusterIconGenerator=new IconGenerator(context);
        View clustorIcon = activity.getLayoutInflater().inflate(R.layout.clustor_icon, null);
        mClusterIconGenerator.setContentView(clustorIcon);
        mIconGenerator=new IconGenerator(context);
        View markerIcon = activity.getLayoutInflater().inflate(R.layout.marker_icon, null);
        mIconGenerator.setContentView(markerIcon);
        mImageView=(RImageView)markerIcon.findViewById(R.id.marker_image);
        mImageVieStar=(RImageView)markerIcon.findViewById(R.id.marker_route_rating);
        mClusterImageView=(NetworkImageView)clustorIcon.findViewById(R.id.cluster_image);

        imageLoader=VolleySingleton.getInstance(context).getImageLoader();;

    }

    @Override
    protected void onBeforeClusterItemRendered(final RItem item, MarkerOptions markerOptions) {

        setMarkerImage(item,markerOptions);
         Bitmap icon = mIconGenerator.makeIcon();
         markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));


    }

    @Override
    protected void onBeforeClusterRendered(Cluster<RItem> cluster, MarkerOptions markerOptions) {
         Drawable drawable =context.getResources().getDrawable(R.drawable.ic_launcher);

        mClusterImageView.setImageDrawable(drawable);
         Bitmap icon = mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
         markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
    }

     @Override
     protected boolean shouldRenderAsCluster(Cluster cluster) {
         // Always render clusters.
         return cluster.getSize() > 1;
     }
     @Override
    protected void onClusterItemRendered(RItem clusterItem, Marker marker) {
         RLog.e("Invoked the ....>>>>>");
    //   setMarkerImage(clusterItem);

    }

     private void setMarkerImage(RItem item,final MarkerOptions markerOptions){
         RLog.e("Image setter invoked..."+item.getMarkerUrl());
         mImageView.setImageUrl(item.getMarkerUrl(), imageLoader);
         imageLoader.get(item.getMarkerUrl(), new ImageListener() {

                public void onErrorResponse(VolleyError error) {
                 //   imageView.setImageResource(R.drawable.icon_error); // set an error image if the download fails
                }

                public void onResponse(ImageContainer response, boolean arg1) {
                    RLog.e("Image download completed...");
                    if (response.getBitmap() != null) {
                        mImageView.setImageBitmap(response.getBitmap());


                    } 
                }
            });
     }
}

推荐答案

我编写了示例代码,也许可以使用. 我将Picasso用于图像加载库.

I wrote example code and it might be worked. I use Picasso for image loading library.

完整的代码如下 https://github.com/sis-yoshiday/Example/tree/master/app/src/main/java/jp/sis/yoshiday/example/android/widget/map

class MyClusterRenderer extends DefaultClusterRenderer<MyClusterItem> {

private final IconGenerator iconGenerator;

private final IconGenerator clusterIconGenerator;

private final ImageView imageView;

private final ImageView clusterImageView;

private final int markerWidth;

private final int markerHeight;

public MyClusterRenderer(Context context, GoogleMap map,
    ClusterManager<MyClusterItem> clusterManager) {
  super(context, map, clusterManager);

  // initialize cluster icon generator
  clusterIconGenerator = new IconGenerator(context.getApplicationContext());

  View clusterView = LayoutInflater.from(context).inflate(R.layout.marker_cluster, null);
  clusterIconGenerator.setContentView(clusterView);

  clusterImageView = (ImageView) clusterView.findViewById(R.id.image);

  // initialize cluster item icon generator
  iconGenerator = new IconGenerator(context.getApplicationContext());
  imageView = new ImageView(context.getApplicationContext());
  markerWidth = (int) getResources().getDimension(R.dimen.marker_width);
  markerHeight = (int) getResources().getDimension(R.dimen.marker_height);
  imageView.setLayoutParams(new ViewGroup.LayoutParams(markerWidth, markerHeight));
  int padding = (int) getResources().getDimension(R.dimen.marker_space);
  imageView.setPadding(padding, padding, padding, padding);
  iconGenerator.setContentView(imageView);
}

@Override protected void onBeforeClusterItemRendered(MyClusterItem item,
    MarkerOptions markerOptions) {

  loadAsync(imageView, item.getImageUrl());

  try {
    Bitmap icon = iconGenerator.makeIcon();
    markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
    BitmapUtils.recycle(icon);
  } catch (Exception e) {
    // FIXME workaround : called after Bitmap recycled
    Log.e(TAG, e.getMessage(), e);
  }
}

@Override protected void onBeforeClusterRendered(Cluster<MyClusterItem> cluster,
    MarkerOptions markerOptions) {

  Iterator<MyClusterItem> iterator = cluster.getItems().iterator();

  loadAsync(clusterImageView, iterator.next().getImageUrl());

  try {
    Bitmap icon = clusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
    markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
    BitmapUtils.recycle(icon);
  } catch (Exception e) {
    // FIXME workaround : called after Bitmap recycled
    Log.e(TAG, e.getMessage(), e);
  }
}

@Override
protected boolean shouldRenderAsCluster(Cluster cluster) {
  return cluster.getSize() > 1;
}

private void loadAsync(final ImageView imageView, final String url) {

  // first, get from cache
  Bitmap bitmap = thumbCache.get(url);
  if (bitmap == null || bitmap.isRecycled()) {
    // if there are no cached entry or already recycled, start async load
    Picasso.with(getActivity()).load(url).into(new Target() {
      @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        imageView.setImageBitmap(bitmap);
        thumbCache.put(url, bitmap);
      }

      @Override public void onBitmapFailed(Drawable errorDrawable) {

        imageView.setImageResource(R.drawable.ic_launcher);
      }

      @Override public void onPrepareLoad(Drawable placeHolderDrawable) {
      }
    });
  } else {
    imageView.setImageBitmap(bitmap);
  }
}

}

这篇关于Google Map V2延迟加载标记图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆