我们使用地图需要我们首先注册账户并生成key 值可以参考下面的文档:
实现地图功能:
layout_custom_marker.xml
当前的实现类:
public class MainActivity extends AppCompatActivity {
/*当前的工程组件的封装 */
private AMap mMapPanel;
/*当前的地图控件封装*/
private MapView mMap;
/*是否显示当前的交通情况的地图*/
private CheckBox boxTraffic;
private UiSettings mSetting;
private LatLng wuxi = new LatLng(31.490423,120.310302);
private LatLng suzhou = new LatLng(31.304782,120.604927);
private LatLng changshu = new LatLng(31.655864,120.75193);
private View.OnClickListener onClick = new View.OnClickListener(){
@Override
public void onClick(View view) {
switch (view.getId())
{
case R.id.main_traffic:
boolean isTraffic = boxTraffic.isChecked();
mMapPanel.setTrafficEnabled(isTraffic);
break;
case R.id.main_shortcut:
onScreenShot();
break;
}
}
};
private LocationSource mSource = new LocationSource() {
private OnLocationChangedListener mLocationListener;
private AMapLocationClient mLocationClient;
/***
* 设置定位激活
* @param onLocationChangedListener
*/
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mLocationListener = onLocationChangedListener;
mLocationClient = new AMapLocationClient(getApplicationContext());
AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
//位置监听
mLocationClient.setLocationListener(new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if(aMapLocation.getErrorCode() == 0 && mLocationListener!= null)
mLocationListener.onLocationChanged(aMapLocation);//显示系统的小蓝点
else{
/*弹出错误定位的代码根据错误代码修改*/
String errText = "定位失败," + aMapLocation.getErrorCode()+ ": " + aMapLocation.getErrorInfo();
Toast.makeText(getApplicationContext(),errText,Toast.LENGTH_SHORT).show();
}
}
});
/*
*设置定位模式:
* Battery_Saving, 低功耗
* Device_Sensors, 仅设备
* Hight_Accuracy 高精度模式
*/
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
//设置定位参数
mLocationClient.setLocationOption(mLocationOption);
/* 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
* 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
* 在定位结束后,在合适的生命周期调用onDestroy()方法
*在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
*/
mLocationClient.startLocation();
}
/**
* 停止当前的定位
*/
@Override
public void deactivate() {
if(mLocationClient != null)
{
mLocationClient.stopLocation();
mLocationClient.onDestroy();
}
mLocationClient = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
mMap = (MapView) findViewById(R.id.main_map);
mMap.onCreate(savedInstanceState);
mMapPanel = mMap.getMap();
mSetting = mMapPanel.getUiSettings();
boxTraffic = (CheckBox) findViewById(R.id.main_traffic);
boxTraffic.setOnClickListener(onClick);
/* 设置常见的使用标识:
* 设置是否显示缩放比列 */
mSetting.setScaleControlsEnabled(true);
/*设置是否显示缩放比列按钮*/
mSetting.setZoomControlsEnabled(true);
/* 设置是否显示指南针*/
mSetting.setCompassEnabled(true);
/* 设置地图是否可以手动滑动 */
mSetting.setScrollGesturesEnabled(true);
/* 设置地图是否可以手动缩小*/
mSetting.setZoomGesturesEnabled(true);
/*设置地图截屏*/
findViewById(R.id.main_shortcut).setOnClickListener(onClick);
}
/***
* 单击获取位置
*/
private void onSingleClick()
{
if(mMapPanel == null)
return;
mMapPanel.setOnMapClickListener(new AMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
Toast.makeText(getApplicationContext(),"维度 :"+ latLng.latitude+ "经度:" + latLng.longitude,Toast.LENGTH_SHORT).show();
}
});
}
/***
* 长按获取位置信息
*/
private void onLongClick()
{
if(mMapPanel == null)
return ;
mMapPanel.setOnMapLongClickListener(new AMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng latLng) {
Toast.makeText(getApplicationContext(),"维度 :"+ latLng.latitude+ "经度:" + latLng.longitude,Toast.LENGTH_SHORT).show();
}
});
}
/***
* 移动到具体位置定位
* 这里选用的是无锡市
*/
private void onSpecifiedLocation()
{
//这里设置无锡的坐标
CameraUpdate mCurrentPosition = CameraUpdateFactory.newCameraPosition(new CameraPosition(wuxi,18,30,30));
//清除地图中设置的锚点
mMapPanel.clear();
mMapPanel.addMarker(new MarkerOptions()
.position(wuxi).
icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
/*无动画移动到指定位置*/
// mMapPanel.moveCamera(mCurrentPosition);
/*加入动画特效缓慢移动到指定的位置*/
mMapPanel.animateCamera(mCurrentPosition);
}
/***
* 缩小地图尺寸
*/
private void onZoonout()
{
/**添加动画的缩小效果,
*1000执行动画的毫秒值
* CancelableCallback @null
* */
mMapPanel.animateCamera(CameraUpdateFactory.zoomOut(),1000,null);
/*不添加动画地图缩小的方法*/
mMapPanel.moveCamera(CameraUpdateFactory.zoomOut());
}
/***
* 放大地图的尺寸
*/
private void onZoomIn()
{
/**添加动画的放大效果,
*1000执行动画的毫秒值
* CancelableCallback @null
* */
mMapPanel.animateCamera(CameraUpdateFactory.zoomIn(),1000,null);
/*不添加动画地图放大的方法*/
mMapPanel.moveCamera(CameraUpdateFactory.zoomIn());
}
private void onScreenShot()
{
mMapPanel.getMapScreenShot(new AMap.OnMapScreenShotListener() {
@Override
public void onMapScreenShot(Bitmap bitmap) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
if(null == bitmap){
return;
}
try {
FileOutputStream fos = new FileOutputStream(
Environment.getExternalStorageDirectory() + "/test_"
+ sdf.format(new Date()) + ".png");
boolean b = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
try {
fos.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
if (b)
Toast.makeText(getApplicationContext(),"截屏成功",Toast.LENGTH_SHORT).show();
else
Toast.makeText(getApplicationContext(),"截屏失败",Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
});
//刷新地图
mMapPanel.invalidate();
}
/***
* 实现调动的描点跳动
* 这里选用的是无锡市
*/
private void onJumpMarker()
{
if(mMapPanel == null) {
Toast.makeText(getApplicationContext(),"未能获取当前的AMap对象!",Toast.LENGTH_SHORT).show();
return;
}
//这里事先添加一个测试的锚点
mMapPanel.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
onJumpMarkerEvent(marker);
//返回值要改正true,否则点击效果将忽略,不再执行
return true;
}
});
MarkerOptions mMarkerOption = new MarkerOptions()
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE))
.position(wuxi)
.draggable(true);
mMapPanel.addMarker(mMarkerOption);
}
/***
* 实现调动的描点跳动事件
*/
private void onJumpMarkerEvent(final Marker marker)
{
final Handler mHandler = new Handler();
final long startMillins = SystemClock.uptimeMillis();
Projection mProject = mMapPanel.getProjection();
final LatLng mLatLng = marker.getPosition();
Point mMarkerPoint = mProject.toScreenLocation(mLatLng);
mMarkerPoint.offset(0,-100);
final LatLng mStartLatLng = mProject.fromScreenLocation(mMarkerPoint);
final long duration = 1000;
final Interpolator interpolater = new BounceInterpolator();
mHandler.post(new Runnable() {
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - startMillins;
//注意这里的参数要进行强转,如果不这样做,计算的参数会四舍五入,丧失精度,导致动画僵硬没有过渡效果
float time = interpolater.getInterpolation((float)elapsed/duration);
double lng = time * mLatLng.longitude + (1 - time) * mStartLatLng.longitude ;
double lat = time * mLatLng.latitude + (1 - time) * mStartLatLng.latitude;
marker.setPosition(new LatLng(lat,lng));
if(time < 1.0)
{
mHandler.postDelayed(this,16);
}
}
});
}
/***
* 点击后展示锚点的信息
* 这里选用的是无锡市
*/
private void onShowInfo()
{
/*如果想要添加多个锚点,可以在这里循环调用addMarker方法,添加信息。
*如果修改修改可以使用clear方法删除后重新操作,建议使用散列表保存展示数据
*/
MarkerOptions mMarkerOptions = new MarkerOptions()
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))
.position(wuxi)
.title("标题")
.snippet("内容信息")
.draggable(true);
mMapPanel.addMarker(mMarkerOptions);
//添加点击事件,返回值要设置为true
mMapPanel.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
if(marker.isInfoWindowShown())
marker.hideInfoWindow();
else
marker.showInfoWindow();
return true;
}
});
}
/***
* 设置自定义的锚点布局
*/
private void onCustomMarkerWindow()
{
//这里添加的锚点,需要我们添加标题或者内容,才能显示锚点上面的消息,可以设置设置标题哦(*^_^*)
MarkerOptions mMarkerOptions = new MarkerOptions()
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))
.title("title")
.position(wuxi)
.draggable(true);
mMapPanel.addMarker(mMarkerOptions);
/*Marker marker 中可以使用 setRotateAngle(float degree) 设置锚点图标的旋转角度*/
//marker.setRotateAngle(90);
/*设置锚点的点击事件*/
mMapPanel.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
if(marker.isInfoWindowShown())
marker.hideInfoWindow();
else
marker.showInfoWindow();
return true;
}
});
/*锚点消息文本的点击事件*/
mMapPanel.setOnInfoWindowClickListener(new AMap.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
Toast.makeText(getApplicationContext(),"你点击了锚点上的消息文本:\n"+ marker.getTitle()+ "\n"+ marker.getSnippet(),Toast.LENGTH_SHORT).show();
}
});
/*锚点信息文本的定制布局实现 */
mMapPanel.setInfoWindowAdapter(new AMap.InfoWindowAdapter() {
@Override
public View getInfoWindow(Marker marker) {
View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.layout_custom_marker,null);
/*这里是我们定制后的布局和数据自己可以按照自己的需求改写,可以在添加前设置锚点id的字串,或者标题字串,在将字串作为键,获取散列表中的值*/
TextView tvTitle = (TextView) view.findViewById(R.id.tv_custom_marker_title);
TextView tvContent = (TextView) view.findViewById(R.id.tv_custom_marker_content);
tvTitle.setText("标题");
tvContent.setText("消息内容");
return view;
}
@Override
public View getInfoContents(Marker marker) {
return null;
}
});
}
/***
* 当前位置定位,摄像机焦点移动
*/
private void onMoveCurrentLocation()
{
MyLocationStyle myLocationStyle = new MyLocationStyle();
/*设置当前定位的图片,如果需要修改可以自己替换*/
myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.location_marker));
/*地图中有默认的定位区域颜色和边框的颜色,我们可以将他们的颜色和边框的颜色设置为全透明的就可以实现定位圆圈的不显示效果*/
myLocationStyle.strokeColor(Color.argb(10,3,145,255));//设置圆形的边框颜色
myLocationStyle.strokeWidth(5);//设置圆形的边框的粗细
myLocationStyle.radiusFillColor(Color.argb(10,0,0,180));//设置圆形的填充色
/*
* 设置当前的定位的类型:
* LOCATION_TYPE_SHOW 仅仅定位,不进行其他操作
* LOCATION_TYPE_LOCATE
* LOCATION_TYPE_FOLLOW 设置定位的类型为跟随
* LOCATION_TYPE_FOLLOW_NO_CENTER 设置定位类型为持续定位,定位点不移动到中心点
* */
// myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW);
mMapPanel.setMyLocationStyle(myLocationStyle);
/*设置定位的监听*/
mMapPanel.setLocationSource(mSource);
mMapPanel.getUiSettings().setMyLocationButtonEnabled(true);//设置默认定位按钮是否显示
/*设置为true表示显示定位层并可以触发定位,
false表示隐藏定位层并不可触发定位,默认是false*/
mMapPanel.setMyLocationEnabled(true);
}
/***
* 绘制地图中的线条
*/
private void onDrawLine()
{
/*绘制线条。
*当前绘制的方法按照顺序连接,从第一个到第二个,
* 第二个到第三个,依此类推,
* 前一个和后一个组合连接直到最后一个结束
*/
mMapPanel.addPolyline(
new PolylineOptions()
.add(wuxi,
suzhou,
changshu,
wuxi)
.width(10f)
.color(Color.RED)
.setDottedLine(true)//设置绘制的线条是否为虚线 true 绘制虚线
)
.setGeodesic(true); //设置绘制的线段是否为曲线
mMapPanel.invalidate();//刷新地图
}
/***
* 绘制图片到地图中
*/
private void onDrawPhoto()
{
//当前的位置,一般是以一个矩形对角的两点确定。
mMapPanel.moveCamera(CameraUpdateFactory
.newLatLngZoom(new LatLng(31.473709,120.26728),18));
LatLngBounds mBounds = new LatLngBounds.Builder()
.include(new LatLng(31.472537,120.267509))
.include(new LatLng(31.474547,120.269791))
.build();
mMapPanel.addGroundOverlay(new GroundOverlayOptions()
.anchor(0.5f,0.5f)
.transparency(0.1f)
.image(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher_round))
.positionFromBounds(mBounds));
}
private void onDrawCircle()
{
//设置指定区域的可视化区域的地图
mMapPanel.moveCamera(CameraUpdateFactory
.newLatLngZoom(wuxi, 18));
mMapPanel.addCircle(new CircleOptions()
.center(wuxi)
.radius(40f)
.strokeColor(Color.argb(150,1,1,1))
.fillColor(Color.argb(150,1,1,1))
.strokeWidth(25));
}
private void onAreaMarker()
{
PolygonOptions mOptions = new PolygonOptions();
mOptions.add(new LatLng(31.486701,120.311264));
mOptions.add(new LatLng(31.486701,120.315689));
mOptions.add(new LatLng(31.476675,120.320198));
mOptions.add(new LatLng(31.476364,120.307556));
mOptions.add(new LatLng(31.486701,120.311264));
final Polygon mPolyon = mMapPanel.addPolygon(mOptions.strokeWidth(4f)
.strokeColor(Color.argb(50,1,1,1))
.fillColor(Color.argb(50,1,1,1)));
mMapPanel.moveCamera(CameraUpdateFactory.newLatLngZoom(wuxi,16));
mMapPanel.setOnMapClickListener(new AMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
mMapPanel.addMarker(new MarkerOptions().position(latLng));
boolean isContact = mPolyon.contains(latLng);
String tips = isContact?"当前标记的点在绘制的围栏里":"当前标记的点不在绘制的围栏里";
Toast.makeText(getApplicationContext(),tips,Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onSaveInstanceState( Bundle outState) {
super.onSaveInstanceState(outState);
mMap.onSaveInstanceState(outState);
}
@Override
protected void onResume() {
super.onResume();
mMap.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMap.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMap.onDestroy();
}
}
使用高德地图出现的错误码文档
高德地图key的配置