2013-10-13 6 views
23

पहले प्रश्न के रूप में अजीब होगा लेकिन मुझे समझाएं ... मान लीजिए कि हमारे पास मानचित्र पर एक केंद्रित मार्कर है, जब हम मानचित्र को अपनी उंगलियों से ले जाते हैं तो हम देख सकते हैं कि जब आप बाहर निकले तो मार्कर प्रदर्शित नहीं होगा क्षेत्र की सीमाएं तो हम एक मार्कर कैसे बना सकते हैं जो हमेशा मानचित्र के केंद्र में रहेगा हालांकि हम मानचित्र को कहीं भी ले जाते हैं? यूबेर नामक एक ऐप है और वे इस सुविधा को प्रदान करते हैं, आप मार्कर को खींच और छोड़ नहीं देते हैं, बस आप मानचित्र को ले जाते हैं और मार्कर इसकी स्थिति बना रहता है।मार्कर के नीचे एक नक्शा कैसे स्थानांतरित करें?

यहाँ एक स्क्रीनशॉट है! [उबेर मानचित्र मार्कर] [1]

आप देख सकते हैं हरे मार्कर स्क्रीन के केंद्र में है जब हम नक्शा यह अपनी जगह बना रहा ले जाने लेकिन नई स्थिति से पता चलता है जब उपयोगकर्ता मानचित्र को स्थानांतरित करना बंद कर देता है। हम ऐसा कैसे कर सकते हैं?

मेरे पास एक कोड है जो पता चलता है कि जब आप & ड्रैगर को खींचते हैं, तो पते को फिर से प्रदर्शित करने के बारे में कैसे पता चलता है लेकिन इस बार मानचित्र को स्थानांतरित करके खींचकर नहीं? आशा है कि आप समझ सकते हैं कि कोई भी विचार बहुत अच्छा होगा।

public class MainActivity extends AbstractMapActivity implements 
    OnNavigationListener, OnInfoWindowClickListener, 
    OnMarkerDragListener { 
    private static final String STATE_NAV="nav"; 
    private static final int[] MAP_TYPE_NAMES= { R.string.normal, 
    R.string.hybrid, R.string.satellite, R.string.terrain }; 
    private static final int[] MAP_TYPES= { GoogleMap.MAP_TYPE_NORMAL, 
    GoogleMap.MAP_TYPE_HYBRID, GoogleMap.MAP_TYPE_SATELLITE, 
    GoogleMap.MAP_TYPE_TERRAIN }; 
private GoogleMap map=null; 
String filterAddress = ""; 
Marker marker; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (readyToGo()) { 
     setContentView(R.layout.activity_main); 

     SupportMapFragment mapFrag= 
      (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); 

     mapFrag.setRetainInstance(true); 
     initListNav(); 

     map=mapFrag.getMap(); 

     if (savedInstanceState == null) { 
      CameraUpdate center= 
       CameraUpdateFactory.newLatLng(new LatLng(
         41.003739, 
         28.999572)); 
      CameraUpdate zoom=CameraUpdateFactory.zoomTo(10); 

      map.moveCamera(center); 
      map.animateCamera(zoom); 

      addMarker(map, 41.003739, 28.999572, R.string.un, R.string.united_nations); 

       map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater())); 
       map.setOnInfoWindowClickListener(this); 
       map.setOnMarkerDragListener(this); 
     } 
    } 
} 

@Override 
public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
    map.setMapType(MAP_TYPES[itemPosition]); 

    return(true); 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 

    savedInstanceState.putInt(STATE_NAV, 
      getSupportActionBar().getSelectedNavigationIndex()); 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_NAV)); 
} 

