neena
neena

Reputation: 581

Customising marker in android map, placing text inside image

I have an image to show as marker, inside that image i have to update time when the map is moving

The problem facing now is

  1. I dont know how to show time inside my custom image.

    BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.drawable.ic_remaining_time);
        googleMap.addMarker(new MarkerOptions()
            .position(cameraPosition.target)
            .title(cameraPosition.toString())
            .icon(descriptor)                       
    );
    

Please anyone help me

Upvotes: 0

Views: 2856

Answers (3)

Shahab Rauf
Shahab Rauf

Reputation: 3931

Make drawable on every time when map get changed or move and set icon like below

marker.setIcon(BitmapDescriptorFactory.fromBitmap(CommonUtils.writeOnDrawable(mContext,R.drawable.ic_location,"your text here").getBitmap()));

// Bitmap Drawable method

public static BitmapDrawable writeOnDrawable(Context context, int drawableId, String text){

            Bitmap bm = BitmapFactory.decodeResource(context.getResources(), drawableId).copy(Bitmap.Config.ARGB_8888, true);

            Paint paint = new Paint();
            paint.setStyle(Paint.Style.FILL);
            paint.setColor(Color.WHITE);
            paint.setTextSize(30);
            paint.setTextAlign(Paint.Align.CENTER);
            Canvas canvas = new Canvas(bm);

            // Change the position of text here
            canvas.drawText(text,bm.getWidth()/2 //x position
            , bm.getHeight()/2  // y position
            , paint);
            return new BitmapDrawable(context.getResources(),bm);
        }

you can get the marker when u first time add marker in google map object

 Marker marker = googleMap.addMarker(new MarkerOptions().position(new LatLng(mLocation.getLatitude(), mLocation.getLongitude())).title(allJob.getBusiness().getName()).icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_location_icon)));

Upvotes: 5

Vikram
Vikram

Reputation: 778

Try something like this -

BitmapDescriptor descriptor = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getActivity().getResources(),R.drawable.ic_remaining_time));

googleMap.addMarker(new MarkerOptions()
                        .position(cameraPosition.target)
                        .title(cameraPosition.toString())
                        .icon(descriptor)

        );

To get customized marker inflate your custom layout at the place of marker like below -

 private Bitmap fillCustomizedMarker(int markerResource) {
        //Log.d(TAG, "fillMarkerWithText ++");
        View markerLayout;

            markerLayout = getActivity().getLayoutInflater().inflate(R.layout.custom_marker, null);

        markerLayout.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        markerLayout.layout(0, 0, markerLayout.getMeasuredWidth(), markerLayout.getMeasuredHeight());

        ImageView markerImage = (ImageView) markerLayout.findViewById(R.id.marker_image);
        TextView timeText = (TextView) markerLayout.findViewById(R.id.timeText);
        markerImage.setImageResource(markerResource);
        markerCost.setText(time);

        final Bitmap bitmap = Bitmap.createBitmap(markerLayout.getMeasuredWidth(), markerLayout.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        markerLayout.draw(canvas);
        return bitmap;
    }

And to update this layout i would suggest you to use handler in android. It will update your UI efficiently.

Upvotes: 0

antonicg
antonicg

Reputation: 944

I don't reccomend to update repeatedly a text inside an image in marker because to achieve that you must creat a bitmap with the image and text and put that bitmap as icon marker and that's not free (in terms of memory usage).

But you can try, anyway... Create the bitmap descriptor that way and put inside the icon:

public static Bitmap createDrawableFromView(Context context, View view) { 
  DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); 
  view.setLayoutParams( new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT ) );
  view.measure(displayMetrics.widthPixels, displayMetrics.heightPixels);
  view.layout(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels);
  view.buildDrawingCache(); 
  Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 
  Canvas canvas = new Canvas(bitmap); view.draw(canvas); 

  return bitmap;
}

Pass to that function the view you can set as icon, inflating an xml maybe.

Upvotes: 0

Related Questions