实例介绍
【实例简介】
【实例截图】
【核心代码】
package com.moos.marker.Sample; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.amap.api.maps.AMap; import com.amap.api.maps.CameraUpdate; import com.amap.api.maps.CameraUpdateFactory; import com.amap.api.maps.MapView; import com.amap.api.maps.model.BitmapDescriptor; 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.LatLngBounds; import com.amap.api.maps.model.Marker; import com.amap.api.maps.model.MarkerOptions; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; import com.moos.marker.Cluster.Cluster; import com.moos.marker.Cluster.ClusterClickListener; import com.moos.marker.Cluster.ClusterItem; import com.moos.marker.Cluster.ClusterItemImp; import com.moos.marker.Cluster.ClusterOverlay; import com.moos.marker.Cluster.ClusterRender; import com.moos.marker.Cluster.MarkerSign; import com.moos.marker.ClusterAnother.ClusterAnotherClickListener; import com.moos.marker.ClusterAnother.ClusterAnotherRender; import com.moos.marker.ClusterAnother.ClusterOverlayMerchant; import com.moos.marker.R; import com.moos.marker.Utils.ViewUtil; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import de.hdodenhof.circleimageview.CircleImageView; /** * @author moos * @date 2018/01/13 * @function display ui */ public class MainActivity extends AppCompatActivity implements View.OnClickListener { private MapView mapView = null; private Button bt_add_cluster_user, bt_add_cluster_merchant, bt_add_custom_marker; private AMap aMap; private ClusterOverlay clusterOverlayUser; private ClusterOverlayMerchant clusterOverlayMerchant; private List<ClusterItem> clusterItems = new ArrayList<>(); private List<ClusterItem> clusterItemsMerchant = new ArrayList<>(); private Map<Integer, Drawable> mBackDrawAbles = new HashMap<Integer, Drawable>(); private Map<Integer, Drawable> mBackDrawAblesMerchant = new HashMap<Integer, Drawable>(); private final LatLng centerLocation = new LatLng(31.206078,121.602948); private final String TYPE_MERCHANT = "02"; private final String TYPE_USER = "01"; private final String TAG = "Moos"; private int clusterRadius = 48; BitmapDescriptor bitmapDescriptor ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.mapView); mapView.onCreate(savedInstanceState);// 此方法必须重写 if (aMap == null) { aMap = mapView.getMap(); } initView(); initMap(); } private void initView() { bt_add_cluster_user = (Button) findViewById(R.id.add_cluster_user); bt_add_cluster_merchant = (Button) findViewById(R.id.add_cluster_merchant); bt_add_custom_marker = (Button) findViewById(R.id.add_custom_marker); bt_add_cluster_user.setOnClickListener(this); bt_add_cluster_merchant.setOnClickListener(this); bt_add_custom_marker.setOnClickListener(this); } private void initMap() { aMap.setMinZoomLevel(8); aMap.setMaxZoomLevel(20); aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition cameraPosition) { } @Override public void onCameraChangeFinish(CameraPosition cameraPosition) { clusterOverlayUser.updateClusters(); clusterOverlayMerchant.updateClusters(); } }); aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { Log.e(TAG,">>>>>>>>Marker点击事件响应了"); if(marker.getObject().getClass().equals(Cluster.class)){ //是聚合点 Cluster cluster = (Cluster) marker.getObject(); String type = cluster.getClusterItems().get(0).getClusterType(); Log.e(TAG,">>>>>>>点击了聚合点类型为" type); if(type.equals(TYPE_USER)){ //user cluster //Toast.makeText(MainActivity.this,"click user",Toast.LENGTH_SHORT).show(); clusterOverlayUser.responseClusterClickEvent(marker); return true; }else if(type.equals(TYPE_MERCHANT)){ //merchant cluster //Toast.makeText(MainActivity.this,"click merchant",Toast.LENGTH_SHORT).show(); clusterOverlayMerchant.responseClusterClickEvent(marker); return true; } }else if(marker.getObject().getClass().equals(MarkerSign.class)){ //是自定义marker Log.e(TAG,">>>>>>>点击了自定义marker"); MarkerSign sign = (MarkerSign) marker.getObject(); Toast.makeText(MainActivity.this,"这是自定义marker,代号" sign.getMarkerId(),Toast.LENGTH_SHORT).show(); } return false; } }); moveMapToPosition(centerLocation); } @Override protected void onDestroy() { super.onDestroy(); mapView.onDestroy(); } @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); } /** * by moos on 2018/01/12 * func:移动地图视角到某个精确位置 * @param latLng 坐标 */ private void moveMapToPosition(LatLng latLng) { CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition( new CameraPosition( latLng,//新的中心点坐标 16, //新的缩放级别 0, //俯仰角0°~45°(垂直与地图时为0) 0 //偏航角 0~360° (正北方为0) )); aMap.animateCamera(cameraUpdate, 300, new AMap.CancelableCallback() { @Override public void onFinish() { } @Override public void onCancel() { } }); } /** * by moos on 2018/01/12 * func:添加位置模拟数据 * @param centerPoint 中心点 * @param num 数量 * @param offset 经纬度模拟的可调偏移参数 * @return */ private List<LatLng> addSimulatedData(LatLng centerPoint, int num, double offset){ List<LatLng> data = new ArrayList<>(); if(num>0){ for(int i=0;i<num;i ){ double lat = centerPoint.latitude (Math.random()-0.5)*offset; double lon = centerPoint.longitude (Math.random()-0.5)*offset; LatLng latlng = new LatLng(lat,lon); data.add(latlng); } } return data; } /** * by moos on 2018/01/12 * func:添加个人聚合点 * @param locations */ private void addUserClustersToMap(final List<LatLng> locations){ for(int i=0;i<locations.size();i ){ ClusterItemImp clusterImp = new ClusterItemImp(locations.get(i), TYPE_USER); clusterItems.add(clusterImp); } if(clusterOverlayUser == null){ clusterOverlayUser = new ClusterOverlay(aMap,clusterItems,ViewUtil.dp2px(getApplicationContext(), clusterRadius),getApplicationContext()); }else { clusterOverlayUser.onDestroy(); clusterOverlayUser = null; clusterOverlayUser = new ClusterOverlay(aMap,clusterItems,ViewUtil.dp2px(getApplicationContext(), clusterRadius),getApplicationContext()); } clusterOverlayUser.setClusterRenderer(new ClusterRender() { @Override public Drawable getDrawAble(int clusterNum) { if (clusterNum <= 5) { Drawable bitmapDrawable = mBackDrawAbles.get(2); if (bitmapDrawable == null) { bitmapDrawable = getApplication().getResources().getDrawable( R.mipmap.marker_bg); mBackDrawAbles.put(2, bitmapDrawable); } return bitmapDrawable; } else { Drawable bitmapDrawable = mBackDrawAbles.get(3); if (bitmapDrawable == null) { bitmapDrawable = getApplication().getResources().getDrawable( R.mipmap.markers_bg); mBackDrawAbles.put(3, bitmapDrawable); } return bitmapDrawable; } } }); clusterOverlayUser.setOnClusterClickListener(new ClusterClickListener() { @Override public void onClick(Marker marker, List<ClusterItem> clusterItems) { Toast.makeText(MainActivity.this,">>>>>>>点击了用户聚合点",Toast.LENGTH_SHORT).show(); if(aMap.getCameraPosition().zoom<=18){ LatLngBounds.Builder builder = new LatLngBounds.Builder(); for (ClusterItem clusterItem : clusterItems) { builder.include(clusterItem.getPosition()); } LatLngBounds latLngBounds = builder.build(); aMap.animateCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds,10 )); } } }); } /** * by moos on 2018/01/12 * func:添加商家聚合点 * @param locations */ private void addMerchantClustersToMap(final List<LatLng> locations){ for(int i=0;i<locations.size();i ){ ClusterItemImp clusterImp = new ClusterItemImp(locations.get(i), TYPE_MERCHANT); clusterItemsMerchant.add(clusterImp); } if(clusterOverlayMerchant == null){ clusterOverlayMerchant = new ClusterOverlayMerchant(aMap,clusterItemsMerchant,ViewUtil.dp2px(getApplicationContext(), clusterRadius),getApplicationContext()); }else { clusterOverlayMerchant.onDestroy(); clusterOverlayMerchant = null; clusterOverlayMerchant = new ClusterOverlayMerchant(aMap,clusterItemsMerchant,ViewUtil.dp2px(getApplicationContext(), clusterRadius),getApplicationContext()); } clusterOverlayMerchant.setClusterAnotherRenderer(new ClusterAnotherRender() { @Override public Drawable getAnotherDrawAble(int clusterNum) { if (clusterNum <= 5) { Drawable bitmapDrawable = mBackDrawAblesMerchant.get(2); if (bitmapDrawable == null) { bitmapDrawable = getApplication().getResources().getDrawable( R.mipmap.marker_merchant_bg); mBackDrawAblesMerchant.put(2, bitmapDrawable); } return bitmapDrawable; } else { Drawable bitmapDrawable = mBackDrawAblesMerchant.get(3); if (bitmapDrawable == null) { bitmapDrawable = getApplication().getResources().getDrawable( R.mipmap.markers_merchant_bg); mBackDrawAblesMerchant.put(3, bitmapDrawable); } return bitmapDrawable; } } }); clusterOverlayMerchant.setOnClusterAnotherClickListener(new ClusterAnotherClickListener() { @Override public void onAnotherClick(Marker marker, List<ClusterItem> clusterItems) { Toast.makeText(MainActivity.this,">>>>>>>点击了商家聚合点",Toast.LENGTH_SHORT).show(); if(aMap.getCameraPosition().zoom<=18){ LatLngBounds.Builder builder = new LatLngBounds.Builder(); for (ClusterItem clusterItem : clusterItems) { builder.include(clusterItem.getPosition()); } LatLngBounds latLngBounds = builder.build(); aMap.animateCamera(CameraUpdateFactory.newLatLngBounds(latLngBounds,10 )); } } }); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.add_cluster_user: //添加个人聚合点 new Thread(new Runnable() { @Override public void run() { addUserClustersToMap(addSimulatedData(centerLocation, 60, 0.03)); } }).start(); break; case R.id.add_cluster_merchant: //添加聚合点 new Thread(new Runnable() { @Override public void run() { addMerchantClustersToMap(addSimulatedData(centerLocation, 30, 0.022)); } }).start(); break; case R.id.add_custom_marker: //添加自定义Marker addCustomMarkersToMap(); break; } } /** * by moos on 2018/01/12 * func:自定义监听接口,用来marker的icon加载完毕后回调添加marker属性 */ public interface OnMarkerIconLoadListener{ void markerIconLoadingFinished(View view); } /** * by moos on 2018/01/12 * func:定制化marker的图标 * @return */ private void customizeMarkerIcon(String url, final OnMarkerIconLoadListener listener) { final View markerView = LayoutInflater.from(this).inflate(R.layout.marker_bg, null); final CircleImageView icon = (CircleImageView) markerView.findViewById(R.id.marker_item_icon); Glide.with(this) .load(url "!/format/webp") .asBitmap() .thumbnail(0.2f) .diskCacheStrategy(DiskCacheStrategy.NONE) .centerCrop() .into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) { //待图片加载完毕后再设置bitmapDes icon.setImageBitmap(bitmap); bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(ViewUtil.convertViewToBitmap(markerView)); listener.markerIconLoadingFinished(markerView); } }); } /** * by moos on 2018/01/12 * func:添加单个自定义marker * @param latLng 位置 * @param sign marker标记 */ private void addCustomMarker(final LatLng latLng, final MarkerSign sign) { String url = "http://ucardstorevideo.b0.upaiyun.com/test/e8c8472c-d16d-4f0a-8a7b-46416a79f4c6.png"; final MarkerOptions markerOptions = new MarkerOptions(); markerOptions.setFlat(true); markerOptions.anchor(0.5f, 0.5f); markerOptions.position(new LatLng(latLng.latitude, latLng.longitude)); customizeMarkerIcon(url, new OnMarkerIconLoadListener() { @Override public void markerIconLoadingFinished(View view) { //bitmapDescriptor = BitmapDescriptorFactory.fromView(view); Marker marker; markerOptions.icon(bitmapDescriptor); marker = aMap.addMarker(markerOptions); marker.setObject(sign); } }); } /** * by moos on 2018/01/12 * func:批量添加自定义marker到地图上 */ private void addCustomMarkersToMap(){ List<LatLng> locations= new ArrayList<>(); locations = addSimulatedData(centerLocation, 20, 0.02); for(int i = 0;i<locations.size();i ){ addCustomMarker(locations.get(i), new MarkerSign(i)); } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论