@Override 
public void onInfoWindowClick(Marker marker) { 
    Toast.makeText(this, marker.getTitle(), Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onMarkerDragStart(Marker marker) { 
    LatLng position=marker.getPosition(); 

    Log.d(getClass().getSimpleName(), String.format("Drag from %f:%f", 
      position.latitude, 
      position.longitude)); 
} 

@Override 
public void onMarkerDrag(Marker marker) { 
    LatLng position=marker.getPosition(); 

    Log.d(getClass().getSimpleName(), 
      String.format("Dragging to %f:%f", position.latitude, 
        position.longitude)); 
} 

@Override 
public void onMarkerDragEnd(Marker marker) { 
    LatLng position=marker.getPosition(); 

    String filterAddress = ""; 
    Geocoder geoCoder = new Geocoder(
      getBaseContext(), Locale.getDefault()); 
    try { 
     List<Address> addresses = geoCoder.getFromLocation(
       position.latitude, 
       position.longitude, 1); 

     if (addresses.size() > 0) { 
      for (int index = 0; 
      index < addresses.get(0).getMaxAddressLineIndex(); index++) 
       filterAddress += addresses.get(0).getAddressLine(index) + " "; 
     } 
    }catch (IOException ex) {   
     ex.printStackTrace(); 
    }catch (Exception e2) { 
     // TODO: handle exception 
     e2.printStackTrace(); 
    } 
    Log.d(getClass().getSimpleName(), 
      String.format("Dragging to %f:%f", position.latitude, 
        position.longitude)); 
    TextView myTextView = (TextView) findViewById(R.id.test); 

    myTextView.setText("Address is: " + filterAddress); 

} 

private void initListNav() { 
    ArrayList<String> items=new ArrayList<String>(); 
    ArrayAdapter<String> nav=null; 
    ActionBar bar=getSupportActionBar(); 

    for (int type : MAP_TYPE_NAMES) { 
     items.add(getString(type)); 
    } 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
     nav= 
      new ArrayAdapter<String>(
        bar.getThemedContext(), 
        android.R.layout.simple_spinner_item, 
        items); 
    } 
    else { 
     nav= 
      new ArrayAdapter<String>(
        this, 
        android.R.layout.simple_spinner_item, 
        items); 
    } 

    nav.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
    bar.setListNavigationCallbacks(nav, this); 
} 

private void addMarker(GoogleMap map, double lat, double lon, 
     int title, int snippet) 

{ 
    map.addMarker(new MarkerOptions().position(new LatLng(lat, lon)) 
      .icon(BitmapDescriptorFactory.fromResource(R.drawable.pin)) 

      .draggable(true)); 
} 
    } 

यहाँ एक्सएमएल

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/layout1" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_below="@+id/img_header" > 

<fragment 
    android:id="@+id/map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    class="com.google.android.gms.maps.SupportMapFragment" /> 

<TextView 
    android:id="@+id/test" 
    android:layout_width="match_parent" 
    android:layout_height="90dp" 
    android:layout_alignParentRight="true" 
    android:text="Address : " 
    android:textColor="#FF0000" 
    android:textSize="22sp" /> 
</RelativeLayout> 
+0

इस लिंक को चेक करें। !! http://stackoverflow.com/questions/13728041/move-markers-in-google-map-v2-android –

+0

इस मैं क्या पूछ रहा हूँ .. – regeme

+0

@regeme आप समाधान पता चला नहीं है? मुझे एक ही समस्या है। क्या आप जवाब दे सकते हैं? धन्यवाद!! – Shvet

उत्तर

8

मैं Uber ऐप्लिकेशन प्रभाव प्राप्त करने में सक्षम नहीं था, हालांकि मैं कुछ इसी तरह करने में सक्षम था, शायद यह अपने समाधान का इस्तेमाल कर रही के लिए ठीक हो जाएगा GoogleMap.OnCameraChangeListener

गतिविधि:

public class MyActivity extends Activity implements OnCameraChangeListener { 

    ... 

    @Override 
    public void onCameraChange(CameraPosition position) { 
     mMap.clear(); 
     mMap.addMarker(new MarkerOptions() 
      .position(position.target) 
      .title(position.toString()) 
     ); 
    } 

    ... 

} 

समस्या है, मार्कर, जबकि कैमरा ले जाया जा रहा है तैयार नहीं है। हालांकि, ऐसा लगता है कि आप पहले ही मार्कर का ओवरले बना चुके हैं। तो ओवरले के साथ इसे उबर एप्लिकेशन की तरह काम करना चाहिए।

मुझे उम्मीद है कि यह मदद करता है, यहां तक ​​कि सवाल कुछ महीने पुराना है, शायद यह भविष्य के डेवलपर्स को लाभान्वित करेगा।

तरह का संबंध Miki

1

चेक this जवाब

पहले: एक ही लेआउट और स्थिति केंद्र के बराबर करने के लिए एक imageView जोड़ें।दूसरा: निम्नलिखित दृष्टिकोण

