Android高德地图使用

Swift基础 - - 高德地图实践(一)中使用swift来使用高德地图,这里使用Android实践高德地图包含定位,移动地图动画,获取网络数据,marker标记以及点击,Infowindow自定义界面以及点击,以及点击无marker地图上面隐藏infowindow等功能。直接看代码

package com.carmap.ui;

import android.graphics.Color;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

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.maps.AMap;
import com.amap.api.maps.AMap.InfoWindowAdapter;
import com.amap.api.maps.AMap.OnCameraChangeListener;
import com.amap.api.maps.AMap.OnInfoWindowClickListener;
import com.amap.api.maps.AMap.OnMapClickListener;
import com.amap.api.maps.AMap.OnMapLoadedListener;
import com.amap.api.maps.AMap.OnMarkerClickListener;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.LocationSource;
import com.amap.api.maps.MapView;
import com.amap.api.maps.UiSettings;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.CameraPosition;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.maps.model.MyLocationStyle;
import com.carmap.R;
import com.carmap.ui.base.BaseActivity;

/**
 *
 * @author jwzhangjie
 *
 */
public class MapActivity extends BaseActivity implements AMapLocationListener,
		LocationSource, OnMarkerClickListener, OnInfoWindowClickListener,
		InfoWindowAdapter, OnMapLoadedListener, OnCameraChangeListener,
		AnimationListener, OnClickListener, OnMapClickListener {

	private MapView mapView;
	private AMap aMap;
	private LocationManagerProxy aMapManager;
	private OnLocationChangedListener mListener;
	private UiSettings mUiSettings;
	private AMapLocation aLocation;

	private Animation centerMarker;
	private ImageView centerImageView;
	private Marker currentMarker;

	private boolean isFirst = true;

	private ImageView locate;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_map);
		mapView = (MapView) findViewById(R.id.mapView);
		mapView.onCreate(savedInstanceState);// 此方法必须重写
		centerMarker = AnimationUtils.loadAnimation(this,
				R.anim.center_map_bounds);
		centerImageView = (ImageView) findViewById(R.id.centerMarkerImg);
		locate = (ImageView) findViewById(R.id.locate);
		initMap();
	}

	/**
	 * 初始化AMap对象
	 */
	private void initMap() {
		if (aMap == null) {
			aMap = mapView.getMap();
			mUiSettings = aMap.getUiSettings();
		}
		// 自定义系统定位小蓝点
		MyLocationStyle myLocationStyle = new MyLocationStyle();
		myLocationStyle.myLocationIcon(BitmapDescriptorFactory
				.fromResource(R.drawable.transdrawable));// 设置小蓝点的图标
		myLocationStyle.strokeColor(Color.argb(0, 0, 0, 0));// 设置圆形的边框颜色
		myLocationStyle.radiusFillColor(Color.argb(0, 0, 0, 0));// 设置圆形的填充颜色
		myLocationStyle.strokeWidth(0f);// 设置圆形的边框粗细
		aMap.setMyLocationStyle(myLocationStyle);
		aMap.setMyLocationRotateAngle(180);
		aMap.setLocationSource(this);// 设置定位监听
		mUiSettings.setMyLocationButtonEnabled(false); // 是否显示默认的定位按钮
		aMap.setMyLocationEnabled(true);// 是否可触发定位并显示定位层
		aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);
		mUiSettings.setTiltGesturesEnabled(false);// 设置地图是否可以倾斜
		mUiSettings.setScaleControlsEnabled(true);// 设置地图默认的比例尺是否显示
		mUiSettings.setZoomControlsEnabled(false);
		initMapListener();
	}

	private void initMapListener() {
		aMap.setOnMapLoadedListener(this);
		aMap.setOnCameraChangeListener(this);
		aMap.setOnMarkerClickListener(this);
		aMap.setOnInfoWindowClickListener(this);
		aMap.setInfoWindowAdapter(this);// 设置自定义InfoWindow样式
		aMap.setOnMapClickListener(this);
		centerMarker.setAnimationListener(this);
		locate.setOnClickListener(this);
	}

	/**
	 * 方法必须重写
	 */
	@Override
	protected void onResume() {
		super.onResume();
		mapView.onResume();
	}

	/**
	 * 方法必须重写
	 */
	@Override
	protected void onPause() {
		super.onPause();
		mapView.onPause();
	}

	/**
	 * 方法必须重写
	 */
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		mapView.onSaveInstanceState(outState);
	}

	/**
	 * 方法必须重写
	 */
	@Override
	protected void onDestroy() {
		super.onDestroy();
		mapView.onDestroy();
	}

	@Override
	public void onLocationChanged(Location location) {

	}

	@Override
	public void onStatusChanged(String provider, int status, Bundle extras) {

	}

	@Override
	public void onProviderEnabled(String provider) {

	}

	@Override
	public void onProviderDisabled(String provider) {

	}

	@Override
	public void onLocationChanged(AMapLocation aLocation) {
		if (aLocation != null) {
			this.aLocation = aLocation;
			if (mListener != null)
				mListener.onLocationChanged(aLocation);// 显示系统小蓝点
			if (isFirst) {
				isFirst = false;
				aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(
						aLocation.getLatitude(), aLocation.getLongitude())));
				CameraUpdateFactory.zoomTo(16);
				MarkerOptions markerOption = new MarkerOptions();
				markerOption.position(new LatLng(aLocation.getLatitude(),
						aLocation.getLongitude()));
				markerOption.title("上海市").snippet("上海:34.341568, 108.940174");
				markerOption.draggable(true);
				Marker marker = aMap.addMarker(markerOption);
				marker.setObject("11");//这里可以存储用户数据
			}
		}
	}

	@SuppressWarnings("deprecation")
	@Override
	public void activate(OnLocationChangedListener listener) {
		mListener = listener;
		if (aMapManager == null) {
			aMapManager = LocationManagerProxy.getInstance(this);
			/*
			 * 1.0.2版本新增方法,设置true表示混合定位中包含gps定位,false表示纯网络定位,默认是true
			 */
			// Location API定位采用GPS和网络混合定位方式,时间最短是2000毫秒
			aMapManager.requestLocationUpdates(
					LocationProviderProxy.AMapNetwork, 2000, 10, this);
		}
	}

	/**
	 * 停止定位
	 */
	@Override
	public void deactivate() {
		mListener = null;
		if (aMapManager != null) {
			aMapManager.removeUpdates(this);
			aMapManager.destory();
		}
		aMapManager = null;
	}

	@Override
	public boolean onMarkerClick(Marker marker) {
		currentMarker = marker;
		Log.e("marker", marker.getObject() + "marker: " + marker.getPosition().latitude+" : "+marker);
		return false;
	}

	@Override
	public View getInfoContents(Marker marker) {
		Log.e("marker",
				marker.getObject() + "getInfoContents: " + marker.getId());
		return null;
	}

	@Override
	public View getInfoWindow(Marker marker) {
		Log.e("marker", marker.getObject() + "getInfoWindow: " + marker.getId());
		View infoWindow = getLayoutInflater().inflate(
				R.layout.custom_info_window, null);
		render(marker, infoWindow);
		return infoWindow;
	}

	@Override
	public void onInfoWindowClick(Marker marker) {
		Log.e("marker",
				marker.getObject() + "onInfoWindowClick: " + marker.getId());

	}

	@Override
	public void onMapLoaded() {
		centerImageView.startAnimation(centerMarker);
		CameraUpdateFactory.zoomTo(16);
		Log.e("load", "onMapLoaded");

	}

	@Override
	public void onCameraChange(CameraPosition arg0) {
	}

	@Override
	public void onCameraChangeFinish(CameraPosition arg0) {
		centerImageView.startAnimation(centerMarker);
		Log.e("load", "onCameraChangeFinish+获取后台数据");
	}

	@Override
	public void onAnimationStart(Animation animation) {
		centerImageView.setImageResource(R.drawable.green_pin_lift);
	}

	@Override
	public void onAnimationRepeat(Animation animation) {

	}

	@Override
	public void onAnimationEnd(Animation animation) {
		centerImageView.setImageResource(R.drawable.green_pin);
	}

	@Override
	public void onClick(View v) {
		int id = v.getId();
		switch (id) {
		case R.id.locate:
			Log.e("load", "locate");
			aMap.animateCamera(CameraUpdateFactory.changeLatLng(new LatLng(
					aLocation.getLatitude(), aLocation.getLongitude())));
			break;
		default:
			break;
		}
	}

	/**
	 * 自定义infowinfow窗口,动态修改内容的
	 */
	public void render(Marker marker, View view) {

	}

	// 点击非marker区域,将显示的InfoWindow隐藏
	@Override
	public void onMapClick(LatLng latLng) {
		if (currentMarker != null) {
			currentMarker.hideInfoWindow();
		}
	}
}
package com.carmap.ui.base;

import android.content.Intent;
import android.support.v4.app.FragmentActivity;

/**
 *
 * @author jwzhangjie
 *
 */
public class BaseActivity extends FragmentActivity{

	public Intent startIntent;

	public void startChange(Class name){
		startIntent = new Intent();
		startIntent.setClass(this, name);
		startActivity(startIntent);
	}

	public void startChange(Class name, boolean close){
		startChange(name);
		if(close)finish();
	}

}

处于地图中心点的图片的弹跳动画设置如下,bounce_interpolator是一个弹跳的动画,在弹跳和停止是两张不同的图片,所以在onAnimationStart和onAnimationEnd分别设置。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:fillEnabled="true"
    android:interpolator="@android:anim/bounce_interpolator" >

    <translate
        android:duration="1000"
        android:fromYDelta="-100%"
        android:toYDelta="0%" />

</set>
@Override
	public void onAnimationStart(Animation animation) {
		centerImageView.setImageResource(R.drawable.green_pin_lift);
	}

	@Override
	public void onAnimationRepeat(Animation animation) {

	}

	@Override
	public void onAnimationEnd(Animation animation) {
		centerImageView.setImageResource(R.drawable.green_pin);
	}

上面的MapActivity.java包含了以上功能

时间: 2024-08-05 03:58:42

Android高德地图使用的相关文章

Android高德地图自定义Markers的例子

下文为各位重点介绍关于Android高德地图自定义Markers的例子,希望这篇文章能够让各位理解到Android高德地图自定义Markers的方法. 之前的博客里说了地图的嵌入和定位,今天就说说在地图上显示一些我们想要的.在地图中有自带的Markers(标记),但是它只显示一个椭圆的图标,一般是不符合我们的需求的,这样就要我们自己来自定义.首先标记有下面一些属性; 1.position(Required) 在地图上标记位置的经纬度值.参数不能为空. 2.title 当用户点击标记,在信息窗口上

Android 高德地图 Native method not found: com.autonavi.amap.mapcore.MapCore.nativeNewInstance:(Ljava/lan

Android 高德地图  java.lang.UnsatisfiedlinkError   Native method not found: com.autonavi.amap.mapcore.MapCore.nativeNewInstance:(Ljava/lang/String;) 遇到一个bug 别的机型上没有碰到 只在lenovo的手机上  使用高德地图出现了bug   看了下log日志出现了 Native method not found: com.autonavi.amap.map

android 高德地图出现【定位失败key鉴权失败】

如题:android 高德地图出现[定位失败key鉴权失败] 原因:使用的是debug模式下的SHA1,发布的版本正确获取SHA1的方式见: 方法二使用 keytool(jdk自带工具),按照如下步骤进行操作:1.运行进入控制台. 2.在弹出的控制台窗口中输入 cd .android 定位到 .android 文件夹. 3.继续在控制台输入命令.开发模式使用 debug.keystore,命令为:keytool -list -v -keystore debug.keystore发布模式使用 ap

Android高德地图开发——准备阶段

1.地图SDK下载 高德地图Android SDK主要包括地图SDK.搜索SDK和定位SDK.其中地图SDK有包括2D地图SDK和3D地图SDK. 3D SDK, 提供矢量地图显示.离线地图等功能. 2D SDK, 提供栅格地图显示.覆盖物绘制等功能. 搜索 SDK,提供兴趣点搜索.路径规划.公交查询.地理编码等功能. 定位 SDK,提供定位.逆地理编码(地址的文字描述).以及地理围栏功能. http://lbs.amap.com/api/android-sdk/down/(地图sdk和搜索sd

Android高德地图开发详解

这段时间开发的时候用到了高德地图,对高德地图开发有心得体会,现在分享给大家,对我开发过百度地图的我来说,总体来说高德地图Demo,没有百度讲解的详细 个人更偏向于使用百度地图,但是没办发,项目需要使用高德地图,我开发的是定位,更具经纬度添加标记,标记点击事件,以及路线规划废话不多说,上代代码 那么首先导入高德给的jar,包,我开发的是2d地图, 这个包结构图,高德题图api也提供了步骤,就不多说了 下面添加权限,设置key <uses-permission android:name="an

Android 高德地图的定位,周边搜索

刚弄完这两个功能,当然是结合官网例子实现的.效果还行,稍作优化便可整合到app使用.在这里做一下总结,及说明下我的思路. 刚开始上手感觉比较乱学起来也比较累,方法,类太多,直接复制各种错,还不知道为什么这么做.现在我们一起交流下实现的思路: 1:定位:这是所有地图功能实现的基础,所以不管要实现诸如周边搜索啊,导航啊什么的都需要基于定位. 如何定位:官网上例子也很详细,主要是实现几个监听,并实现方法: aMap.setLocationSource(this);// 设置定位监听 //绑定监听 ma

android高德地图绘制线 渐变处理

这个是为了实现淘宝物流轨迹的那种样式,轨迹路线是渐变色. 先说下物流轨迹实现流程. 1.高德地图3d.导航.搜索三个sdk的支持 2.通过导航获取一条路径,这个路径包含的点相当多,可能有上万个. 3.利用路径中的点划线,划线的点和导航提供的点是用的格式不一样,需要简单转换一下. 4.使用android自带的api “ArgbEvaluator”来计算每个点的颜色值. 5.把所有的颜色值放进一个数组,然后使用.colorValues(colorList).useGradient(true)这两个设

Android 高德地图No implementation found for long com.autonavi.amap.mapcore.MapCore

此篇博客最后更新时间写自2016.5.18.当下高德地图jar版本为3.3.1. 使用高德地图碰到此问题,纠结许久(接近4个多小时). 记录在此,希望遇到相同问题的读者可以有所借鉴. 错误截图: 导致问题的原因主要有两种: 1.so文件操作不当问题.可能是so文件与jar不匹配,也可能是so文件未导入. 解决办法: 下载与jar相匹配的jar.sdk下载网址:http://lbs.amap.com/api/android-sdk/down/ 2.由于在X86手机上运行,而此时高德地图官网并未发布

Android高德地图的定位

看注释解析基本上OK了. 布局,权限: <!--用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <!--用于访问GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCAT