UFO ET IT

맞춤 마커가있는 Android Maps API v2

ufoet 2020. 11. 16. 23:18
반응형

맞춤 마커가있는 Android Maps API v2


맞춤 마커로지도를 만들고 싶습니다. API v2에서는 마커의 아이콘, 제목 등을 설정할 수 있습니다. 하지만 처음 시작할 때 마커와 함께 제목을 표시하고 싶습니다. 이제 제목은 마커를 탭할 때만 표시됩니다. v1에서는 오버레이가 있었지만 v2에서는 비슷한 것을 찾지 못했습니다.

편집 됨 : 아마도 나는 충분히 명확하지 않았을 것입니다. Marker.showInfoWindow()API에서 와 같은 것은 하나의 마커에만 작동합니다. 모든 마커에 대한 정보 창을 동시에 표시 할 수 없습니다. 어쨌든 사용자가 탭할 때까지 기다리지 않고 모든 마커의 제목을 표시해야합니다.


나는 또한이 문제를 우연히 발견했습니다. V2 API는 한 단계 앞으로, 두 단계 뒤로 물러납니다. Google, Marker 또는 GoogleMap 클래스에 재정의 가능한 'draw'메소드를 추가하여 직접 그림을 사용자 정의 할 수 있습니다.

가능한 해결책은 비트 맵을 즉석에서 생성하여 마커에 연결하는 것입니다. 즉, 캔버스를 만들고 마커 비트 맵을 삽입하고 마커 옆에 텍스트를 그립니다. 여기에는 몇 가지 어려운 계산 (마커 비트 맵과 텍스트가 나란히있는 적절한 캔버스 크기)이 포함됩니다. 안타깝게도 Marker에는 setIcon 메소드가 없으므로 텍스트가 변경 될 때마다 새 마커를 만들어야합니다. 지도에 마커 만 있으면 괜찮을 수 있지만 수십 개의 마커가있는 경우에는 불가능할 수 있습니다. 또한 이러한 비트 맵을 동적으로 만들 때 메모리 문제가있을 수 있습니다. 샘플 코드 (텍스트 만 포함) :

Bitmap.Config conf = Bitmap.Config.ARGB_8888; 
Bitmap bmp = Bitmap.createBitmap(200, 50, conf); 
Canvas canvas = new Canvas(bmp);

canvas.drawText("TEXT", 0, 50, paint); // paint defines the text color, stroke width, size
mMap.addMarker(new MarkerOptions()
                                .position(clickedPosition)
                                //.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker2))
                                .icon(BitmapDescriptorFactory.fromBitmap(bmp))
                                .anchor(0.5f, 1)
                                    );

바라건대 Google이 적절한 방법을 추가하여 쉽게 할 수 있기를 바랍니다. 젠장, V2 API의 새로운지도 회전 기능이 정말 마음에 듭니다.


마침내 해냈습니다. 그래서 당신이하는 일은 배경 이미지가 있습니다 (제 경우에는 파란색 직사각형을 사용합니다). 다음과 같이 마커를 만듭니다.

Marker myLocMarker = map.addMarker(new MarkerOptions()
            .position(myLocation)
            .icon(BitmapDescriptorFactory.fromBitmap(writeTextOnDrawable(R.drawable.bluebox, "your text goes here"))));

writeTextOnDrawable () 메서드를 확인하십시오.

private Bitmap writeTextOnDrawable(int drawableId, String text) {

    Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId)
            .copy(Bitmap.Config.ARGB_8888, true);

    Typeface tf = Typeface.create("Helvetica", Typeface.BOLD);

    Paint paint = new Paint();
    paint.setStyle(Style.FILL);
    paint.setColor(Color.WHITE);
    paint.setTypeface(tf);
    paint.setTextAlign(Align.CENTER);
    paint.setTextSize(convertToPixels(context, 11));

    Rect textRect = new Rect();
    paint.getTextBounds(text, 0, text.length(), textRect);

    Canvas canvas = new Canvas(bm);

    //If the text is bigger than the canvas , reduce the font size
    if(textRect.width() >= (canvas.getWidth() - 4))     //the padding on either sides is considered as 4, so as to appropriately fit in the text
        paint.setTextSize(convertToPixels(context, 7));        //Scaling needs to be used for different dpi's

    //Calculate the positions
    int xPos = (canvas.getWidth() / 2) - 2;     //-2 is for regulating the x position offset

    //"- ((paint.descent() + paint.ascent()) / 2)" is the distance from the baseline to the center.
    int yPos = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2)) ;  

    canvas.drawText(text, xPos, yPos, paint);

    return  bm;
}



