Wednesday 20 November 2013

Move the marker on MapView with Zoom Control Seekbar

Move the marker on MapView with Zoom Control Seekbar

In the last exercise, Move the marker on MapView, user touch on screen to pan the Map and update marker. It's very confuse with the BuiltInZoomControls function. So I separate the zoom function outside the MapView in this exercise. It's a SeekBar under the MapView, user can change the zoom level by sliding on the SeekBar.



It involve modification on mymapview.xml and AndroidMapView.java.

mymapview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    > 
    <LinearLayout
     android:orientation="horizontal"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     >
     <LinearLayout 
     android:orientation="vertical"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     >
      <CheckBox
       android:id="@+id/satellite"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text=" Satellite "
      />
  </LinearLayout>
  <LinearLayout 
     android:orientation="vertical"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     >
      <TextView
       android:id="@+id/longitude"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="Longitude:"
   />
   <TextView
    android:id="@+id/latitude"
    android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="Latitude:"
   />
  </LinearLayout>
 </LinearLayout>
 <com.google.android.maps.MapView
  android:id="@+id/mapview"
  android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:layout_weight="1"
     android:clickable="true"
  android:apiKey="0pkoAyp5YM52XRlxoRPJeJbP0Tp69yYlrRO7lJg"
 />
 <SeekBar
   android:id="@+id/zoombar"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:max="20"
    android:progress="0"/>
</LinearLayout>


AndroidMapView.java
package com.AndroidMapper;

import java.util.ArrayList;
import java.util.List;

import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.CheckBox;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;
import com.google.android.maps.Projection;

public class AndroidMapView extends MapActivity {

  private TextView myLongitude, myLatitude;
  private CheckBox mySatellite;
  
  private MapView myMapView;
  private MapController myMapController;
  
  private SeekBar myZoomBar;
 
  private void SetSatellite()
  {
   myMapView.setSatellite(mySatellite.isChecked());
  };
  
 @Override
 protected void onCreate(Bundle icicle) {
  // TODO Auto-generated method stub
  super.onCreate(icicle);
  setContentView(R.layout.mymapview);
  
  Bundle bundle = this.getIntent().getExtras();
        int Mode = bundle.getInt("Mode");
  
  myMapView = (MapView)findViewById(R.id.mapview);
  myMapController = myMapView.getController();  
  myMapView.setBuiltInZoomControls(false);
  
  myLongitude = (TextView)findViewById(R.id.longitude);
  myLatitude = (TextView)findViewById(R.id.latitude);
  mySatellite = (CheckBox)findViewById(R.id.satellite);
  mySatellite.setOnClickListener(mySatelliteOnClickListener);
  
  myZoomBar = (SeekBar)findViewById(R.id.zoombar);
  SetZoomLevel();
  myZoomBar.setOnSeekBarChangeListener(myZoomBarOnSeekBarChangeListener);
  
  SetSatellite();
  
  if(Mode == 0)
  {
   GeoPoint initGeoPoint = myMapView.getMapCenter();
   CenterLocation(initGeoPoint);
  }
  else if(Mode == 1)
  {
   int intLatitude = bundle.getInt("Latitude");
   int intLongitude = bundle.getInt("Longitude");
   GeoPoint initGeoPoint = new GeoPoint(intLatitude, intLongitude);
   CenterLocation(initGeoPoint);
  }
 }
 
 private SeekBar.OnSeekBarChangeListener myZoomBarOnSeekBarChangeListener =
   new SeekBar.OnSeekBarChangeListener(){

    public void onProgressChanged(SeekBar seekBar, int progress,
      boolean fromUser) {
     // TODO Auto-generated method stub
     SetZoomLevel();
    }

    public void onStartTrackingTouch(SeekBar seekBar) {
     // TODO Auto-generated method stub
    
    }

    public void onStopTrackingTouch(SeekBar seekBar) {
     // TODO Auto-generated method stub
    
    }
 };
 
 private void SetZoomLevel()
 {
  int myZoomLevel = myZoomBar.getProgress()+1;
  myMapController.setZoom(myZoomLevel);
  Toast.makeText(this,
   "Zoom Level : " + String.valueOf(myZoomLevel),
   Toast.LENGTH_LONG).show();
 };
 
 private void placeMarker(int markerLatitude, int markerLongitude)
 {
  Drawable marker=getResources().getDrawable(
    android.R.drawable.ic_menu_myplaces);
  marker.setBounds(0, 0, marker.getIntrinsicWidth(), 
    marker.getIntrinsicHeight());
  myMapView.getOverlays().add(new InterestingLocations(marker, 
    markerLatitude, markerLongitude));
 }

 @Override
 protected boolean isRouteDisplayed() {
  // TODO Auto-generated method stub
  return false;
 }
 
 private void CenterLocation(GeoPoint centerGeoPoint)
 {
  myMapController.animateTo(centerGeoPoint);

  myLongitude.setText("Longitude: "+
   String.valueOf((float)centerGeoPoint.getLongitudeE6()/1000000));
  myLatitude.setText("Latitude: "+
   String.valueOf((float)centerGeoPoint.getLatitudeE6()/1000000));
  placeMarker(centerGeoPoint.getLatitudeE6(), 
    centerGeoPoint.getLongitudeE6());
 };
 
 private CheckBox.OnClickListener mySatelliteOnClickListener =
    new CheckBox.OnClickListener(){

     public void onClick(View v) {
      // TODO Auto-generated method stub
      SetSatellite();
     }
 };
 
 class InterestingLocations extends ItemizedOverlay<OverlayItem>{
  
  private List<OverlayItem> locations = 
   new ArrayList<OverlayItem>();
  private Drawable marker;
  private OverlayItem myOverlayItem;
  
  boolean MoveMap;

  public InterestingLocations(Drawable defaultMarker, 
    int LatitudeE6, int LongitudeE6) {
   super(defaultMarker);
   // TODO Auto-generated constructor stub
   this.marker=defaultMarker;
   // create locations of interest
   GeoPoint myPlace = new GeoPoint(LatitudeE6,LongitudeE6);
   myOverlayItem = new OverlayItem(myPlace, "My Place", "My Place");
   locations.add(myOverlayItem);
   
   populate();
  }

  @Override
  protected OverlayItem createItem(int i) {
   // TODO Auto-generated method stub
   return locations.get(i);
  }

  @Override
  public int size() {
   // TODO Auto-generated method stub
   return locations.size();
  }

  @Override
  public void draw(Canvas canvas, MapView mapView, 
    boolean shadow) {
   // TODO Auto-generated method stub
   super.draw(canvas, mapView, shadow);
   
   boundCenterBottom(marker);
  }

  @Override
  public boolean onTouchEvent(MotionEvent arg0, MapView arg1) {
   // TODO Auto-generated method stub
   //super.onTouchEvent(arg0, arg1);
   
   
   
   int Action = arg0.getAction();
   if (Action == MotionEvent.ACTION_UP){
 
    if(!MoveMap)
    {
     Projection proj = myMapView.getProjection(); 
     GeoPoint loc = proj.fromPixels((int)arg0.getX(), (int)arg0.getY());
                
     //remove the last marker
     myMapView.getOverlays().remove(0);
                
     CenterLocation(loc);
    }
    
   }
   else if (Action == MotionEvent.ACTION_DOWN){
    
    MoveMap = false;

   }
   else if (Action == MotionEvent.ACTION_MOVE){    
    MoveMap = true;
   }

   return super.onTouchEvent(arg0, arg1);
   //return false;
  }
 }
}

No comments:

Post a Comment