2017-08-23 2 views
2

J'ai besoin de charger l'image pour un marqueur de l'URL. Jusqu'à ce que l'image se charge de l'URL que je dois montrer la valeur par défaut image.Et se ma page carte sera comme ci-dessous:Comment charger l'image du réseau comme icône de marqueur dans android?

enter image description here

Marker image de fond est blanc et l'icône (par exemple: sac et voiture) dans ce sera proviennent de l'URL du réseau.

J'ai obtenu une sortie pertinente en créant un marqueur en utilisant BitmapDescriptorFactory.fromBitmap.

if (isAdded()) { 
      marker = googleMap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(createDrawableFromView(setMarkerFromlayout(result, false, false), 200, 200))) 
        .position(pinLocation) 
        .title(parser.mapLocationList.get(pos).location_id) 
        .snippet("") 
      ); 
     } 
public static Bitmap createDrawableFromView(View v, int requestedWidth, int requestedHeight) { 
    // Because the view is never shown it does not have a size, but if shown don't resize it. 
    if (v.getMeasuredHeight() <= 0) { 

     // You may want to change these lines according to the behavior you need. 
     int specWidth = View.MeasureSpec.makeMeasureSpec(requestedWidth, View.MeasureSpec.AT_MOST); 
     int specHeight = View.MeasureSpec.makeMeasureSpec(requestedHeight, View.MeasureSpec.AT_MOST); 
     v.measure(specWidth, specHeight); 
    } 
    Bitmap b = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(b); 
    v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); 
    v.draw(c); 
    return b; 
} 


private RelativeLayout setMarkerFromlayout(Bitmap resultImage, boolean isClickable, boolean isFirst) { 

    LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.layout_map_custom_icon, null); 
    RelativeLayout layoutIcon = (RelativeLayout) view.findViewById(R.id.layout_icon); 
    ImageView imgBg = (ImageView) view.findViewById(R.id.bg_icon); 
    ImageView imgdefault = (ImageView) view.findViewById(R.id.default_icon); 

    if (isClickable) { 
     layoutIcon.setBackground(ContextCompat.getDrawable(getActivity(), R.drawable.green_round_bg)); 
    } 

    imgBg.setBackground(ContextCompat.getDrawable(getActivity(), R.drawable.map_bg)); 
    if(isFirst){ 
     imgdefault.setBackground(ContextCompat.getDrawable(getActivity(), R.drawable.marker_default)); 
    } 
    final ImageView imgMap = (ImageView) view.findViewById(R.id.img_map_icon); 

    if (!isFirst) { 
     imgMap.setImageBitmap(resultImage); 
    } 

    RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) imgMap.getLayoutParams(); 
    layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); 
    layoutParams.height = BDevice.getPixelFromDp(getActivity(), 30); 
    layoutParams.width = BDevice.getPixelFromDp(getActivity(), 30); 
    layoutParams.setMargins(BDevice.getPixelFromDp(getActivity(), 10), BDevice.getPixelFromDp(getActivity(), 10), BDevice.getPixelFromDp(getActivity(), 10), BDevice.getPixelFromDp(getActivity(), 20)); 
    imgMap.setLayoutParams(layoutParams); 

    return layoutIcon; 
} 

layout_map_custom_icon.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/layout_icon" 

    > 
    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:id="@+id/bg_icon" 
/> 
    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:id="@+id/default_icon" 
     /> 
    <ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:id="@+id/img_map_icon" /> 
</RelativeLayout> 

Mais si j'utilise la méthode ci-dessus signifie, rendu marqueur est un peu lent et aussi l'image ne soit pas maintenu dans le cache. Donc, chaque fois que je quitte l'application à chaque fois que l'image est téléchargée et définie sur le marqueur. Pouvons-nous faire le processus ci-dessus en utilisant n'importe quelle bibliothèque de chargement d'image comme Picasso ou Fresco ou Glide? Donc, cette image sera conservée dans le cache.

Veuillez nous consulter. Merci.

Répondre

2

Essayez le Picaso.

Cette bibliothèque permet de charger facilement les images et le cache de maintenance.

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView); 

Et sur:

Mais si j'utilise la méthode ci-dessus signifie, rendu marqueur est un peu lent

Cette cause peut être de taille de l'image. Essayez de compresser votre image pour réduire certains octets. Cela rendra votre chargeur plus rapide.

Online compressor for iamgens

+0

Dans Picasso, vous pouvez utiliser redimensionner avant le chargement des images –

+0

@EugeneLezov, je ne comprends pas comment 'resize' peut aider dans ce cas. – GuilhermeFGL