Last active
March 26, 2017 20:16
-
-
Save dominicthomas/d9123f0f18fa05422e52755c30d9e2ba to your computer and use it in GitHub Desktop.
Android Picasso target to display an image view in a map icon
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Create new image target | |
final SimpleImageTarget newTarget = new SimpleImageTarget( | |
clusterItem.getSpot(), marker, markerImageView, iconGenerator); | |
// Store target reference - remove later | |
if (!imageTargets.containsKey(clusterItem.getSpot().getId())) { | |
imageTargets.put(clusterItem.getSpot().getId(), newTarget); | |
} | |
// Kick off image loading | |
Picasso.with(context) | |
.load(clusterItem.getSpot().getImageUrl()) | |
.noFade() | |
.resize(dimensions, dimensions) | |
.onlyScaleDown() | |
.into(newTarget); | |
// Target class | |
public class SimpleImageTarget implements Target { | |
private final Spot spot; | |
private final Marker marker; | |
private final ImageView markerImageView; | |
private final IconGenerator iconGenerator; | |
public SimpleImageTarget(Spot spot, Marker marker, ImageView markerImageView, IconGenerator iconGenerator) { | |
this.spot = spot; | |
this.marker = marker; | |
this.markerImageView = markerImageView; | |
this.iconGenerator = iconGenerator; | |
} | |
@Override | |
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { | |
markerImageView.setImageBitmap(bitmap); | |
iconGenerator.setColor(CategoryHelper.getColor(spot.getCategory())); | |
final Bitmap markerBitmap = iconGenerator.makeIcon(); | |
if (marker.getTag() != null) { | |
marker.setIcon(BitmapDescriptorFactory.fromBitmap(markerBitmap)); | |
} | |
} | |
@Override | |
public void onBitmapFailed(Drawable errorDrawable) { | |
// NOOP | |
} | |
@Override | |
public void onPrepareLoad(Drawable placeHolderDrawable) { | |
// NOOP | |
} | |
} | |
// Target if a custom view is needed - inflate using the LayoutInflater and pass in an instance | |
public class CustomViewTarget implements Target { | |
private final Spot spot; | |
private final Marker marker; | |
private final View customMarkerView; | |
public CustomViewTarget(Spot spot, Marker marker, View customMarkerView) { | |
this.spot = spot; | |
this.marker = marker; | |
this.customMarkerView = customMarkerView; | |
} | |
@Override | |
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { | |
// Set downloaded image in image view | |
final ImageView imageView = (ImageView) customMarkerView.findViewById(R.id.profile_image); | |
imageView.setImageBitmap(bitmap); | |
// Measure layout | |
customMarkerView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); | |
customMarkerView.layout(0, 0, customMarkerView.getMeasuredWidth(), customMarkerView.getMeasuredHeight()); | |
customMarkerView.buildDrawingCache(); | |
// Get spot color | |
int spotColor = CategoryHelper.getColor(spot.getCategory()); | |
// Create bitmap and canvas | |
final Bitmap markerBitmapFromView = Bitmap.createBitmap(customMarkerView.getMeasuredWidth(), customMarkerView.getMeasuredHeight(), Bitmap.Config.ARGB_8888); | |
final Canvas canvas = new Canvas(markerBitmapFromView); | |
canvas.drawColor(Color.WHITE, PorterDuff.Mode.SRC_IN); | |
// Draw view to canvas | |
final Drawable drawable = customMarkerView.getBackground(); | |
drawable.setColorFilter(new PorterDuffColorFilter(spotColor, PorterDuff.Mode.SRC_ATOP)); | |
//customMarkerView.getBackground().setColorFilter(new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.MULTIPLY)); | |
customMarkerView.draw(canvas); | |
// Set bitmap as icon | |
marker.setIcon(BitmapDescriptorFactory.fromBitmap(markerBitmapFromView)); | |
} | |
@Override | |
public void onBitmapFailed(Drawable errorDrawable) { | |
Timber.d("onBitmapFailed!"); | |
} | |
@Override | |
public void onPrepareLoad(Drawable placeHolderDrawable) { | |
Timber.d("onPrepareLoad!"); | |
} | |
@Override | |
public int hashCode() { | |
return marker.hashCode(); | |
} | |
@Override | |
public boolean equals(Object o) { | |
if (o instanceof CustomViewTarget) { | |
Marker marker = ((CustomViewTarget) o).marker; | |
return this.marker.equals(marker); | |
} else { | |
return false; | |
} | |
} | |
public Marker getMarker() { | |
return marker; | |
} | |
public Spot getSpot() { | |
return spot; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment