25

Tôi đã cố thêm hình dạng có thể vẽ được làm biểu tượng điểm đánh dấu cho điểm đánh dấu mà tôi muốn thêm trên bản đồ.Google Maps API v2 Android thêm hình dạng có thể drawable làm điểm đánh dấu

hình dạng trông như thế này (res/drawable/blue_circle.xml):

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval" > 
    <size 
     android:width="15dp" 
     android:height="15dp" /> 
    <solid 
     android:color="@color/Blue" /> 
</shape> 

và tôi cố gắng thêm điểm đánh dấu như thế này:

markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.blue_circle)); 

Rõ ràng tôi nhận được một ngoại lệ NullPointer.

Biểu tượng điểm đánh dấu phải là bitmap không? Tôi có được phép thêm các hình dạng có thể kéo làm biểu tượng đánh dấu không? Và nếu có, tôi đang làm gì sai?

Trả lời

33

Tạo đối tượng vẽ được cho điểm đánh dấu của bạn (res/drawable/map_dot_red.xml):

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval" > 

    <gradient 
     android:angle="90" 
     android:endColor="#f58383" 
     android:startColor="#ee6464" /> 

    <stroke 
     android:width="1dp" 
     android:color="#a13939" /> 

</shape> 

Tạo một bitmap từ drawable:

int px = getResources().getDimensionPixelSize(R.dimen.map_dot_marker_size); 
mDotMarkerBitmap = Bitmap.createBitmap(px, px, Bitmap.Config.ARGB_8888); 
Canvas canvas = new Canvas(mDotMarkerBitmap); 
Drawable shape = getResources().getDrawable(R.drawable.map_dot_red); 
shape.setBounds(0, 0, mDotMarkerBitmap.getWidth(), mDotMarkerBitmap.getHeight()); 
shape.draw(canvas); 

Tạo điểm đánh dấu của bạn, bằng cách sử dụng bitmap:

Marker marker = mMap.addMarker(new MarkerOptions() 
    .position(point) 
    .anchor(.5f, .5f) 
    .icon(BitmapDescriptorFactory.fromBitmap(mDotMarkerBitmap))); 

Đặt kích thước điểm đánh dấu của bạn bằng cách làm mờ (res/values ​​/ dimens.xml):

<resources> 
    <dimen name="map_dot_marker_size">12dp</dimen> 
</resources> 
0

Cách của tôi để xử lý các hình dạng có thể vẽ (xml) làm biểu tượng điểm đánh dấu (dựa trên câu trả lời của saxman).

Tôi có rất nhiều đối tượng (điểm đánh dấu) để hiển thị trên bản đồ. Họ có cả hai loại drawables - bitmap và hình dạng. Biểu tượng tương tự mà tôi đã sử dụng cho nhiều điểm đánh dấu. Vì vậy, tôi đã thêm một số bộ nhớ đệm cho các mô tả bitmap và phát hiện loại có thể vẽ được.

SparseArray<BitmapDescriptor> iconCache = new SparseArray<>(); 
for (MyObject object : objects) { 
    int iconResId = object.icon; 

    BitmapDescriptor icon = iconCache.get(iconResId); 
    if (icon == null) { 
     Drawable drawable; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      drawable = getResources().getDrawable(iconResId, null); 
     } else { 
      drawable = getResources().getDrawable(iconResId); 
     } 
     if (drawable instanceof GradientDrawable) { 
      Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); 
      Canvas canvas = new Canvas(bitmap); 
      drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
      drawable.draw(canvas); 
      icon = BitmapDescriptorFactory.fromBitmap(bitmap); 
      bitmap.recycle(); 
     } else { 
      icon = BitmapDescriptorFactory.fromResource(iconResId); 
     } 
     iconCache.put(iconResId, icon); 

     map.addMarker(new MarkerOptions() 
      .icon(icon) 
      .position(position)); 
    } 
} 

Hình dạng có thể vẽ của tôi có kích thước thiết lập, do đó, tôi có thể truy vấn có thể vẽ được với kích thước mong muốn cho bitmap.

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="oval"> 
    <size android:width="12dp" android:height="12dp" /> 
    <solid android:color="@color/transit_bus" /> 
</shape> 
2

Đây là câu trả lời nếu bạn đang sử dụng thư viện com.google.maps.android:android-maps-utils.

Tạo một Bitmap sử dụng IconGenerator

IconGenerator iconGen = new IconGenerator(context); 

// Define the size you want from dimensions file 
int shapeSize = getResources().getDimensionPixelSize(R.dimen.shape_size); 

Drawable shapeDrawable = ResourcesCompat.getDrawable(getResources(), R.drawable.my_shape, null); 
iconGen.setBackground(shapeDrawable); 

// Create a view container to set the size 
View view = new View(context); 
view.setLayoutParams(new ViewGroup.LayoutParams(shapeSize, shapeSize)); 
iconGen.setContentView(view); 

// Create the bitmap 
Bitmap bitmap = iconGen.makeIcon(); 

Sau đó sử dụng bitmap như bạn sẽ khi đặt biểu tượng đánh dấu BitmapDescriptorFactory.fromBitmap(bitmap)

Các vấn đề liên quan