我想实现地图的拖动效果。当我们拖动地图时,标记应显示当前位置或纬度和经度。它在Uber应用程序中完成,见下文:
在此标记中显示拖动地图时的当前位置。我怎么能实现这个???
ChooseFromMapActivity
public class ChooseFromMapActivity extends AppCompatActivity implements GoogleMap.OnCameraChangeListener {
TextView textShowAddress;
private GoogleMap mMap;
LatLng latLng;
double latitude = 17.385044;
double longitude = 78.486671;
float zoom;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choose_from_map);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mMap = mapFragment.getMap();
mMap.setMyLocationEnabled(true);
LatLng center = mMap.getCameraPosition().target;
mMap.getUiSettings().setZoomControlsEnabled(true);
mMap.getUiSettings().setRotateGesturesEnabled(true);
mMap.getUiSettings().setScrollGesturesEnabled(true);
latLng = new LatLng(-34, 151);
mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
textShowAddress = (TextView) findViewById(R.id.textShowAddress);
mMap.addMarker(new MarkerOptions()
.position(latLng)
.draggable(false)
.title("sent location :)"))
.setDraggable(false);
}
}
}
答案 0 :(得分:6)
有些人很困惑如何解决这个问题的简单方法 第1步:使用谷歌地图框架和中心的一个图像视图创建布局
<FrameLayout
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/btn_save" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/pin" />
步骤2:创建方法初始化地图并将其放入onCreate()...意味着在活动开始时所以它将初始化地图框架......在这里你需要创建一个SupportMapFragment实例
/*==================== initialize map fragment ==================*/
private void initilizeMap() {
mSupportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map_profile);
if (mSupportMapFragment == null) {
FragmentManager fragmentManager = getChildFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
mSupportMapFragment = SupportMapFragment.newInstance();
fragmentTransaction.replace(R.id.map_profile, mSupportMapFragment).commit();
}
Log.d("mSupportMapFragment", "------" + mSupportMapFragment + "-----googleMap---" + googleMap);
}
Step3:现在创建一个LatLng实例(私有LatLng latlng)(它将返回地图的居中纬度和经度以及我们在中心的图像,所以它看起来像我们的标记图像是返回纬度和纬度)
步骤4:创建方法IniLizeMap();这将把属性和位置设置为映射。
public void IniLizeMap() {
try {
mSupportMapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
// Showing / hiding your current location
googleMap.setMyLocationEnabled(false);
// Enable / Disable zooming controls
googleMap.getUiSettings().setZoomControlsEnabled(false);
// Enable / Disable my location button
googleMap.getUiSettings().setMyLocationButtonEnabled(false);
// Enable / Disable Compass icon
googleMap.getUiSettings().setCompassEnabled(false);
// Enable / Disable Rotate gesture`enter code here`
googleMap.getUiSettings().setRotateGesturesEnabled(false);
// Enable / Disable zooming functionality
googleMap.getUiSettings().setZoomGesturesEnabled(false);
googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
latLng = cameraPosition.target;
googleMap.clear();
try {
getAddress(latLng.latitude, latLng.longitude);
Log.e("Changing address", getAddress(latLng.latitude, latLng.longitude));
Log.e("Latitude", latLng.latitude + "");
Log.e("Longitude", latLng.longitude + "");
String lat = latLng.latitude + "";
String lng = latLng.longitude + "";
String location = getAddress(latLng.latitude, latLng.longitude);
} catch (Exception e) {
e.printStackTrace();
}
}
});
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(Double.parseDouble(Utils.lat),
Double.parseDouble(Utils.lng))).zoom(14).build();
googleMap.animateCamera(CameraUpdateFactory
.newCameraPosition(cameraPosition));
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
在这个方法中,我将setOnCameraChangeListener应用于googlemap,这是我们问题的mian核心解决方案,它将在移动摄像机时返回居中位置,现在如果你想在移动时获取地址,那么创建方法getAddress将返回移动地图时的字符串地址,所以这里是
步骤5:创建方法getAddress(double lat,double lng),需要两个dubbles
public String getAddress(double latitude, double longitude) {
StringBuilder result = new StringBuilder();
try {
System.out.println("get address");
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
if (addresses.size() > 0) {
System.out.println("size====" + addresses.size());
Address address = addresses.get(0);
for (int i = 0; i <= addresses.get(0).getMaxAddressLineIndex(); i++) {
if (i == addresses.get(0).getMaxAddressLineIndex()) {
result.append(addresses.get(0).getAddressLine(i));
} else {
result.append(addresses.get(0).getAddressLine(i) + ",");
}
}
System.out.println("ad==" + address);
System.out.println("result---" + result.toString());
autoComplete_location.setText(result.toString()); // Here is you AutoCompleteTextView where you want to set your string address (You can remove it if you not need it)
}
} catch (IOException e) {
Log.e("tag", e.getMessage());
}
return result.toString();
}
====================你的地图就像UBER一样准备好了=============
答案 1 :(得分:2)
答案很好但是,setOnCameraChangeListener已折旧。使用setOnCameraIdleListener。
这里有一些示例来获取地图的相机位置。
mMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
@Override
public void onCameraIdle() {
LatLng midLatLng = mMap.getCameraPosition().target;
getAddress(midLatLng.latitude, midLatLng.longitude);
}
});
现在,getAddress返回到地址的居中位置。
答案 2 :(得分:0)
自 setOnCameraChangeListener 以来,您可以通过在地图中心放置具有相同标记的图像视图并将 setOnCameraIdleListener 与 setOnCameraMoveListener 结合使用来获得相同的效果。
private Marker tempMarker;
private SupportMapFragment mapFragment;
private void addMapListeners() {
mapFragment.getMapAsync((googleMap -> {
googleMap.setOnCameraIdleListener(() -> {
LatLng target = googleMap.getCameraPosition().target;
addMarker(target);
});
googleMap.setOnCameraMoveListener(()->{
tempMarker.remove();
});
}));
}
private void addMarker(LatLng markerPosition) {
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(markerPosition);
mapFragment.getMapAsync((googleMap -> {
if (tempMarker != null) {
tempMarker.remove();
}
tempMarker = googleMap.addMarker(markerOptions);
}));
}