Zach
Zach

Reputation: 10139

Android Mapview Custom marker not working with Picasso

I am implementing android Mapview with Custom marker. The custom marker has a background view to which an image is asynchronously loaded. I am using Picasso to load image in to marker view. Here is the code I am using,

for(int i=0;i<10;i++)
        {


                // latitude and longitude
                double latitude = getShop_latitude(i);
                double longitude = getShop_longitude(i);

                // create marker
                MarkerOptions marker = new MarkerOptions().position(
                        new LatLng(latitude, longitude)).title("");
                PicassoMarker pm = new PicassoMarker(marker,getActivity());

                String url = PPConfig.IMAGE_URL + Uri.encode(getPpyOfferIcon(i));
                Picasso.with(getActivity()).load(url).into(pm);

                // Changing marker icon

                builder.include(marker.getPosition());


                // adding marker
                googleMap.addMarker(marker);

        }

Here is the class that extends Target public class PicassoMarker implements Target { private MarkerOptions mMarker; private FragmentActivity mActivity;

 public PicassoMarker(MarkerOptions marker,FragmentActivity activity) {
        mMarker = marker;
        mActivity = activity;
    }

    @Override
    public int hashCode() {
        return mMarker.hashCode();
    }

    @Override
    public boolean equals(Object o) {
        if(o instanceof PicassoMarker) {
            MarkerOptions marker = ((PicassoMarker) o).mMarker;
            return mMarker.equals(marker);
        } else {
            return false;
        }
    }

    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        //Load Custom marker view
        View markerView = mActivity.getLayoutInflater().inflate(R.layout.fragment_map_marker,
                null);
        ImageView image = (ImageView) markerView.findViewById(R.id.markerImage);
        image.setImageBitmap(bitmap);
        RelativeLayout rl = (RelativeLayout)markerView.findViewById(R.id.markerContent);
        rl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), "Clicked", Toast.LENGTH_LONG).show();
            }
        });
        mMarker.icon(BitmapDescriptorFactory
                .fromBitmap(createDrawableFromView(mActivity, markerView)));
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {
    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {

    }

    // Convert a view to bitmap
    private Bitmap createDrawableFromView(Context context, View view) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        mActivity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        view.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT));
        view.measure(displayMetrics.widthPixels, displayMetrics.heightPixels);
        view.layout(0, 0, 107, 117);
        view.buildDrawingCache();
        Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(bitmap);
        view.draw(canvas);

        return bitmap;
    }
}

But this code is not loading my custom marker view, instead its loading the default marker pin point. Whats going wrong here?

Thanks.

Upvotes: 1

Views: 3288

Answers (2)

Sanket Shah
Sanket Shah

Reputation: 1

Try this code

Picasso.with(getActivity()).load(url).placeholder(R.mipmap.ic_launcher).resize(200, 200).into(img_profile, new Callback() {
            @Override
            public void onSuccess() {
                DebugLog.e("Success");
                dropPinEffect(mMap.addMarker(new MarkerOptions()
                        .position(markerLatLng)
                        .title("Title")
                        .snippet("Description")
                        .icon(BitmapDescriptorFactory.fromBitmap(createDrawableFromView(getActivity(), marker)))));
            }

            @Override
            public void onError() {

            }
        });

Upvotes: 0

ztan
ztan

Reputation: 6921

Your PicassoMarker will be garbage collected before your onBitmapLoaded() method is called asynchronously. So you need a reference to hold your PicassoMarker object.

sample code in Activity:

public class MainActivity extends FragmentActivity {
    private PicassoMarker target;
    private GoogleMap mMap;
    private static LatLng goodLatLng = new LatLng(37, -120);

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setUpMapIfNeeded();

        MarkerOptions markerOne = new MarkerOptions().position(goodLatLng).title("");

       target = new PicassoMarker(mMap.addMarker(markerOne));
       Picasso.with(MainActivity.this).load("http://icons.iconarchive.com/icons/yellowicon/game-stars/256/Mario-icon.png").into(target);
    }

}

Sample code in PicassoMaker:

public class PicassoMarker implements Target {

    Marker mMarker;

    PicassoMarker(Marker marker) {
        Log.d("test: ", "init marker");

        mMarker = marker;

    }

    @Override
    public int hashCode() {
        return mMarker.hashCode();
    }

    @Override
    public boolean equals(Object o) {
        if(o instanceof PicassoMarker) {
            Marker marker = ((PicassoMarker) o).mMarker;
            return mMarker.equals(marker);
        } else {
            return false;
        }
    }

    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        Log.d("test: ", "bitmap loaded");
        mMarker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap));
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {
        Log.d("test: ", "bitmap fail");
    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {
        Log.d("test: ", "bitmap preload");
    }
}

Upvotes: 2

Related Questions