在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包含了以上功能