2017-02-15 31 views
1

Мне нужны значки значков в Картах Google, рассчитанные во время выполнения. Для этого я создал класс, полученный из представления.Как преобразовать пользовательский вид в растровое изображение для значка маркера Google Maps

class DrawView extends View { 

Paint p; 
RectF rectf; 
String textLabel; 

public DrawView(Context context, String text) { 
    super(context); 
    p = new Paint(); 
    rectf = new RectF(100,100,300,150); 
    this.textLabel=text; 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    p.setColor(Color.RED); 
    p.setStrokeWidth(10); 
    canvas.drawRoundRect(rectf, 20, 20, p); 
    //another draw will be here... 
    } 
} 

Преобразовать Вид Bitmap

public static Bitmap loadBitmapFromView(View v) { 
    Bitmap b = Bitmap.createBitmap(v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(b); 
    v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom()); 
    v.draw(c); 
    return b; 
} 

Добавить маркер

View view =new DrawView(this,"Some text"); 
      view.setDrawingCacheEnabled(true); 
      view.buildDrawingCache(); 
      Bitmap bitmap=loadBitmapFromView(view); 
      Marker marker=mMap.addMarker(new MarkerOptions().position(new LatLng(s.lat,s.lng)).icon(BitmapDescriptorFactory.fromBitmap(bitmap))); 

NPE происходит

FATAL EXCEPTION: main 
java.lang.NullPointerException 
at ru.ch2.activity.CheckInActivity.loadBitmapFromView(CheckInActivity.java:439) 
at ru.ch2.activity.CheckInActivity.onMapReady(CheckInActivity.java:254) 
at com.google.android.gms.maps.SupportMapFragment$zza$1.zza(Unknown Source) 
at com.google.android.gms.maps.internal.zzo$zza.onTransact(Unknown Source) 
at android.os.Binder.transact(Binder.java:347) 
at xk.a(:com.google.android.gms.DynamiteModulesB:82) 
at maps.af.t$5.run(Unknown Source) 
at android.os.Handler.handleCallback(Handler.java:730) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5103) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
at dalvik.system.NativeStart.main(Native Method) 

В loadBitmapFromView на линии

v.layout (v.getLeft(), v.getTop(), v.getRight(), v.getBottom());

+0

ваш 'Посмотреть V' является недействительным. Вы передаете null в качестве аргумента методу. –

+0

Возможный дубликат [Что такое исключение NullPointerException и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

+0

все, что вам нужно предоставить, это «Bitmap» (или даже лучше «BitmapDescriptor»): вам не нужно расширять 'View' для этого – pskink

ответ

1

попробуйте использовать эту функцию:

вызов view.measure заставить размер представления необходимо рассчитать, чтобы получить правильный размер представления

public static Bitmap loadBitmapFromView(View view) { 
    view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); 
    Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), 
      Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(bitmap); 
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 
    view.draw(canvas); 
    return bitmap; 
} 
+0

Может быть, лучше проверить' view.isLaidOut() 'before' v.layout (...) '. –