2017-02-21 21 views
15

Как мы можем достичь значка карты маркеров с вектором активов файлом, как Google показывает это, как это, программен:Пользовательский маркер в картах Google в Android с векторным значком активов

map

Update:

map.addMarker(new MarkerOptions() 
    .position(latLng) 
    .icon(BitmapDescriptorFactory.fromResource(R.drawable.your_vector_asset)) 
    .title(title); 

Это не работает при работе с векторными активами. Основная причина - задать вопрос. Ошибка с вышеуказанным кодом:

java.lang.IllegalArgumentException: Не удалось декодировать изображение. Предоставленное изображение должно быть растровым.

+0

Вы можете добавить этот маркер с изображением PNG также, если вы хотите. –

+0

@RishabhMahatha Я могу легко сделать это с помощью png, но проблема в png - тяжелый файл. либо я должен хранить его в своем apk или вызывать его с сервера. Но я определенно нуждаюсь в этом от файла векторных активов. – Shuddh

+0

@LucaNicoletti Мне нужно достичь этого, используя векторный файл (или SVG). и я не получаю lib или метод для этого. – Shuddh

ответ

2

Я искал точно такое же требование, и видя этот вопрос заставил меня счастливый на первом, но так же, как я был @Shuddh не доволен данными ответами.

Для того, чтобы мой рассказ коротким, я использую следующий код для этого требования:

private BitmapDescriptor bitmapDescriptorFromVector(Context context, @DrawableRes int vectorDrawableResourceId) { 
    Drawable background = ContextCompat.getDrawable(context, R.drawable.ic_map_pin_filled_blue_48dp); 
    background.setBounds(0, 0, background.getIntrinsicWidth(), background.getIntrinsicHeight()); 
    Drawable vectorDrawable = ContextCompat.getDrawable(context, vectorDrawableResourceId); 
    vectorDrawable.setBounds(40, 20, vectorDrawable.getIntrinsicWidth() + 40, vectorDrawable.getIntrinsicHeight() + 20); 
    Bitmap bitmap = Bitmap.createBitmap(background.getIntrinsicWidth(), background.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(bitmap); 
    background.draw(canvas); 
    vectorDrawable.draw(canvas); 
    return BitmapDescriptorFactory.fromBitmap(bitmap); 
} 

и примера использования:

.icon(bitmapDescriptorFromVector(this, R.drawable.ic_car_white_24dp)); 

Примечания: Вы, возможно, пожелаете использовать различные ограничивающий для векторов , мои векторы были 24dp в размере, и я использовал 48dp png изображение (синяя часть, которая также может быть вектором) в качестве фона.

UPDATE: добавление скриншота по мере необходимости.

Screenshot for end result

+0

Я думаю, что это сделает трюк. Я проверю это и Отметьте ответ. Но если у вас есть скриншот. Поделись, пожалуйста. – Shuddh

+0

Я добавил скриншот, надеюсь, что уточню, что было требованием изначально! ;-) "Я имею в виду повторное использование векторов внутри вывода карты" –

0

Попробуйте

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

Можете ли вы объяснить оператор return vector. Каков метод getBitmap, который вы используете. – Shuddh

+0

Плюс я не думаю, что это также даст мне маркер, который я хочу. поскольку маркер, показанный на изображении, является маркером по умолчанию, содержащим векторный актив. но этот код будет генерировать значок в соответствии с векторным активом, но не с маркером (синяя часть). – Shuddh

+0

@Shuddh Значок, который вы ищете, должен быть обычным. В векторном активе должна быть указана синяя и белая часть автомобиля. И тогда вы добавите этот вектор в качестве значка. –

12

Вы можете используйте этот метод:

private BitmapDescriptor bitmapDescriptorFromVector(Context context, int vectorResId) { 
     Drawable vectorDrawable = ContextCompat.getDrawable(context, vectorResId); 
     vectorDrawable.setBounds(0, 0, vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight()); 
     Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(bitmap); 
     vectorDrawable.draw(canvas); 
     return BitmapDescriptorFactory.fromBitmap(bitmap); 
} 

Так что ваш код будет выглядеть следующим образом:

map.addMarker(new MarkerOptions() 
       .position(latLng) 
       .icon(bitmapDescriptorFromVector(getActivity(), R.drawable.your_vector_asset)) 
       .title(title); 
+0

Вы пробовали это. Я не видел этот код какое-то время! – Shuddh

+0

Конечно, я использовал его в своем проекте –

+0

Это все еще решает мою проблему! То, что ваш метод дает мне, - это только значок автомобиля, а не синий фон. Мне нужно сохранить этот фон плюс над тем, что отразится на этом значке. – Shuddh