1_ get viewgroup (FrameLayout) in my case where the map fragment is located. 

- FrameLayout myContainer = (FrameLayout) findViewById(R.id.content_frame); 
    int mapHeight = myContainer.getHeight(); 
    int mapWidth = myContainer.getWidth(); 
2_ use setOnCameraChangeListener and on camera change get the coordinates: 

LatLng center = mMap.getCameraPosition().target; 

का उपयोग नक्शे के केंद्र का समन्वय प्राप्त करने के लिए और भी here मेरा पूरा समाधान

20

दो आसान चरणों है:

चरण 1

मैं इस्तेमाल किया नक्शा और केंद्र के साथ खंड के माता-पिता के रूप में एक सापेक्ष लयआउट एक छवि दृश्य (जो केंद्रर मानचित्र के रूप में केंद्र या आसान टैक्सी ऐप्स की तरह ही होगा):

<!-- Map and ImageView in center for simulating the map marker --> 
<RelativeLayout 
    android:id="@+id/confirm_address_map_wrapper" 
    android:layout_width="match_parent" 
    android:layout_height="220dp"> 

    <fragment 
     android:id="@+id/confirm_address_map_fragment" 
     android:name="com.google.android.gms.maps.MapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_centerInParent="true" 
     /> 
    <!-- Image View that acts as map marker notice centerInParent--> 
    <ImageView 
     android:id="@+id/confirm_address_map_custom_marker" 
     android:layout_width="@dimen/ICON_DEFAULT_SIZE" 
     android:layout_height="@dimen/ICON_DEFAULT_SIZE" 
     android:layout_centerInParent="true" 
     android:src="@mipmap/my_map_marker"/> 
</RelativeLayout> 

चरण 2

onMapReady() मेरी गतिविधि पर विधि मैं googlemap उदाहरण विधि setOnCameraChangeListener() मुझे जब नक्शा प्रयोग किया जाता है सुनने और कैमरे की स्थिति के केंद्र के आधार पर अक्षांश और देशांतर प्राप्त करने देता है कि का उपयोग करें:

@Override 
    public void onMapReady(GoogleMap googleMap) { 

     googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { 
     @Override 
     public void onCameraChange(CameraPosition cameraPosition) { 

      Log.i("centerLat",cameraPosition.target.latitude); 

      Log.i("centerLong",cameraPosition.target.longitude); 
     } 
    }); 

} 

अद्यतन:
OnCameraChangeListener बहिष्कृत किया गया है। OnCameraIdleListener का उपयोग करें:
[स्रोत: https://stackoverflow.com/a/38732283/421467]

+0

यह छवि को मेरे स्थान आइकन (नीली आइकन) को अवरुद्ध करने वाले स्क्रीन के केंद्र में लाता है। मैं छवि को नीले आइकन (जैसे उबर में) के शीर्ष पर रखना चाहता हूं। –

+0

वहाँ है और अपवाद जब मैं अक्षांश और देशांतर प्राप्त करना चाहता हूं ..... java.util.ArrayList.throwIndexOutOfBoundsException –

+1

आप मानचित्र के केंद्र पर एक दृश्य डाल सकते हैं और इस दृश्य के ऊपर ImageView डाल सकते हैं। –

2

आप Fragment उपयोग कर रहे हैं अपने गूगल मानचित्र प्रदर्शित करने के लिए, ImageViewFragment अंदर इस तरह के अपने अनुकूलित मार्कर ओवरले करने के लिए है कि अपने मार्कर स्थिर बना रहे हैं जब आप अपने मानचित्र आगे बढ़ रहे हैं डाल दिया। कैमरे की स्थिति के केंद्र के आधार पर अक्षांश और देशांतर प्राप्त करने के लिए

ImageView pinButton = (ImageView) findViewById(R.id.pin); 

उपयोग setOnCameraChangeListener() या द्वारा उपलब्ध कराए गए जवाब का पालन करें: xml फ़ाइल के लिए कोड का पालन करें:

<fragment 
    android:id="@+id/map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    class="com.google.android.gms.maps.MapFragment" > 

    <ImageView 
     android:id="@+id/pin" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:contentDescription="@null" 
     android:src="@drawable/pin" /> 
</fragment> 

activity.java फ़ाइल उपयोग में इस @androidPlusPlus

संबंधित मुद्दे

 संबंधित मुद्दे