2013-04-16 12 views
6

Tôi đang chuyển đổi ứng dụng cũ từ v1 thành v2 và tôi đang gặp sự cố với màu của biểu tượng Marker. Tôi có một biểu tượng màu trắng cơ bản, và nó cần phải được tô màu.Chuyển đổi Bản vẽ thành bitmap để thay đổi màu của Điểm đánh dấu trong API Android của Google Maps v2

Trong v1, tôi đã làm nó theo cách này:

Drawable d = DrawableUtils.resizeImageToDrawable(
    MapViewFragment.mapviewActivity, 
    Configuration.Display.getDrawableFix(i), 
    Configuration.MapView.getWaypointIconWidth(), 
    Configuration.MapView.getWaypointIconHeight()); 
d.setColorFilter(color, Mode.MULTIPLY); 

overlay = new MyFplnFixListItimizedOverlay(d); 

Kể từ Markers v2 không chấp nhận Drawables cho các biểu tượng của họ, tôi nghĩ về chuyển đổi drawable đến một Bitmap, như thế này:

Drawable d = DrawableUtils.resizeImageToDrawable(
    MapViewFragment.mapviewActivity, 
    Configuration.Display.getDrawableFix(i), 
    Configuration.MapView.getWaypointIconWidth(), 
    Configuration.MapView.getWaypointIconHeight()); 
d.setColorFilter(color, Mode.MULTIPLY); 

Bitmap icon = ((BitmapDrawable) d).getBitmap(); 

Marker marker = MapViewFragment.map.addMarker(new MarkerOptions() 
    .position(point) 
    .title(Integer.toString(fplnType)) 
    .visible(true) 
    .icon(BitmapDescriptorFactory.fromBitmap(icon))); 

Nhưng vì lý do nào đó, nó không hoạt động. Các biểu tượng vẫn trắng. Có ai biết tại sao không?

Xin cảm ơn trước.

Trả lời

6

OK, đây là cách tôi đã làm nó vào cuối ngày:

Drawable d = DrawableUtils.resizeImageToDrawable(
        MapViewFragment.mapViewActivity, 
        Configuration.Display.getDrawableFix(i), 
        Configuration.MapView.getWaypointIconWidth(), 
        Configuration.MapView.getWaypointIconHeight()); 
d.setColorFilter(color, Mode.MULTIPLY); 

Bitmap b = ((BitmapDrawable) d).getBitmap(); 
Canvas myCanvas = new Canvas(b); 

int myColor = b.getPixel(0,0); 
ColorFilter filter = new LightingColorFilter(myColor, color); 

Paint pnt = new Paint(); 
pnt.setColorFilter(filter); 
myCanvas.drawBitmap(b,0,0,pnt); 

Marker marker = MapViewFragment.map.addMarker(new MarkerOptions() 
    .position(point) 
    .title(Integer.toString(fplnType)) 
    .visible(true) 
    .icon(BitmapDescriptorFactory.fromBitmap(b))); 
+1

Cảm ơn bạn đã chia sẻ. Bạn đã phải xử lý OutOfMemoryExceptions? – sealskej

0

Tôi không chắc DrawableUtils này đang làm gì, nhưng bạn đang truyền nó đến một BitmapDrawable. Nó thực sự là một BitmapDrawable?

đây là một số mã để trích xuất một Bitmap ra khỏi bất kỳ loại drawable:

Drawable d = // make sure it's not null 
d.setBounds(0, 0, width, height); 
Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
Canvas c = new Canvas(b); 
d.draw(c); 

ý tưởng là bạn nên tạo một canvas trên một bitmap có thể thay đổi và vẽ drawable rằng trên vải

chỉnh sửa :

Tôi vừa xem câu trả lời @Analizer và vâng, câu trả lời của tôi rất tốt nếu bạn không có Drawable làm tài nguyên. Nhưng nếu bạn làm, hãy sử dụng câu trả lời của mình thay thế.

+0

Tôi không đúc DrawableUtils để có thể vẽ, tôi chỉ sử dụng nó để thay đổi kích thước drawable đến một kích thước nhất định. Ngoài ra, cảm ơn lời khuyên của bạn, nhưng tôi bối rối như những gì tôi nên đặt cho "hiển thị" và "cấu hình". – Apoz

+0

xin lỗi, tôi nên giải thích thêm một chút và cũng có lỗi (kiểm tra mã cập nhật). Cấu hình có thể là bất kỳ tùy chọn nào từ đây: https://developer.android.com/reference/android/graphics/Bitmap.Config.html và hiển thị các tùy chọn từ đây https://developer.android.com/reference /android/util/DisplayMetrics.html Màn hình hiển thị, bạn có thể nhận được các số liệu hiển thị và tôi cho rằng nó đã được quy mô trước Bitmap cho màn hình, nhưng bạn sẽ phải tự kiểm tra nó vì nó chỉ là phỏng đoán của tôi. Nhưng như bạn có thể thấy trên bản chỉnh sửa, bạn chỉ có thể xây dựng mà không cần màn hình hiển thị. – Budius

+0

Nhưng tôi phải làm gì tiếp theo? Tôi có nên trực tiếp sử dụng Bitmap làm biểu tượng cho điểm đánh dấu của mình không? Tôi đã thử nó và nó không hoạt động, điểm đánh dấu không hiển thị. – Apoz

1

Nếu drawable của bạn không được định nghĩa trong một XML, bạn có thể làm điều đó với phương pháp này:

protected Bitmap fromDrawable(final Drawable drawable, final int height, final int width) { 
     final int widthDip = (int) TypedValue.applyDimension(1, width, getResources() 
       .getDisplayMetrics()); 
      final int heightDip = (int) TypedValue.applyDimension(1, width, getResources().getDisplayMetrics()); 
     final Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888); 
     final Canvas canvas = new Canvas(bitmap); 
     drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
     drawable.draw(canvas); 
     return bitmap; 
    } 

Lưu ý rằng nếu bạn cần phải làm điều đó từ bên ngoài một Activity, bạn cũng sẽ cần phải vượt qua một Context (để gọi context.getResources().getDisplayMetrics()). Bạn cũng chuyển đối tượng DisplayMetrics.