public static int convertToPixels(Context context, int nDP)
{
    final float conversionScale = context.getResources().getDisplayMetrics().density;

    return (int) ((nDP * conversionScale) + 0.5f) ;

}

Arun George에게 감사 : 프로그래밍 방식으로 Android의 이미지에 텍스트 추가


귀하의 질문이 Google I / O 세션에서 마침내 답변 된 것 같습니다.

http://googlemaps.github.io/android-maps-utils/를 살펴보세요.

다음이 있습니다.

마커 클러스터링 — 많은 수의 포인트 표시를 처리합니다.

히트 맵 — 많은 수의 포인트를 히트 맵으로 표시

IconGenerator — 마커에 텍스트 표시 (스크린 샷 참조)

Markers made using the library

매우 중요한 것은 모든 스레드에서 수정할 수 있으므로 많은 마커를 쉽게 처리 할 수 있습니다.


I am not sure which you are trying to achieve: having the info window show up without the user have to tap on the marker, or using a completely different view for the info window (or perhaps both).

To show the info window without requiring a user tap:

I haven't tested this myself, but I'm guessing Marker.showInfoWindow() would do the trick (assuming the Marker's visibility is already true.

To provide a custom view for the InfoWindow

There are two options here and you should refer to the documentation on GoogleMap.InfoWindowAdapter:

public static interface GoogleMap.InfoWindowAdapter

Provides views for customized rendering of info-windows.

Methods on this provider are called when it is time to show an info window for a marker, regardless of the cause (either a user gesture or a programmatic call to showInfoWindow(). Since there is only one info window shown at any one time, this provider may choose to reuse views, or it may choose to create new views on each method invocation.

When constructing an info-window, methods in this class are called in a defined order. To replace the default info-window, override getInfoWindow(Marker) with your custom rendering. To replace just the info-window contents, inside the default info-window frame (the callout bubble), leave the default implementation of getInfoWindow(Marker) in place and override getInfoContents(Marker) instead.

Basically, whether you override getInfoWindow() or getInfoContents() will depend on whether or not you just wish to customize what you see inside the callout bubble, or whether you wish to customize the entire info window view, including an alternative to the callout bubble.

One caveat: I believe when you override these methods, it performs a simple rendering of what the view looks like at the time getInfoWindow() or getInfoContents() is called. I myself am interested in trying to replicate the look of the native Google Maps Android app which has a little "directions" icon next to the name of the place. One of the problems I believe (see here: https://stackoverflow.com/a/13713536/129475) is that if you have something like a button in your view, it may not behave like a button because of the static rendering.


Customize the marker image

You can replace the default marker image with a custom marker image, often called an icon. Custom icons are always set as a BitmapDescriptor, and defined using one of four methods in the BitmapDescriptorFactory class.

fromAsset(String assetName) Creates a custom marker using an image in the assets directory.

fromBitmap (Bitmap image) Creates a custom marker from a Bitmap image.

fromFile (String path) Creates a custom icon from a file at the specified path.

fromResource (int resourceId) Creates a custom marker using an existing resource. The below snippet creates a marker with a custom icon.

 private static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
 private Marker melbourne = mMap.addMarker(new MarkerOptions()
                        .position(MELBOURNE)
                        .title("Melbourne")
                        .snippet("Population: 4,137,400")
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));

This simple code works to display the title without requiring a click event:

googleMap.addMarker(new MarkerOptions()
        .position(latLng)
        .title(String title))
        .showInfoWindow();

Why don't you keep an array of the markers then when it comes to laoding the markers, iterate through them calling showInfoWindow(). May not be the most elegant solution but it does what you are saying I think.


Google has come out with the IconGenerator class which makes adding custom icon easy.

IconGenerator iconGenerator = new IconGenerator(mContext);
Bitmap bitmap = iconGenerator.makeIcon("Text Of Icon");
mMap.addMarker(new MarkerOptions()
                      .position(latlng)
                      .title("Location")
                      .icon(BitmapDescriptorFactory.fromBitmap(bitmap)));

I solved this problem by making my own markers with a picture editor which has the details below. It took some time to make, but it works.

I used Photoshop and 53x110px markers.

an example marker that I made

참고URL : https://stackoverflow.com/questions/13763545/android-maps-api-v2-with-custom-markers

반응형