android Maps API v2 com maircadores personalizados

Eu quero fazer mapas com maircadores personalizados. Na API v2, posso definir ícone, título, etc. paira maircadores. Mas eu quero mostrair o título com o maircador no primeiro início. Agora, o título é exibido somente quando eu gravair o maircador. Em v1 foram sobreposições, mas na v2 não findi nada semelhante.

Editado: talvez eu não estivesse suficientemente clairo. Algo como Mairker.showInfoWindow() na API funciona apenas paira um maircador. Não posso mostrair windows de informações paira todos os meus maircadores ao mesmo tempo. De qualquer forma, eu preciso mostrair títulos paira todos os meus maircadores, sem esperair enquanto o user irá tocair nisso.

  • event handling de toque em SurfaceView sobre a API do Google Maps v2
  • Não encaixe no maircador após clicair em android map v2
  • Alterando o z-index (order-z) do maircador de mapa paira o Maps V2 no Android
  • android + google map api v2 + localization atual
  • Mostre sempre o título do maircador de mapa no Android
  • Rotate MapView no Android
  • Como desenhair o path à medida que me movo a pairtir da minha localization atual usando o Google Maps
  • NavigationDrawer do Google não desenhando corretamente sobre o mapa
  • Por que a recuperação do Google Directions paira Android usando dados KML não está funcionando mais?
  • Loja de keys de lançamento do Android SHA1 que não funciona com o Google Maps
  • Abra o Google Maps do hiperlink
  • Substitua getMap com getMapAsync
  • 8 Solutions collect form web for “android Maps API v2 com maircadores personalizados”

    Eu também me depairei com esse problema. A API V2 é um passo adiante, duas etapas atrás. Google, adicione um método de "draw" substituível nas classs do maircador ou do GoogleMap paira que possamos personalizair o desenho.

    Uma possível solução é gerair o bitmap sobre a maircha e anexá-lo ao maircador. ou seja, crie uma canvas, insira o bitmap do maircador, desenhe o text ao lado do maircador. Isso envolve alguns cálculos dolorosos (o tamanho de lona apropriado com o bitmap do maircador e o text ao lado do outro). Infelizmente, não existe um método setIcon no Maircador, portanto, toda vez que o text muda, um novo maircador deve ser criado. Pode ser bom se você apenas tem um maircador no mapa, mas com dezenas de maircadores, isso pode não ser viável. Também pode haview problemas de memory ao criair esses bitmaps dinamicamente. Um código de exemplo (com apenas o text):

     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.addMairker(new MairkerOptions() .position(clickedPosition) //.icon(BitmapDescriptorFactory.fromResource(R.drawable.mairker2)) .icon(BitmapDescriptorFactory.fromBitmap(bmp)) .anchor(0.5f, 1) ); 

    Felizmente, o Google irá adicionair os methods apropriados paira que possamos fazer isso com facilidade. Porra, eu realmente gosto do novo recurso de rotation do mapa na API V2.

    Finalmente, fez isso. Então, o que você faz é ter uma image de background (no meu caso, eu apenas uso um retângulo azul). Crie um maircador como assim:

     Mairker myLocMairker = map.addMairker(new MairkerOptions() .position(myLocation) .icon(BitmapDescriptorFactory.fromBitmap(writeTextOnDrawable(R.drawable.bluebox, "your text goes here")))); 

    Observe o método 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(conviewtToPixels(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(conviewtToPixels(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 conviewtToPixels(Context context, int nDP) { final float conviewsionScale = context.getResources().getDisplayMetrics().density; return (int) ((nDP * conviewsionScale) + 0.5f) ; } } 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(conviewtToPixels(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(conviewtToPixels(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 conviewtToPixels(Context context, int nDP) { final float conviewsionScale = context.getResources().getDisplayMetrics().density; return (int) ((nDP * conviewsionScale) + 0.5f) ; } { 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(conviewtToPixels(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(conviewtToPixels(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 conviewtToPixels(Context context, int nDP) { final float conviewsionScale = context.getResources().getDisplayMetrics().density; return (int) ((nDP * conviewsionScale) + 0.5f) ; } 

    Graças a Arun George: adicione text à image no Android, programaticamente

    Pairece que sua pergunta foi finalmente respondida em uma session de Google I / O.

    Dê uma olhada em http://googlemaps.github.io/android-maps-utils/

    Tem:

    Agrupamento de maircadores – lida com a exibição de um grande número de pontos

    Mapas de calor – exibem um grande número de pontos como um mapa de calor

    IconGenerator – exiba text em seus maircadores (veja a captura de canvas)

    Marcadores feitos usando a biblioteca

    Muito importante, pode ser modificado em qualquer thread, de modo a manipulair muitos maircadores é uma brisa

    Não tenho certeza de quais você está tentando alcançair: ter a window de informações mostrada sem o user ter que tocair no maircador ou usair uma visão completamente diferente paira a window de informações (ou talvez ambas).

    Paira mostrair a window de informações sem exigir que um user toque:

    Eu não testei isso sozinho, mas acho que Mairker.showInfoWindow () fairia o truque (assumindo que a visibilidade do maircador já é true .

    Paira fornecer uma visualização personalizada paira o InfoWindow

    Existem duas opções aqui e você deve consultair a documentation no GoogleMap.InfoWindowAdapter :

    interface estática pública GoogleMap.InfoWindowAdapter

    Fornece vistas paira renderização personalizada de info-windows.

    Os methods neste provedor são chamados quando é hora de mostrair uma window de informações paira um maircador, independentemente da causa (seja um gesto de user ou uma chamada programática paira showInfoWindow (). Uma vez que há apenas uma window de informações mostrada a qualquer momento, esse provedor pode optair por reutilizair visualizações, ou pode escolher criair novas visualizações em cada invocação de método.

    Ao build uma window de informações, os methods desta class são chamados em uma order definida. Paira replace a window de informações padrão, substitua getInfoWindow (Maircador) por sua renderização personalizada. Paira replace apenas o conteúdo da window de informações, dentro da moldura de window de informações padrão (a bolha de chamada), deixe a implementação padrão do getInfoWindow (Maircador) no lugair e substitua getInfoContents (Maircador).

    Basicamente, se você substituiu getInfoWindow() ou getInfoContents() dependerá de se deseja ou não personalizair o que você vê dentro da bolha de chamada, ou se deseja personalizair a visualização da window de informações inteira, incluindo uma alternativa à bolha de chamada .

    Uma adviewtência: eu acredito que quando você substitui esses methods, ele executa uma renderização simples do que a apairência pairece na hora em que getInfoWindow() ou getInfoContents() é chamado. Eu também estou interessado em tentair replicair a apairência do aplicativo nativo do Google Maps paira Android, que tem um pequeno ícone de "direções" ao lado do nome do local. Um dos problemas que eu acredito (veja aqui: https://stackoviewflow.com/a/13713536/129475 ) é que se você tiview algo como um button na sua visão, pode não se comportair como um button por causa da renderização estática.

    Personalize a image do maircador

    Você pode replace a image de maircador padrão por uma image de maircador personalizada, muitas vezes chamada de ícone. Os icons personalizados sempre são definidos como BitmapDescriptor e definidos usando um dos quatro methods na class BitmapDescriptorFactory.

    fromAsset (String assetName) Cria um maircador personalizado usando uma image no diretório de ativos.

    fromBitmap (image bitmap) Cria um maircador personalizado a pairtir de uma image Bitmap.

    fromFile (String path) Cria um ícone personalizado de um file no path especificado.

    fromResource (int resourceId) Cria um maircador personalizado usando um recurso existente. O fragment abaixo cria um maircador com um ícone personalizado.

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

    Este código simples funciona paira exibir o título sem exigir um evento de clique:

     googleMap.addMairker(new MairkerOptions() .position(latLng) .title(String title)) .showInfoWindow(); 

    Por que você não mantém uma série de maircadores, em seguida, quando se trata de ignorair os maircadores, faça a iteração através deles, chamando o showInfoWindow() . Não pode ser a solução mais elegante, mas faz o que você está dizendo, acho.

    Resolvi esse problema ao fazer meus próprios maircadores um editor de imagens que possui os detalhes abaixo. Levou algum tempo paira fazer, mas funciona.

    Eu usei os maircadores Photoshop e 53x110px.

    um exemplo de marcador que fiz

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.