Android 高德地圖示記一組Marker,並有點選事件(上)
阿新 • • 發佈:2019-02-14
需求:公司需要完成一項功能,把一組座標顯示在高德地圖上,目的方便使用者檢視那個座標離自己最近,並點選座標選中地址
小編在網上瀏覽了大量文件,都未找到解決方法委屈,於是自己看了demo,現總結如下:
1,高德地圖2D版本怎麼都不能顯示多個marker,不要問我為什麼。。。所以要用3D版本.
2,不說了,上程式碼
GeocoderActivity.java
package com.ihealthink.ksjk.baidumap;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.graphics.BitmapFactory;
import android.graphics.Point;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.BounceInterpolator;
import android.view.animation.Interpolator;
import android.widget.ImageView;
import com.amap.api.maps.AMap;
import com.amap.api.maps.Projection;
import com.amap.api.maps.AMap.OnMarkerClickListener;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.ihealthink.ksjk.R;
import com.ihealthink.ksjk.utils.StringUtils;
/**
*
* 高德地圖
* 地理編碼與逆地理編碼功能介紹
*/
public class GeocoderActivity extends Activity implements
OnMarkerClickListener,OnClickListener{
private AMap aMap;
private MapView mapView;
ImageView exam_addr_back=null;
int index=0;
private List<MarkerOptions> markers=new ArrayList<MarkerOptions>();
private List<Marker> mList=new ArrayList<Marker>();
StringUtils strutils=new StringUtils();
private ArrayList<String> hslist=new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.geocoder_activity);
mapView = (MapView) findViewById(R.id.map);
mapView.onCreate(savedInstanceState);
Bundle bundle = this.getIntent().getExtras();
if (bundle != null) {
hslist=bundle.getStringArrayList("hslist");
index=bundle.getInt("index");
}
init();
}
/**
* 初始化AMap物件
*/
private void init() {
if (aMap == null) {
aMap = mapView.getMap();
}
exam_addr_back=(ImageView) findViewById(R.id.exam_addr_back);
setUpMap();
}
private void setUpMap() {
aMap.setOnMarkerClickListener(this);// 設定點選marker事件監聽器
exam_addr_back.setOnClickListener(this);
addMarkersToMap();// 往地圖上新增marker
}
private void addMarkersToMap() {
ArrayList<MarkerOptions> markerOptionlst = new ArrayList<MarkerOptions>();
if(hslist!=null){
for (String hs : hslist) {
String[] coordinatearr=strutils.convertStrToArraySize(hs);
if(coordinatearr!=null){
if(coordinatearr.length>1){
String longitude=coordinatearr[3];
String latitude=coordinatearr[4];
double dlong=Double.valueOf(longitude).doubleValue();
double dlat=Double.valueOf(latitude).doubleValue();
MarkerOptions markerOption = new MarkerOptions();
markerOption.position(new LatLng(dlat, dlong));
markerOption.title(coordinatearr[1]).snippet(coordinatearr[2]);
markerOption.draggable(true);
markerOption.icon(
BitmapDescriptorFactory.fromBitmap(BitmapFactory
.decodeResource(getResources(),
R.drawable.icon_marka)));
markerOption.setFlat(true);
markerOptionlst.add(markerOption);
}
}
}
mList = aMap.addMarkers(markerOptionlst, true);
}
}
private LatLng getpositionformlist(int index){
LatLng latLng=null;
String[] coordinatearr=strutils.convertStrToArraySize(hslist.get(index));
if(coordinatearr!=null){
if(coordinatearr.length>0){
String longitude=coordinatearr[3];
String latitude=coordinatearr[4];
double dlong=Double.valueOf(longitude).doubleValue();
double dlat=Double.valueOf(latitude).doubleValue();
latLng=new LatLng(dlat, dlong);
}
}
return latLng;
}
public void jumpPoint(final Marker marker,int index) {
final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();
Projection proj = aMap.getProjection();
final LatLng latLng=getpositionformlist(index);
Point startPoint = proj.toScreenLocation(latLng);
startPoint.offset(0, -50);
final LatLng startLatLng = proj.fromScreenLocation(startPoint);
final long duration = 1500;
final Interpolator interpolator = new BounceInterpolator();
handler.post(new Runnable() {
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - start;
float t = interpolator.getInterpolation((float) elapsed
/ duration);
double lng = t * latLng.longitude + (1 - t)
* startLatLng.longitude;
double lat = t * latLng.latitude + (1 - t)
* startLatLng.latitude;
marker.setPosition(new LatLng(lat, lng));
if (t < 1.0) {
handler.postDelayed(this, 16);
}
}
});
}
/**
* 方法必須重寫
*/
@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 onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.exam_addr_back:
finish();
break;
default:
break;
}
}
@Override
public boolean onMarkerClick(Marker marker) {
// TODO Auto-generated method stub
for(int i=0;i<mList.size();i++){
if (marker.equals(mList.get(i))) {
if (aMap != null) {
jumpPoint(marker,i);
}
}
}
return false;
}
}
geocoder_activity.xml
<?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:orientation="vertical" >
<TextView
android:id="@+id/mark_listenter_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="拖動marker1"
android:visibility="gone" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ImageView
android:id="@+id/exam_addr_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginLeft="6dp"
android:focusable="true"
android:padding="10dp"
android:src="@drawable/map_back_btn"/>
</FrameLayout>
</LinearLayout>