Thursday, January 3, 2013

Google Maps Android API v2 example: detect MarkerClick and add Polyline

Further work on last exercise to "detect long click on map and add marker", add function to detect MarkerClick event on GoogleMap, and add Polyline.

detect MarkerClick and add Polyline


package com.example.androidmapsv2;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener;
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
import com.google.android.gms.maps.MapFragment;
//import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.FragmentManager;
import android.graphics.Color;
import android.location.Location;
import android.os.Bundle;
//import android.support.v4.app.FragmentActivity;
//import android.support.v4.app.FragmentManager;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity 
 implements OnMapClickListener, OnMapLongClickListener, OnMarkerClickListener{
 
 final int RQS_GooglePlayServices = 1;
 private GoogleMap myMap;
 
 Location myLocation;
 TextView tvLocInfo;
 
 boolean markerClicked;
 PolylineOptions rectOptions;
 Polyline polyline;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  tvLocInfo = (TextView)findViewById(R.id.locinfo);
  
  FragmentManager myFragmentManager = getFragmentManager();
  MapFragment myMapFragment 
   = (MapFragment)myFragmentManager.findFragmentById(R.id.map);
  myMap = myMapFragment.getMap();
  
  myMap.setMyLocationEnabled(true);
  
  myMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
  
  myMap.setOnMapClickListener(this);
  myMap.setOnMapLongClickListener(this);
  myMap.setOnMarkerClickListener(this);

  markerClicked = false;
 }
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
     case R.id.menu_legalnotices:
      String LicenseInfo = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(
        getApplicationContext());
      AlertDialog.Builder LicenseDialog = new AlertDialog.Builder(MainActivity.this);
      LicenseDialog.setTitle("Legal Notices");
      LicenseDialog.setMessage(LicenseInfo);
      LicenseDialog.show();
         return true;
     }
  return super.onOptionsItemSelected(item);
 }

 @Override
 protected void onResume() {
  // TODO Auto-generated method stub
  super.onResume();

  int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
  
  if (resultCode == ConnectionResult.SUCCESS){
   Toast.makeText(getApplicationContext(), 
     "isGooglePlayServicesAvailable SUCCESS", 
     Toast.LENGTH_LONG).show();
  }else{
   GooglePlayServicesUtil.getErrorDialog(resultCode, this, RQS_GooglePlayServices);
  }
  
 }

 @Override
 public void onMapClick(LatLng point) {
  tvLocInfo.setText(point.toString());
  myMap.animateCamera(CameraUpdateFactory.newLatLng(point));
  
  markerClicked = false;
 }

 @Override
 public void onMapLongClick(LatLng point) {
  tvLocInfo.setText("New marker added@" + point.toString());
  myMap.addMarker(new MarkerOptions().position(point).title(point.toString()));
  
  markerClicked = false;
 }

 @Override
 public boolean onMarkerClick(Marker marker) {
  
  if(markerClicked){
   
   if(polyline != null){
    polyline.remove();
    polyline = null;
   }
   
   rectOptions.add(marker.getPosition());
   rectOptions.color(Color.RED);
   polyline = myMap.addPolyline(rectOptions);
  }else{
   if(polyline != null){
    polyline.remove();
    polyline = null;
   }
   
   rectOptions = new PolylineOptions().add(marker.getPosition());
   markerClicked = true;
  }
  
  return true;
 }

}



download filesDownload the files.

Next:
- Draw Polygon on GoogleMap


The series:
A simple example using Google Maps Android API v2, step by step.

6 comments:

Basribaz said...

how to create polyline from my location to other marker in maps? thanks

Erik said...

hello Basribaz,

Please read Draw Polyline from touched location to MyLocation.

Unknown said...

Hi, how do I create the path between two points and not a straight line?

Unknown said...

How to display current location of marker whenever clicked on google map?

Unknown said...

hi buddy...

I have a question how to draw a line on map while the device is moving?

Like some taxi apps or travel agencies do to track their vehicle...


i have done drawing line between source to destination... but i need like that while moving there should draw a path...
please help me

Unknown said...

how to create polyline while moving device? thanks