2011-05-10 5 views
3

Je dois limiter la zone que mes utilisateurs peuvent naviguer dans la carte (sauf s'ils auront un écran vide!). J'ai créé une classe qui étend la mapview et remplace l'onTouchEvent. Je suis en train de détecter l'action "ACTION_UP" et de vérifier les coordonnées ici et de repositionner la carte si je le dois. Tout fonctionne bien jusqu'à ce que l'utilisateur "lance" la carte. Je peux détecter le «Haut» et les coordonnées de l'écran à ce moment-là, mais la carte est toujours en mouvement, donc les coordonnées que je détecte ne sont pas les bonnes.Android Get Mapview sur Fling cessé d'animer

J'ai besoin de connaître la position de l'écran lorsqu'il est arrêté de bouger!

@Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     if (ev.getAction() == MotionEvent.ACTION_UP) { 
//get coords of screen corners and calculate if the map is still in view. 
} 

Je suis à la recherche d'une bonne quantité de temps pour la réponse à cela, mais beaucoup de gens se posent la question, mais il ne semble pas être des solutions autour?

Est-ce que quelqu'un a réussi à le faire?

Bex

+0

Oui, malheureusement la norme 'GestureDetector' fournit des informations sur le moment où une aventure commence mais pas quand ça finit. Je vais jeter un coup d'oeil et voir si la fin d'une aventure peut être facilement détectée. Vous pouvez surcharger 'onFling' et simplement désactiver le flinging en retournant' false' à partir de là. De même, il serait préférable de vérifier la position de la carte lorsqu'un événement ACTION_MOVE survient, plutôt que l'événement up ou que la carte reviendra à sa position si vous vous déplacez trop loin lorsque vous levez votre doigt. –

+0

@Joseph Merci pour votre commentaire! Si vous pouviez voir s'il est possible d'obtenir la fin de l'aventure, ce serait génial! A défaut de désactivation sur fling pourrait être la meilleure option! – Bex

+0

J'ai ajouté l'écouteur Gesture .. mais l'événement On Fling ne se déclenche pas! – Bex

Répondre

0

-je utiliser pour remplacer le computeScroll() de la MapView:

/** 
* checks restriction on pan bounds and locks the map. if the map is locked 
* (via mapController.getCenter()) this method returns true 
* 
* @return TRUE if map has been locked 
*/ 
private boolean restrictPanOnBounds() { 
    if (this.minLatitudeE6 == Integer.MIN_VALUE) 
    return false; 

    GeoPoint center = getMapCenter(); 
    int cLat = center.getLatitudeE6(); 
    int cLong = center.getLongitudeE6(); 

    Integer nLat = null, nLong = null; 

    if (cLat < this.minLatitudeE6) 
    nLat = this.minLatitudeE6; 
    else if (cLat > this.maxLatitudeE6) 
    nLat = this.maxLatitudeE6; 

    if (cLong < this.minLongitudeE6) 
    nLong = this.minLongitudeE6; 
    else if (cLong > this.maxLongitudeE6) 
    nLong = this.maxLongitudeE6; 

    if (nLat != null || nLong != null) { 
    getController().setCenter(new GeoPoint(nLat != null ? nLat : cLat, nLong != null ? nLong : cLong)); 
    return true; 
    } else { 
    return false; 
    } 
} 

@Override 
public void computeScroll() { 
    if (restrictPanOnBounds()) 
    getController().stopPanning(); 
    else 
    super.computeScroll(); 
} 

cela fonctionne très bien pour les actions de mouvement simples (la carte des arrêts a ne revient pas sauter) mais il a encore un effet d'inclinaison "drôle" en lançant ...

0

J'ai eu le même problème. Votre approche est bonne, juste besoin d'attraper l'événement sur un autre endroit. Vous pouvez remplacer la méthode de classe MapView (ou adopter une approche similaire en utilisant MapFragment) « DispatchTouchEvent », et vous faire sauter événement MotionEvent.ACTION_UP:

if (ev.getAction() == MotionEvent.ACTION_UP) { 
    return false; 
}