Wednesday, January 30, 2013

Move Google Maps V2 with auto best zoom

We can build LatLngBounds object including certain points, and move GoogleMap to the bounds with auto estimated best zoom.

Move Google Maps V2 with auto best zoom


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.MapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds;
import com.google.android.gms.maps.model.MarkerOptions;

import android.os.Build;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.FragmentManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.Toast;

public class MainActivity extends Activity {
 
 private static final LatLng Leicester_Square = new LatLng(51.510278, -0.130278);
 private static final LatLng Covent_Garden = new LatLng(51.51197, -0.1228);
 private static final LatLng Piccadilly_Circus = new LatLng(51.51, -0.134444);
 private static final LatLng Embankment = new LatLng(51.507, -0.122);
 private static final LatLng Charing_Cross = new LatLng(51.5073, -0.12755);
 
 final int RQS_GooglePlayServices = 1;
 MapFragment myMapFragment;
 GoogleMap myMap;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  FragmentManager myFragmentManager = getFragmentManager();
  MapFragment myMapFragment = 
    (MapFragment)myFragmentManager.findFragmentById(R.id.map);
  myMap = myMapFragment.getMap();
  myMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
  
  myMap.addMarker(new MarkerOptions().position(Leicester_Square).title("Leicester Square"));
  myMap.addMarker(new MarkerOptions().position(Covent_Garden).title("Covent Garden"));
  myMap.addMarker(new MarkerOptions().position(Piccadilly_Circus).title("Piccadilly Circus"));
  myMap.addMarker(new MarkerOptions().position(Embankment).title("Embankment"));
  myMap.addMarker(new MarkerOptions().position(Charing_Cross).title("Charing Cross"));
  
        final View mapView = getFragmentManager().findFragmentById(R.id.map).getView();
        if (mapView.getViewTreeObserver().isAlive()) {
            mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
                @SuppressLint("NewApi") // We check which build version we are using.
                @Override
                public void onGlobalLayout() {
                 LatLngBounds bounds = new LatLngBounds.Builder()
                 .include(Leicester_Square)
                 .include(Covent_Garden)
                 .include(Piccadilly_Circus)
                 .include(Embankment)
                 .include(Charing_Cross)
                 .build();
                 
                 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                  mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
                 } else {
                  mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
                 }
                 myMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50));
                }});    
        }

 }

 @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() {
  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); 
  }
 }

}


download filesDownload the files.

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

1 comment:

Deric Matabi said...

Thanks Alot for he Tutorial , it really Maded my Day after searching all over the Internet the previous day and all i gone was crushing my App . Thanks alot