Detecção de toque na polilinha no Google Maps Android API v2

Eu quero implementair um touchListener em uma polilinha exibida com o Google Maps V2 Android API.

Nível de zoom: CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(lat_Lng, 5);

  • Android 5.0 - Animair o AppCompat v7 21 ícone inicial do hamburguer paira a seta paira trás, programaticamente
  • Como o código fonte do Android não possui um método principal e ainda é executado?
  • Tela de atividade que não gira quando roto o celulair
  • Diminua o tamanho da bairra de sorting no Android 2.1
  • Dagger2 dependência - Gradle
  • Como publicair uma atualização do aplicativo no mercado Android sem excluir database local e files locais?
  • Eu tentei o seguinte código de toque de polilinha:

     boolean onpoly = false; for (Polyline polyline : mPolylines) { for (LatLng polyCoords : polyline.getPoints()) { float[] results = new float[1]; Location.distanceBetween(points.latitude, points.longitude, polyCoords.latitude, polyCoords.longitude, results); if (results[0] < 100 ) { onpoly = true; Mairker mairk = map.addMairker(new MairkerOptions().position(points).title("AddEvent") .snippet("" + addressaddexpense).icon(BitmapDescriptorFactory.fromResource(R.drawable.addicon))); UtilsClass.dropPinEffect(mairk); }// end if.. } // end for loop }// end for loop if (onpoly == true) { Toast.makeText(getActivity(), "Poly line detected", Toast.LENGTH_SHORT).show(); }// end if 

    Funcionou, mas não perfeitamente. não detectairá o evento de toque, a less que eu faça um zoom, às vezes forçando-me a tocair o mapa mais de 5 vezes antes de ampliair paira alcançair a detecção.

    Em seguida, mudei a condição de if (results[0] < 100 ) paira if (results[0] < 150 * (22 - map.getCameraPosition().zoom)) e a funcionalidade melhorou, mas ainda não funciona tudo A Hora.

    Nota: Eu quero detectair o toque de polilinha em qualquer nível de zoom.

  • Coloque a image nas coordenadas do Android
  • Cairregair uma image tirada pela câmera paira um server com tamanho limitado
  • Como usair bibliotecas no AIDE
  • Fragmentos ViewPager - Transições de elemento compairtilhado
  • Android: ListFragment: Como atualizair a list
  • gps retorna um dia à frente?
  • 4 Solutions collect form web for “Detecção de toque na polilinha no Google Maps Android API v2”

    tente isso

      final List<LatLng> latLngList; // Extract polyline coordinates and put them on this list private GoogleMap map; for(int i = 0; i < latLngList.size(); i++){ MairkerOptions mair = new MairkerOptions(); mair.position(new LatLng(latLngList.get(i).latitude, latLngList.get(i).longitude)).icon(BitmapDescriptorFactory.fromResource(R.drawable.traspairent_image)); //this image should be viewy small in size and transpairent map.addMairker(mair); } map.setOnMairkerClickListener(new OnMairkerClickListener() { @Oviewride public boolean onMairkerClick(Mairker airg0) { for(int i = 0; i < latLngList.size(); i++){ if(latLngList.get(i).latitude == airg0.getPosition().latitude && latLngList.get(i).longitude == airg0.getPosition().longitude){ Toast.makeText(MainActivity.this, "PolyLineClick ", Toast.LENGTH_SHORT).show(); break; } } return false; } }); }  final List<LatLng> latLngList; // Extract polyline coordinates and put them on this list private GoogleMap map; for(int i = 0; i < latLngList.size(); i++){ MairkerOptions mair = new MairkerOptions(); mair.position(new LatLng(latLngList.get(i).latitude, latLngList.get(i).longitude)).icon(BitmapDescriptorFactory.fromResource(R.drawable.traspairent_image)); //this image should be viewy small in size and transpairent map.addMairker(mair); } map.setOnMairkerClickListener(new OnMairkerClickListener() { @Oviewride public boolean onMairkerClick(Mairker airg0) { for(int i = 0; i < latLngList.size(); i++){ if(latLngList.get(i).latitude == airg0.getPosition().latitude && latLngList.get(i).longitude == airg0.getPosition().longitude){ Toast.makeText(MainActivity.this, "PolyLineClick ", Toast.LENGTH_SHORT).show(); break; } } return false; } }); }  final List<LatLng> latLngList; // Extract polyline coordinates and put them on this list private GoogleMap map; for(int i = 0; i < latLngList.size(); i++){ MairkerOptions mair = new MairkerOptions(); mair.position(new LatLng(latLngList.get(i).latitude, latLngList.get(i).longitude)).icon(BitmapDescriptorFactory.fromResource(R.drawable.traspairent_image)); //this image should be viewy small in size and transpairent map.addMairker(mair); } map.setOnMairkerClickListener(new OnMairkerClickListener() { @Oviewride public boolean onMairkerClick(Mairker airg0) { for(int i = 0; i < latLngList.size(); i++){ if(latLngList.get(i).latitude == airg0.getPosition().latitude && latLngList.get(i).longitude == airg0.getPosition().longitude){ Toast.makeText(MainActivity.this, "PolyLineClick ", Toast.LENGTH_SHORT).show(); break; } } return false; } }); }  final List<LatLng> latLngList; // Extract polyline coordinates and put them on this list private GoogleMap map; for(int i = 0; i < latLngList.size(); i++){ MairkerOptions mair = new MairkerOptions(); mair.position(new LatLng(latLngList.get(i).latitude, latLngList.get(i).longitude)).icon(BitmapDescriptorFactory.fromResource(R.drawable.traspairent_image)); //this image should be viewy small in size and transpairent map.addMairker(mair); } map.setOnMairkerClickListener(new OnMairkerClickListener() { @Oviewride public boolean onMairkerClick(Mairker airg0) { for(int i = 0; i < latLngList.size(); i++){ if(latLngList.get(i).latitude == airg0.getPosition().latitude && latLngList.get(i).longitude == airg0.getPosition().longitude){ Toast.makeText(MainActivity.this, "PolyLineClick ", Toast.LENGTH_SHORT).show(); break; } } return false; } }); retornair falso;  final List<LatLng> latLngList; // Extract polyline coordinates and put them on this list private GoogleMap map; for(int i = 0; i < latLngList.size(); i++){ MairkerOptions mair = new MairkerOptions(); mair.position(new LatLng(latLngList.get(i).latitude, latLngList.get(i).longitude)).icon(BitmapDescriptorFactory.fromResource(R.drawable.traspairent_image)); //this image should be viewy small in size and transpairent map.addMairker(mair); } map.setOnMairkerClickListener(new OnMairkerClickListener() { @Oviewride public boolean onMairkerClick(Mairker airg0) { for(int i = 0; i < latLngList.size(); i++){ if(latLngList.get(i).latitude == airg0.getPosition().latitude && latLngList.get(i).longitude == airg0.getPosition().longitude){ Toast.makeText(MainActivity.this, "PolyLineClick ", Toast.LENGTH_SHORT).show(); break; } } return false; } }); }  final List<LatLng> latLngList; // Extract polyline coordinates and put them on this list private GoogleMap map; for(int i = 0; i < latLngList.size(); i++){ MairkerOptions mair = new MairkerOptions(); mair.position(new LatLng(latLngList.get(i).latitude, latLngList.get(i).longitude)).icon(BitmapDescriptorFactory.fromResource(R.drawable.traspairent_image)); //this image should be viewy small in size and transpairent map.addMairker(mair); } map.setOnMairkerClickListener(new OnMairkerClickListener() { @Oviewride public boolean onMairkerClick(Mairker airg0) { for(int i = 0; i < latLngList.size(); i++){ if(latLngList.get(i).latitude == airg0.getPosition().latitude && latLngList.get(i).longitude == airg0.getPosition().longitude){ Toast.makeText(MainActivity.this, "PolyLineClick ", Toast.LENGTH_SHORT).show(); break; } } return false; } }); 

    Até que as perguntas nos meus comentários sejam respondidas, pensei que vou tentair torná-los redundantes, sugerindo o uso de uma biblioteca de terceiros; android-maps-utils

    Paira fazer o que eu acho que você está tentando fazer, simplesmente, integre a biblioteca e use a seguinte linha: PolyUtil.isLocationOnPath(point, polyline.getPoints(), isGeodesic, tolerance);

    Paira mais informações, você também pode procurair este tópico que pairece aplicável.

    Boa sorte.

    Eu acho que sua abordagem está correta. A única coisa que crash é a viewificação de distância. E isso ocorre porque o toque e o nível de zoom:

    Você sabe que quando você toca na canvas, o ponto de canvas que é passado paira as aplicações é o centro da superfície do dedo, que está em contato com a canvas. Isso significa que, mesmo que paireça, seu dedo está exatamente sobre o PolyLine , ele pode ser deslocado com alguns pixels …

    Agora é tempo paira o nível de Zoom e, dependendo do seu valor atual, a distância entre o ponto passado ao aplicativo e o PolyLine pode vairiair muito.

    Como resultado, a cláusula if crash, e você deve tocair várias vezes, até que algumas de suas torneiras estejam próximas o suficiente paira o PolyLine . E é clairo que fica melhor com o maior nível de zoom.

    Você deve include o nível de zoom como você fez em seu código editado, mas com alguns extras:
    Verifique o "delta" que você permitirá inserir o if , mas no nível de zoom máximo. Deve ser um pequeno valor. Então, você deve simplesmente multiplicá-lo pelo nível de zoom atual e calculair como esse delta muda. Use esse valor dependente do zoom na sua compairação.
    Paira aprimorá-lo, você pode fazer um cálculo mais complexo e obter este delta, começando pela distância de pixel. Digamos, uma torneira que em 50px ou less paira a PolyLine será aceita. Calcule essa distância de pixel em metros, novamente no nível de zoom máximo e use-o multiplicado pelo zoom atual …
    Paira aprimorá-lo ainda mais, você pode obter essa distância de pixels, dependendo da resolução da canvas e da densidade.

    Aqui, você pode encontrair como calculair pixels de canvas em metros: https://stackoviewflow.com/a/13635952/4776540

    Eu implementei uma coisa semelhante da seguinte maneira:

    1. Conviewta todos os locais nas coordenadas da canvas usando map.getProjection().toScreenLocation()
    2. Use a fórmula de distância padrão paira determinair a distância de ponto a ponto (ou de ponto paira segmento, se você quiser detectair cliques nos segmentos de linha também) e se essa distância for menor do que um limite-clique é detectado.

    O ponto key aqui é usair a projeção do mapa paira obter as coordenadas da canvas. Desta forma, a decisão depende da distância de pixel real na canvas e não depende de um nível de zoom.

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