try this:

import java.util.Timer;
import java.util.TimerTask;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;



public class MyLongpressMapView extends MapView {

   public interface OnLongpressListener {

      public void onLongpress(MapView view, GeoPoint longpressLocation);
   }


   /**
    * Time in ms before the OnLongpressListener is triggered.
    */
   static final int                               LONGPRESS_THRESHOLD = 500;

   /**
    * Keep a record of the center of the map, to know if the map
    * has been panned.
    */
   private GeoPoint                               lastMapCenter;

   private Timer                                  longpressTimer      =
new Timer();

   private MyLongpressMapView.OnLongpressListener longpressListener;

   private float                                  offset;


   public MyLongpressMapView(Context context, String apiKey) {

      super(context, apiKey);
   }

   public MyLongpressMapView(Context context, AttributeSet attrs) {

      super(context, attrs);

      this.offset =
context.getResources().getDimension(R.dimen.tabbar_height);
   }

   public MyLongpressMapView(Context context, AttributeSet attrs, int
defStyle) {

      super(context, attrs, defStyle);
   }

   public void
setOnLongpressListener(MyLongpressMapView.OnLongpressListener listener) {

      this.longpressListener = listener;
   }

   /**
    * This method is called every time user touches the map,
    * drags a finger on the map, or removes finger from the map.
    */
   @Override
   public boolean onTouchEvent(MotionEvent event) {

      handleLongpress(event);

      return super.onTouchEvent(event);
   }

   /**
    * This method takes MotionEvents and decides whether or not
    * a longpress has been detected. This is the meat of the
    * OnLongpressListener.
    * The Timer class executes a TimerTask after a given time,
    * and we start the timer when a finger touches the screen.
    * We then listen for map movements or the finger being
    * removed from the screen. If any of these events occur
    * before the TimerTask is executed, it gets cancelled. Else
    * the listener is fired.
    *
    * @param event
    */
   private void handleLongpress(final MotionEvent event) {

      if (event.getAction() == MotionEvent.ACTION_DOWN) {

         this.longpressTimer = new Timer();
         this.longpressTimer.schedule(new TimerTask() {

            @Override
            public void run() {

               final GeoPoint longpressLocation = getProjection()
                        .fromPixels((int) event.getX(), (int)
(event.getY() - MyLongpressMapView.this.offset));

               if (MyLongpressMapView.this.longpressListener != null) {

MyLongpressMapView.this.longpressListener.onLongpress(MyLongpressMapView.this,
longpressLocation);
               }
            }

         },
                                      LONGPRESS_THRESHOLD);

         this.lastMapCenter = getMapCenter();
      }

      if (event.getAction() == MotionEvent.ACTION_MOVE) {

         if (!getMapCenter().equals(this.lastMapCenter)) {

            this.longpressTimer.cancel();
         }

         this.lastMapCenter = getMapCenter();
      }

      if (event.getAction() == MotionEvent.ACTION_UP) {

         this.longpressTimer.cancel();
      }

      if (event.getPointerCount() > 1) {

         this.longpressTimer.cancel();
      }
   }
}

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to