1. 程式人生 > >Android 高德地圖示記一組Marker,並有點選事件(上)

Android 高德地圖示記一組Marker,並有點選事件(上)

需求:公司需要完成一項功能,把一組座標顯示在高德地圖上,目的方便使用者檢視那個座標離自己最近,並點選座標選中地址
小編在網上瀏覽了大量文件,都未找到解決方法委屈,於是自己看了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>