- 基本效果图就是这个样子,录制这个软件不太好使,每次切换地点是点击确定变更的。接下来就看看地图上的功能是如何实现的:
实现的方式
- 编写自定义的infowindow
一,书写布局样式(自定义随意写)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/s_box">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxEms="18"
android:paddingBottom="3dp"
android:paddingLeft="10dp"
android:paddingTop="3dp"
android:text="定位中" />
<TextView
android:id="@+id/tv_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:padding="5dp"
android:paddingBottom="3dp"
android:paddingRight="10dp"
android:paddingTop="3dp"
android:text="确定"
android:textColor="@color/colorAccent" />
</LinearLayout>
</LinearLayout>
二,初始化布局的引用
private View infoWindow = null;(成员变量)
//引用刚才书写的自定义布局
infoWindow = LayoutInflater.from(this).inflate(R.layout.custom_info_window, null);
tv_name = infoWindow.findViewById(R.id.tv_name);//左侧地址的显示
tv_submit = infoWindow.findViewById(R.id.tv_submit);//右侧确定按钮
- 上满是初始化的自定义infowindow展示的效果。但是在展示之前需要先优先实现自定义的marker和中心点坐标地理逆向编码。
三,自定义的marker设置
重写地图加载完毕的方法,在地图加载完毕之后调用添加marker
/**
* 地图加载完成回调
*/
@Override
public void onMapLoaded() {
addMarkerInScreenCenter();
}
/**
* 添加选点marker
*/
private Marker locationMarker;
private void addMarkerInScreenCenter() {
LatLng latLng = aMap.getCameraPosition().target;
Point screenPosition = aMap.getProjection().toScreenLocation(latLng);
locationMarker = aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.bqdw_icon)));
//设置Marker在屏幕上,不跟随地图移动
locationMarker.setPositionByPixels(screenPosition.x, screenPosition.y);
locationMarker.showInfoWindow();
}
四,展示InfoWindow
需要给infowindow设置监听
aMap = mapView.getMap();
aMap.setInfoWindowAdapter(this);//主要监听
aMap.setOnInfoWindowClickListener(listener);//点击监听,自己看
实现监听后,重写以下方法
/**
* 自定义infoWindow窗口
*/
@Override
public View getInfoWindow(Marker marker) {
render(infoWindow);
return infoWindow;
}
/**
* 自定义infoWindow窗口
*/
@Override
public View getInfoContents(Marker marker) {
render(infoWindow);
return infoWindow;
}
/**
* 自定义infoWindow窗口
*/
public void render(View view) {
tv_submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*
确定做点击的操作什么的。我这边不做处理
*/
}
});
}
五,关于中心点移动获取地点
先要实现监听
aMap.setOnCameraChangeListener(this);
书写监听后,重写监听方法
private LatLng currentTarget;
@Override
public void onCameraChange(CameraPosition cameraPosition) {
LatLng target = cameraPosition.target;
uploadEvent.setLatitude(target.latitude + "");//这是我的model用来获取数据
uploadEvent.setLongitude(target.longitude + "");//这是我的model用来获取数据
LatLonPoint latLonPoint = new LatLonPoint(target.latitude, target.longitude);
//逆地理编码,通过经纬度获取地理位置
RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, GeocodeSearch.AMAP);
geocoderSearch.getFromLocationAsyn(query);//逆向对象,下一步给初始化
}
/**
* 地图移动结束回调
*
*/
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
currentTarget = cameraPosition.target;
}
六,逆向地理编码对象初始化
private GeocodeSearch geocoderSearch;
geocoderSearch = new GeocodeSearch(this);
geocoderSearch.setOnGeocodeSearchListener(this);
设置监听后,重写方法
/*
地图中心点经纬度 转换 地理位置。 经纬度转地址。
@params tv_name infowindow 显示的地址
code 默认1000
*/
@Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int code) {
if (code == 1000 && regeocodeResult != null) {
//逆向地理地址
address = regeocodeResult.getRegeocodeAddress().getFormatAddress();
if (!TextUtils.isEmpty(address)) {
tv_name.setText(address);
}
}
}
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
}
以上基本就是关于地图的一些设置, 有关于地图的配置什么的, 请自行阅读高德官方api。