实例介绍
【实例简介】
【实例截图】
【核心代码】
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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论