Custom marker in google maps in android with vector asset icon

前端 未结 9 1144
小鲜肉
小鲜肉 2020-12-02 09:50

How can we achieve a map marker icon with vector asset file, the way google shows it like this, programatically:

Update:

m         


        
相关标签:
9条回答
  • 2020-12-02 10:24

    Here is the code for kotlin lovers ;)

    private fun bitMapFromVector(vectorResID:Int):BitmapDescriptor {
        val vectorDrawable=ContextCompat.getDrawable(context!!,vectorResID)
        vectorDrawable!!.setBounds(0,0,vectorDrawable!!.intrinsicWidth,vectorDrawable.intrinsicHeight)
        val bitmap=Bitmap.createBitmap(vectorDrawable.intrinsicWidth,vectorDrawable.intrinsicHeight,Bitmap.Config.ARGB_8888)
        val canvas=Canvas(bitmap)
        vectorDrawable.draw(canvas)
        return BitmapDescriptorFactory.fromBitmap(bitmap)
    }
    
    0 讨论(0)
  • 2020-12-02 10:25

    Try this

    MarkerOptions op = new MarkerOptions();
    op.position(src_latlng);
    Marker origin_marker = googleMap.addMarker(op);
    
    Bitmap bitmap = getBitmap(this,R.drawable.ic_map_marker);
    origin_marker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap));
    

    getBitmap

    public Bitmap getBitmap(Context context, int drawableId) {
       Drawable drawable = ContextCompat.getDrawable(context, drawableId);
       if (drawable instanceof BitmapDrawable) {
           return BitmapFactory.decodeResource(context.getResources(), drawableId);
       } else if (drawable instanceof VectorDrawable) {
           return getBitmap((VectorDrawable) drawable);
       } else {
           throw new IllegalArgumentException("unsupported drawable type");
       }
    }
    

    ic_map_marker.xml

    <vector android:height="32dp" android:viewportHeight="512.0"
        android:viewportWidth="512.0" android:width="32dp" xmlns:android="http://schemas.android.com/apk/res/android">
        <path android:fillColor="#f32f00" android:pathData="M288,284.8V480l-64,32V284.8c10.3,2.1 21,3.3 32,3.3S277.7,286.9 288,284.8zM384,128c0,70.7 -57.3,128 -128,128c-70.7,0 -128,-57.3 -128,-128S185.3,0 256,0C326.7,0 384,57.3 384,128zM256,64c0,-17.7 -14.3,-32 -32,-32s-32,14.3 -32,32s14.3,32 32,32S256,81.7 256,64z"/>
    </vector>
    
    0 讨论(0)
  • 2020-12-02 10:25

    For a Kotlin user.Please check below code.As I ddid in Fragment class.

    class MapPinFragment : Fragment() {
    
        private lateinit var googleMap1: GoogleMap
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
        }
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                                  savedInstanceState: Bundle?): View? {
            return inflater.inflate(R.layout.fragment_map_pin, container, false)
        }
    
        override fun onActivityCreated(savedInstanceState: Bundle?) {
            super.onActivityCreated(savedInstanceState)
            mapView.onCreate(savedInstanceState)
            mapView.onResume()
    
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
    
            mapView.getMapAsync { googleMap ->
                googleMap1 = googleMap as GoogleMap
                addCustomMarker()
            }
    
        }
    
        private fun addCustomMarker() {
            Log.d("addCustomMarker", "addCustomMarker()")
            if (googleMap1 == null) {
                return
            }
            // adding a marker on map with image from  drawable
            googleMap1.addMarker(
                MarkerOptions()
                    .position(LatLng(23.0225 , 72.5714))
                    .icon(BitmapDescriptorFactory.fromBitmap(getMarkerBitmapFromView()))
            )
        }
    
        override fun onDestroy() {
            super.onDestroy()
            if (mapView != null)
                mapView.onDestroy()
        }
        override fun onLowMemory() {
            super.onLowMemory()
            mapView.onLowMemory()
        }
    
        private fun getMarkerBitmapFromView(): Bitmap? {
            val customMarkerView: View? = layoutInflater.inflate(R.layout.view_custom_marker, null)
    //        val markerImageView: ImageView =
    //            customMarkerView.findViewById<View>(R.id.profile_image) as ImageView
            customMarkerView?.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED );
            customMarkerView?.layout(0, 0, customMarkerView.measuredWidth, customMarkerView.measuredHeight);
            customMarkerView?.buildDrawingCache();
            val returnedBitmap = Bitmap.createBitmap(
                customMarkerView!!.measuredWidth, customMarkerView.measuredHeight,
                Bitmap.Config.ARGB_8888
            )
            val canvas = Canvas(returnedBitmap)
            canvas.drawColor(Color.WHITE, PorterDuff.Mode.SRC_IN)
            val drawable = customMarkerView.background
    
            drawable?.draw(canvas);
            customMarkerView.draw(canvas);
            return returnedBitmap;
    
        }
    
    
    
    
    }
    
    0 讨论(0)
提交回复
热议问题