2017-02-15 1 views
1

런타임에 계산 된 Google지도 아이콘 마커가 필요합니다. 이를 위해 View에서 파생 된 클래스를 만들었습니다.Google지도 용 사용자 정의보기를 비트 맵으로 변환하는 방법 마커 아이콘

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... 
    } 
} 

보기 변환

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) 
발생 마커 추가

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; 
} 

비트 맵 라인에 loadBitmapFromView에서 1,515,

v.layout (v.getLeft() v.getTop() v.getRight() v.getBottom()); 이 기능을 사용

+0

당신의'보기 v'가 null을 얻기 위해 계산한다. 메서드에 인수로 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()'를'v.layout (...)'. –

관련 문제