Skip to content

Instantly share code, notes, and snippets.

@dominicthomas
Last active March 26, 2017 20:16
Show Gist options
  • Save dominicthomas/d9123f0f18fa05422e52755c30d9e2ba to your computer and use it in GitHub Desktop.
Save dominicthomas/d9123f0f18fa05422e52755c30d9e2ba to your computer and use it in GitHub Desktop.
Android Picasso target to display an image view in a map icon
// 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