Android高德地图开发详解

这段时间开发的时候用到了高德地图,对高德地图开发有心得体会,现在分享给大家,对我开发过百度地图的我来说,总体来说高德地图Demo,没有百度讲解的详细

个人更偏向于使用百度地图,但是没办发,项目需要使用高德地图,我开发的是定位,更具经纬度添加标记,标记点击事件,以及路线规划废话不多说,上代代码

那么首先导入高德给的jar,包,我开发的是2d地图,

这个包结构图,高德题图api也提供了步骤,就不多说了

下面添加权限,设置key

<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /><uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.WRITE_SETTINGS" />

package com.yakj.gaodedemo;import android.app.Activity;import android.graphics.Color;import android.location.Location;import android.os.Bundle;import android.view.View;import android.widget.RelativeLayout;import android.widget.Toast;import com.amap.api.location.AMapLocation;import com.amap.api.location.AMapLocationListener;import com.amap.api.location.LocationManagerProxy;import com.amap.api.location.LocationProviderProxy;import com.amap.api.maps2d.AMap;import com.amap.api.maps2d.AMap.OnMapClickListener;import com.amap.api.maps2d.AMap.OnMarkerClickListener;import com.amap.api.maps2d.CameraUpdateFactory;import com.amap.api.maps2d.LocationSource;import com.amap.api.maps2d.MapView;import com.amap.api.maps2d.model.BitmapDescriptor;import com.amap.api.maps2d.model.BitmapDescriptorFactory;import com.amap.api.maps2d.model.LatLng;import com.amap.api.maps2d.model.Marker;import com.amap.api.maps2d.model.MarkerOptions;import com.amap.api.maps2d.model.MyLocationStyle;import com.yakj.view.StationInfoPopupWindow;public class MainActivity extends Activity implements LocationSource, AMapLocationListener, OnMarkerClickListener, OnMapClickListener {/** * 基础地图 */private MapView mapView;private AMap aMap;/** * 定位 */private LocationManagerProxy mAMapLocationManager;/** * 定位监听 */private OnLocationChangedListener mListener;/** * 添加的覆盖物标志 */private Marker currentMarker;/** * 点击标记物弹出popWindow信息 */private StationInfoPopupWindow popWindow;/** * 展示popWindow布局 */private RelativeLayout mpop;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mapView = (MapView) findViewById(R.id.map);mapView.onCreate(savedInstanceState);// 必须要写mpop = (RelativeLayout) findViewById(R.id.rent_map_pop);init();}/** * 初始化AMap对象 */private void init() {if (aMap == null) {aMap = mapView.getMap();setUpMap();}}/** * 设置地图样式 */private void setUpMap() {// 自定义系统定位蓝点MyLocationStyle myLocationStyle = new MyLocationStyle();// 自定义定位蓝点图标myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.drawable.location_marker));// 自定义精度范围的圆形边框颜色myLocationStyle.strokeColor(Color.BLUE);myLocationStyle.radiusFillColor(Color.TRANSPARENT);// 自定义精度范围的圆形边框宽度myLocationStyle.strokeWidth(2);// 将自定义的 myLocationStyle 对象添加到地图上aMap.setMyLocationStyle(myLocationStyle);aMap.setLocationSource(this);// 设置定位监听aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false// 设置定位的类型为定位模式:定位(AMap.LOCATION_TYPE_LOCATE)、跟随(AMap.LOCATION_TYPE_MAP_FOLLOW)// 地图根据面向方向旋转(AMap.LOCATION_TYPE_MAP_ROTATE)三种模式// aMap.setMyLocationType(AMap.MAP_TYPE_SATELLITE);// 设置地图可视缩放大小aMap.moveCamera(CameraUpdateFactory.zoomTo(14));aMap.getUiSettings().setCompassEnabled(true);// 设置指南针aMap.getUiSettings().setScaleControlsEnabled(true);// 设置比例尺LatLng latLng = new LatLng(31.383755, 118.438321);MarkerOptions otMarkerOptions = new MarkerOptions();otMarkerOptions.position(latLng);otMarkerOptions.visible(true);//设置可见otMarkerOptions.title("芜湖市").snippet("芜湖市:31.383755, 118.438321");//里面的内容自定义otMarkerOptions.draggable(true);//下面这个是标记上面这个经纬度在地图的位置是// otMarkerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_mark));//下面这个是自定义的标记图标使用方法otMarkerOptions.icon(ImageNormal(0));aMap.addMarker(otMarkerOptions);aMap.setOnMarkerClickListener(this);aMap.setOnMapClickListener(this);}/** * 自定义标记物的图片(未选中状态) * @param i * @return */private BitmapDescriptor ImageNormal(int i) {//这个布局是自定义的,这面的内容同样自动,在poi_view 这个xml文件里有一个有一张图片,有一个TextView//被我删除了,这个TextView,有需要的网友可以自己设置,这个TextView里面可以写数字,或者ABCD…更具需求//各位自由发挥View view = null;view = getLayoutInflater().inflate(R.layout.poi_view, null);RelativeLayout ly = (RelativeLayout) view.findViewById(R.id.view_mark);// TextView tv = (TextView) view.findViewById(R.id.poi_mark_img);// tv.setText(i + "");// tv.setPadding(0, 0, 0, 25);// tv.setBackgroundResource(R.drawable.poi_mark_normal);BitmapDescriptor bitmap = BitmapDescriptorFactory.fromView(view);return bitmap;}/** * 自定义标记物图片(选中状态) * @param i * @return */private BitmapDescriptor ImagePress(int i) {//使用方法同上View view = null;view = getLayoutInflater().inflate(R.layout.poi_view, null);// TextView tv = (TextView) view.findViewById(R.id.poi_mark_img);// tv.setText(i + "");// tv.setPadding(0, 0, 0, 25);// tv.setBackgroundResource(R.drawable.poi_mark_press);BitmapDescriptor bitmap = BitmapDescriptorFactory.fromView(view);return bitmap;}/** * 方法必须重写 */@Overrideprotected void onResume() {super.onResume();mapView.onResume();}/** * 方法必须重写 */@Overrideprotected void onPause() {super.onPause();mapView.onPause();deactivate();}/** * 方法必须重写 */@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);mapView.onSaveInstanceState(outState);}/** * 方法必须重写 */@Overrideprotected void onDestroy() {super.onDestroy();mapView.onDestroy();if (popWindow != null) {//隐藏popwindowpopWindow.dismiss();}}/** * 激活定位 */@Overridepublic void activate(OnLocationChangedListener listener) {mListener = listener;if (mAMapLocationManager == null) {mAMapLocationManager = LocationManagerProxy.getInstance(this);// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,// 注意设置合适的定位时间的间隔,并且在合适时间调用removeUpdates()方法来取消定位请求// 在定位结束后,在合适的生命周期调用destroy()方法// 其中如果间隔时间为-1,则定位只定一次mAMapLocationManager.requestLocationData(LocationProviderProxy.AMapNetwork, 60 * 1000, 10, this);}}/** * 停止定位 */@Overridepublic void deactivate() {mListener = null;if (mAMapLocationManager != null) {mAMapLocationManager.removeUpdates(this);mAMapLocationManager.destroy();}mAMapLocationManager = null;}@Overridepublic void onLocationChanged(Location location) {}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {}@Overridepublic void onProviderEnabled(String provider) {}@Overridepublic void onProviderDisabled(String provider) {}/** * 定位成功后回调函数 */@Overridepublic void onLocationChanged(AMapLocation amapLocation) {if (mListener != null && amapLocation != null) {if (amapLocation.getAMapException().getErrorCode() == 0) {mListener.onLocationChanged(amapLocation);// 显示系统小蓝点}}}@Overridepublic boolean onMarkerClick(Marker marker) {currentMarker = marker;Toast.makeText(this, "你点击了的是" + marker.getTitle(), 10000).show();if(popWindow !=null){//先把原来的给隐藏起来popWindow.dismiss();}popWindow = new StationInfoPopupWindow(this);popWindow.showAsDropDown(mpop);return false;}/** * 点击地图其他地方时,隐藏InfoWindow,和popWindow弹出框 */@Overridepublic void onMapClick(LatLng latLng) {if (currentMarker != null) {currentMarker.hideInfoWindow();//隐藏InfoWindow框popWindow.dismiss();}}}

图上看到的那个就是我自定义的图片,这个有些时候都是需要自定的,高德给的原生的不应符合我们的需求

当点击那个图上那个标记时就出现如下界面。

然后就是路劲规划了,,点击到这里去按钮就跳转到路径规划的界面

下面吧popWidow代码贴出来

问候不一定要慎重其事,但一定要真诚感人

Android高德地图开发详解

相关文章:

你感兴趣的文章:

标签云: