2012-07-06 5 views
0

J'ai une application qui utilise google map. J'ai aussi des superpositions sur la carte.Google Maps avec des superpositions

public class OverLayClass extends ItemizedOverlay<OverlayItem> 
{ 
    private Drawable marker = null; 
    private OverlayItem inDrag = null; 
    private ImageView dragImage =null; 
    private int xDragImageOffset, yDragImageOffset, xDragTouchOffset, yDragTouchOffset; 

    public OverLayClass(Drawable marker) 
    { 
     super(boundCenterBottom(marker)); 
     this.marker = marker; 
     overlayItems = new ArrayList<OverlayItem>(); 

     // image to show when you drag pointer on screen to other location 
     dragImage = (ImageView)findViewById(R.id.drag_image); 

//   if(dragImage != null && dragImage.getDrawable() != null) 
     { 
      xDragImageOffset =  getResources().getDrawable(R.drawable.map_icon_corn).getIntrinsicWidth()/2; 
      yDragImageOffset =  getResources().getDrawable(R.drawable.map_icon_corn).getIntrinsicHeight(); 
     } 
     populate(); 
    } 

J'ai implémenté tous les recouvrements utilisant cette classe. Je montre également l'emplacement actuel de l'utilisateur en utilisant la même classe de superposition.

Le OnTouch pour cette classe de recouvrement est:

public boolean onTouchEvent(MotionEvent motionEvent, MapView mapView) 
    { 
     //System.out.println(" --- inside onTouchEvent --- "+dontAddtap); 
      final int x = (int)motionEvent.getX(); 
      final int y = (int)motionEvent.getY(); 
      boolean result = false; 

     // TODO Auto-generated method stub 
//    if(dontAddtap) 
      { 
       if(motionEvent.getAction() == MotionEvent.ACTION_DOWN && !isActionDown) 
       { 
        //System.out.println(" ------ on key down ------ geo point "+pt1); 
        if(!isTap) 
        { 
         for(OverlayItem item : overlayItems) 
         { 
          Point p = new Point(); 

           mapView.getProjection().toPixels(item.getPoint(), p); 
           item.setMarker(marker); 
           boolean isHit = hitTest(item, marker, x - p.x, y - p.y); 
           //System.out.println(" --- isHit in MotionEvent.ACTION_DOWN --- "+isHit); 
           if(isHit) 
           { 
            isItemHit = true; 
            //System.out.println(" --- item hit ---- "); 

            result = true; 
            inDrag = item; 

            overlayItems.remove(inDrag); 
            gotGeoPoint = item.getPoint(); 
            //System.out.println(" -------- imporntent--item--otuched point -------- "+item.getPoint()); 
            populate(); 

            xDragTouchOffset = 0; 
            yDragTouchOffset = 0; 

            setDragImagePosition(p.x, p.y); 
            dragImage.setVisibility(View.VISIBLE); 
            // Point p11=new Point(p.x, p.y); 
            xDragTouchOffset = x - p.x; 
            yDragTouchOffset = y - p.y; 

            OverlayItemArryList.remove(item); 
            // 
            mapController_.stopAnimation(true); 
            break; 
           } 
         }      
        } 
       } 
      } 

     if(dontAddtap && isItemHit) 
     { 
      if(motionEvent.getAction() == MotionEvent.ACTION_MOVE && inDrag != null) 
      { 
       //System.out.println(" --- onTouchEvent ACTION_MOVE --- "); 
       setDragImagePosition(x, y); 

       result = true; 
       isTap = isActionDown = false; 
      }    
     } 

     if(dontAddtap || isItemHit) 
     { 
      if(motionEvent.getAction() == MotionEvent.ACTION_UP && inDrag != null) 
      { 
       //System.out.println(" --- onTouchEvent ACTION_UP --- "); 

       if(isItemHit) 
       { 
        dragImage.setVisibility(View.GONE); 

        GeoPoint pt = mapView.getProjection().fromPixels(x-xDragTouchOffset,y-yDragTouchOffset); 

        toDrop = new OverlayItem(pt, inDrag.getTitle(), inDrag.getSnippet()); 

        overlayItems.add(toDrop); 

        //System.out.println("------------- on drag drop point -------------- "+toDrop.getPoint()); 

        addGeo = toDrop.getPoint(); 

        //addReferenceToOverLayList.add(toDrop); 
        ////////System.out.println(" addReferenceToOverLayList.add "+toDrop.getPoint()); 
        Iterator<GeoPoint> st = geoArrayist.iterator(); 
        // update array list with new values when any of the coordinate is moved 
        while(st.hasNext()) 
        { 
         int k = 0; 
         GeoPoint check = st.next(); 
         if(check.equals(gotGeoPoint)) 
         { 
          //////System.out.println("yes we got geo points"); 
          k = geoArrayist.indexOf(gotGeoPoint); 
          //////System.out.println(" - item index got from the array list - "+k); 
          geoArrayist.set(k, addGeo); 
          //////System.out.println(" --- updated array --- "+geoArrayist); 
         }      
        } 
        dontAddtap = result = true; 
        isItemHit = isActionDown = false; 
        populate(); 
       } 
      }    
     } 
     return(result || super.onTouchEvent(motionEvent, mapView)); 
    } 

Et je suis en mesure de faire glisser les marqueurs partout sur la carte sans aucun problème. Cependant, cela a également provoqué le déplacement de mon pointeur d'emplacement actuel (si l'utilisateur essaie de le déplacer). Je veux juste utiliser la même classe de recouvrement mais je veux fixer le pointeur à mon emplacement actuel et il ne devrait pas être mobile. Est-il possible de trouver quel objet de superposition est touché? Ou toute autre solution de contournement serait d'une grande aide. Merci.

+0

Que diriez-vous d'ajouter un booléen dans votre constructeur, pour dire si ce marqueur est le marqueur d'emplacement actuel ou non. Et puis vous pouvez choisir de ne pas pouvoir taper et bouger si c'est vrai !? – Carnal

Répondre

0

Je pense que vous devez mettre la logique en cas OnTouch pour gérer votre scénario examiner cela pourrait être utile Tutorial 1Tutorial 2

1

méthode simple serait de sous-classe votre OverlayClass de classe et de désactiver le mouvement en elle.

UPDATE:

Sous-classe OverlayClass et remplacer sa fonction onTouchEvent(). Dans cette fonction, récupérez les coordonnées de l'événement et effectuez un test avec tous les éléments de superposition dans cette superposition. Si aucun élément n'est touché, passez cet événement à la classe parent en utilisant super.onTouchEvent(), sinon ne faites rien et retournez juste vrai. Utilisez maintenant votre classe d'origine pour toutes les superpositions, à l'exception de la superposition d'emplacement, et utilisez cette sous-classe pour la superposition d'emplacement.

BTW vous pouvez également utiliser la classe MyLocationOverlay intégrée pour afficher votre emplacement (de l'utilisateur) sur la carte sans aucun tracas supplémentaire. Pour cela, vous faites la même chose que vous utilisez votre OverlayClass pour tout, sauf pour l'emplacement. Pour l'emplacement, utilisez MyLocationOverlay intégré à la classe.

+0

Ça vous dérange d'élaborer un peu? Merci. – user1351659

+0

@ user1351659: j'ai ajouté des détails à ma réponse – binW

+0

OK, merci. Je vais l'essayer. – user1351659

Questions connexes