如何在标记下移动地图?

作为第一个问题将是奇怪的,但让我解释一下……假设我们在地图上有一个居中的标记,当我们用手指移动地图时,我们可以看到当你超出界限时不再显示标记区。 那么我们怎样才能使一个标记始终保持在地图的中心位置,尽pipe我们将地图移动到了任何地方? 有一个名为UBER的应用程序,他们提供了这个function,你不要拖动标记,你只需移动地图,标记保持它的位置。

这是一个截图![优步地图标记] [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)); } } 

这是xml

 <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> 

Solutions Collecting From Web of "如何在标记下移动地图?"

两个简单的步骤:

步骤1

我使用了一个RelativeLayout作为片段的父对象,并在其中心中放置一个ImageView(它将像超级或简单的出租车应用程序一样用作居中的地图标记):

 <!-- 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]

我无法获得Uber应用程序的效果,但是我能够做类似的事情,也许这对您的解决scheme使用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() ) ); } ... } 

问题是,相机正在移动时不会画出标记。 但是,好像您已经创build了一个标记叠加层。 所以覆盖它应该像Uber应用程序一样工作。

我希望这有助于,甚至是几个月的问题,也许这将有利于未来的开发者。

亲切的问候三木

如果您使用Fragment来显示您的Google地图,请将ImageView放入Fragment以覆盖您的自定义标记,以便在移动地图时标记保持固定。 按照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文件中使用这个:

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

使用setOnCameraChangeListener()获取基于相机位置中心的纬度和经度,或遵循@androidPlusPlus提供的答案

检查这个答案

首先:将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; 

而且这里是我完整的解决scheme