gpt4 book ai didi

android - 如何在标记下移动 map ?

转载 作者:IT老高 更新时间:2023-10-28 21:55:34 25 4
gpt4 key购买 nike

假设我们在 map 上有一个居中的标记,当我们用手指移动 map 时,我们可以看到当您离开该区域时该标记将不再显示。那么,尽管我们将 map 移动到任何地方,我们如何制作一个始终保持在 map 中心的标记呢?有一个名为 UBER 的应用程序,他们提供了此功能,您无需拖放标记,只需移动 map ,标记就会保持原位。

这是截图:

Uber Map Marker

如您所见,当我们移动 map 时,绿色标记位于屏幕中央,它保持原位,但在用户停止移动 map 时显示新位置。我们怎么能这样呢?

我有一个代码在您拖放标记时显示地址,如何再次显示地址但这次不是通过拖动、移动 map ?希望你能理解任何想法都会很棒。

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>

最佳答案

两个简单的步骤:

第一步

我使用 RelativeLayout 作为 fragment 的父级,其中包含 map 和居中的 ImageView(就像在 uber 或简易出租车应用程序中一样,作为居中的 map 标记):

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

<View
android:id="@+id/view"
android:layout_width="1dp"
android:layout_height="1dp"
android:layout_centerInParent="true"/>


<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_above="@+id/view"
android:layout_centerHorizontal="true"
android:src="@mipmap/my_map_marker"/>
</RelativeLayout>

第 2 步

onMapReady() 方法在我的 Activity 中我使用 googleMap 实例方法 setOnCameraChangeListener() 让我在使用 map 时收听并根据相机位置的中心获取纬度和经度:

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

关于android - 如何在标记下移动 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19346206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com