2010-04-22 13 views
2

après un peu de travail ma demande d'itinéraire fonctionne très bien :) La seule chose que je veux juste ajouter est un zoom double tap en fonction, mais je ne sais pas comment ...Double-touche -> Zoom sur Android MapView?

pourriez-vous me donner un soupçon?

salutations belles, poeschlorn

Répondre

1

Un ancien poste, je sais, mais cette solution fonctionne aussi: double click/tap map zoom (Android)

Je pense qu'il a corrigé ses erreurs dans son propre post, donc il suffit d'utiliser la partie de la question, pas les réponses (ils sont horribles :))

5

J'ai également été la recherche d'une réponse/exemple, mais trouvé nulle part le code de travail.

Enfin, voici le code qui fonctionne pour moi:

MyMapActivity.java

public class MyMapActivity extends MapActivity 
          implements OnGestureListener, OnDoubleTapListener { 

private MapView mapView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mapView = (MapView)findViewById(R.id.mapView); 
} 

@Override 
public boolean onDoubleTap(MotionEvent e) { 
    int x = (int)e.getX(), y = (int)e.getY();; 
    Projection p = mapView.getProjection(); 
    mapView.getController().animateTo(p.fromPixels(x, y)); 
    mapView.getController().zoomIn(); 
    return true; 
} 

// Here will be some autogenerated methods too 

OnDoubleTap.java

public class OnDoubleTap extends MapView { 

    private long lastTouchTime = -1; 

    public OnDoubleTap(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
    if (ev.getAction() == MotionEvent.ACTION_DOWN) { 
     long thisTime = System.currentTimeMillis(); 
     if (thisTime - lastTouchTime < ViewConfiguration.getDoubleTapTimeout()) { 
     // Double tap 
     this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY()); 
     lastTouchTime = -1; 
     } else { 
     // Too slow 
     lastTouchTime = thisTime; 
     } 
    } 
    return super.onInterceptTouchEvent(ev); 
    } 
} 

main.xml

N'oubliez pas de remplacer ici la valeur android:apiKey par votre apiKey

N'oubliez pas de remplacer ici la valeur android:apiKey par votre apiKey.

+0

La source du gestionnaire 'onInterceptTouchEvent' semble être [ce blog] (http://nocivus.posterous.com/double-clicktap-detection-on-a). J'ai amélioré le code d'Andrianik en définissant 'ViewConfiguration.getDoubleTapTimeout()'. – JJD

0

Utilisez le code suivant lorsque vous souhaitez zoomer et effectuer un zoom arrière

  1. zoom en double-cliquez sur 50% des MapView
  2. Zoom arrière double-cliquez sur fond 50% des MapView

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    if (ev.getAction() == MotionEvent.ACTION_DOWN) { 
     long thisTime = System.currentTimeMillis(); 

DisplayMetrics metrics = new DisplayMetrics(); 
WindowManager wm = (WindowManager) activity.getSystemService(activity.getApplicationContext().WINDOW_SERVICE); 
wm.getDefaultDisplay().getMetrics(metrics); 
int height = metrics.heightPixels; 

if (thisTime - lastTouchTime < ViewConfiguration.getDoubleTapTimeout()) { 
     // Double tap 
     if((height/2)>ev.getY()){ 
// Zoom IN 
      this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY()); 
     }else{ 
      this.getController().zoomOutFixing((int) ev.getX(), (int) ev.getY()); 
//Zoom Out 
     } 
     lastTouchTime = -1; 
     } else { 
     // Too slow 
     lastTouchTime = thisTime; 
     } 
    } 
    return super.onInterceptTouchEvent(ev); 
    } 
0

en cas où quelqu'un cherche la réponse à la nouvelle GoogleMap (Étant donné que Google-Pl ay-service: 9+)

case MotionEvent.ACTION_DOWN: 
       x1 = m.getX(); 
       if ((System.currentTimeMillis() - systemTime) < 200) { 
        mGoogleMap.animateCamera(CameraUpdateFactory.zoomIn()); 
       } 
       systemTime = System.currentTimeMillis(); 
       break; 
case MotionEvent.ACTION_UP: 
       systemTime = System.currentTimeMillis(); 
       ... 
       break;