2011-07-30 8 views
0

私はアンドロイドで地図をタッチするとマーカーを追加するにはどうすればよいですか?

package com.adhamenaya.android; 

import java.util.List; 

import android.content.Context; 
import android.graphics.drawable.Drawable; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.widget.Toast; 

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

public class MapApp extends MapActivity { 

    private MapView mapView; 
    private MapController mapController; 
    private LocationManager locationManager; 
    private Context context; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     context=this; 
     initLayout(); 
     initMap(); 
    } 

    private void initLayout(){ 
     mapView = (MapView) findViewById(R.id.mapview); 
     //blueIcon = (Drawable)this.getResources().getDrawable(R.drawable.blueicon); 

    } 
    private void initMap(){ 
     mapView.setBuiltInZoomControls(true); 
     mapView.setStreetView(true); 
     mapController=mapView.getController(); 
     mapController.setZoom(10);// 1 is world view 
     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0, 0, new GeoUpdateHandler()); 

    } 


    @Override 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    class GeoUpdateHandler implements LocationListener { 

     @Override 
     public void onLocationChanged(Location location) { 
      int lat=(int)(location.getLatitude()*1E6); 
      int lng=(int)(location.getLongitude()*1E6); 

      GeoPoint point=new GeoPoint(lat,lng); 
      //GeoPoint point = new GeoPoint(19240000,-99120000); 

      mapController.animateTo(point); 
      mapController.setCenter(point); 
      Drawable redIcon = context.getResources().getDrawable(R.drawable.redicon); 
      List<Overlay> mapOverlays = mapView.getOverlays(); 
      MyItemizedOverlay itemizedoverlay = new MyItemizedOverlay(redIcon); 
      OverlayItem overlayitem = new OverlayItem(point, "Hello !", "I'm here"); 
      itemizedoverlay.addOverlay(overlayitem); 
      mapOverlays.add(itemizedoverlay); 
     } 

     @Override 
     public void onProviderDisabled(String arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onProviderEnabled(String arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 
      // TODO Auto-generated method stub 

     } 
     public boolean onTouchEvent(MotionEvent event){ 
      int x=(int)event.getX(); 
      int y=(int)event.getY(); 
      Toast.makeText(context, x, Toast.LENGTH_LONG).show(); 
      GeoPoint point = mapView.getProjection().fromPixels(x, y); 

      Drawable redIcon = context.getResources().getDrawable(R.drawable.blueicon); 
      List<Overlay> mapOverlays = mapView.getOverlays(); 
      MyItemizedOverlay itemizedoverlay = new MyItemizedOverlay(redIcon); 
      OverlayItem overlayitem = new OverlayItem(point, "New Place", "I clicked here !"); 
      itemizedoverlay.addOverlay(overlayitem); 
      mapOverlays.add(itemizedoverlay); 
      return false; 
     } 

} 
} 

編集...これは私の活動である

..私は私が画面に触れたときにマーカーを追加したい、マップを表示するマップ活性を有する:これはクラスです私はONTAP()メソッドを実装しているItemizedOverlay、のために、しかし、何も起こりません...

package com.adhamenaya.android; 

import java.util.ArrayList; 

import android.app.AlertDialog; 
import android.content.Context; 
import android.graphics.drawable.Drawable; 
import android.view.MotionEvent; 
import android.widget.Toast; 

import com.google.android.maps.ItemizedOverlay; 
import com.google.android.maps.MapView; 
import com.google.android.maps.OverlayItem; 

public class MyItemizedOverlay extends ItemizedOverlay{ 

    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 
    private Context mContext; 
    public MyItemizedOverlay(Drawable defaultMarker) { 
      super(boundCenterBottom(defaultMarker)); 
    } 

    public MyItemizedOverlay(Drawable defaultMarker, Context context) { 
      super(defaultMarker); 
      mContext = context; 
    } 
    public void addOverlay(OverlayItem overlay) { 
     mOverlays.add(overlay); 
     populate(); 
    } 
    @Override 
    protected OverlayItem createItem(int i) { 
     return mOverlays.get(i); 
    } 
    @Override 
    public int size() { 
     return mOverlays.size(); 
    } 
    @Override 
    protected boolean onTap(int index) { 
     OverlayItem item = mOverlays.get(index); 
     AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); 
     dialog.setTitle(item.getTitle()); 
     dialog.setMessage(item.getSnippet()); 
     dialog.show(); 
     return true; 
    } 
    @Override 
     public boolean onTouchEvent(MotionEvent event, MapView mapView) { 
     int x=(int)event.getX(); 
      int y=(int)event.getY(); 
      Toast.makeText(mContext, x, Toast.LENGTH_LONG).show(); 
      return super.onTouchEvent(event, mapView); 
     } 


} 

答えて

2

Hello, MapView!チュートリアルでは、MapView上のマーカーを示すカバーしています。チュートリアルでは、アクティビティが開始されるとすぐにマーカーが追加されますが、後でユーザーが画面に触れるなどのマーカーを追加することもできます。この方法を試してみると、ItemizedOverlayのサブクラスでonTapを上書きしたい可能性があります。

更新:

あなたはチュートリアルに従うならば、あなたはItemizedOverlayの独自のサブクラスを持っています。 onTapがそのメソッドの1つです。ドキュメントを見ると、残念ながらonTap(GeoPoint p, MapView mapView)はパブリックでも保護されていないため、オーバーライドできません。

できることは、タップを検出するためだけに別のオーバーレイがあることです。 ItemizedOverlayをサブクラス化する代わりに、サブクラスOverlayをサブクラス化する。

private class TapOverlay extends Overlay { 
    public boolean onTap(GeoPoint p, MapView mapView) { 
     // code that adds item in your ItemizedOverlay 
     // goes here 

     return true; 
    } 
} 
+0

私はどのようにonTapを実装できますか?エミュレータでどのようにテストできますか? – Adham

+0

私の答えを更新しました。 –

関連する問題