当前位置: 移动技术网 > IT编程>移动开发>Android > Android高德自定义marker点标记与infoWindow窗体

Android高德自定义marker点标记与infoWindow窗体

2020年03月25日  | 移动技术网IT编程  | 我要评论

μm,北京国政通,阿根廷教练

自定义marker与infowindow窗体

 

 

1.展示地图布局的xml

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">

    <com.amap.api.maps.mapview
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</linearlayout>

2.activity自定义marker与infowindow(代码注释详细)

 

/**
 * created by yyyyq on 2020/3/24
 */
public class mainactivity extends appcompatactivity implements amap.onmarkerclicklistener, amap.infowindowadapter, amap.onmapclicklistener {

    private mapview mapview = null;
    private amap amap;
    private uisettings uisettings;
    //存放所有点的经纬度
    latlngbounds.builder boundsbuilder = new latlngbounds.builder();
    //当前点击的marker
    private marker clickmaker;
    //自定义窗体
    view infowindow = null;

    @override
    protected void oncreate(bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        setcontentview(r.layout.activity_main);
        mapview = findviewbyid(r.id.map);
        mapview.oncreate(savedinstancestate);
        if (amap == null) {
            amap = mapview.getmap();
            uisettings = amap.getuisettings();
            //设置地图属性
            setmapattribute();
        }

        //模拟数据源
        list<map<string, string>> list = getdata();

        //循坏在地图上添加自定义marker
        for (int i = 0; i < list.size(); i++) {
            latlng latlng = new latlng(double.parsedouble(list.get(i).get("latitude")), double.parsedouble(list.get(i).get("longitude")));
            markeroptions markeroption = new markeroptions();
            markeroption.position(latlng);
            markeroption.title(list.get(i).get("title"));
            markeroption.snippet(list.get(i).get("content"));
            //自定义点标记的icon图标为drawable文件下图片
            markeroption.icon(bitmapdescriptorfactory.frombitmap(bitmapfactory.decoderesource(getresources(), r.drawable.ditu_yiliao)));
            markeroption.draggable(false);
            amap.addmarker(markeroption);
            //将所有marker经纬度include到boundsbuilder中
            boundsbuilder.include(latlng);
        }
        //更新地图状态
        amap.animatecamera(cameraupdatefactory.newlatlngbounds(boundsbuilder.build(), 10));
    }


    /**
     * 设置地图属性
     */
    private void setmapattribute() {
        //设置默认缩放级别
        amap.movecamera(cameraupdatefactory.zoomto(12));
        //隐藏的右下角缩放按钮
        uisettings.setzoomcontrolsenabled(false);
        //设置marker点击事件监听
        amap.setonmarkerclicklistener(this);
        //设置自定义信息窗口
        amap.setinfowindowadapter(this);
        //设置地图点击事件监听
        amap.setonmapclicklistener(this);
    }

    /**
     * 模拟数据源
     */
    private list<map<string, string>> getdata() {
        list<map<string, string>> list = new arraylist<>();
        for (int i = 1; i < 11; i++) {
            map<string, string> map = new hashmap<>();
            map.put("title", "标题no." + i);
            map.put("content", "这是第" + i + "个marker的内容");
            map.put("latitude", (43 + math.random() + "").substring(0, 9));
            map.put("longitude", (125 + math.random() + "").substring(0, 10));
            list.add(map);
        }
        return list;
    }

    /**
     * marker点击事件
     */
    @override
    public boolean onmarkerclick(marker marker) {
        clickmaker = marker;
        //点击当前marker展示自定义窗体
        marker.showinfowindow();
        //返回true 表示接口已响应事,无需继续传递
        return true;
    }

    /**
     * 监听自定义窗口infowindow事件回调
     */
    @override
    public view getinfowindow(marker marker) {
        if (infowindow == null) {
            infowindow = layoutinflater.from(this).inflate(r.layout.amap_info_window, null);
        }
        render(marker, infowindow);
        return infowindow;
    }

    /**
     * 自定义infowindow窗口
     */
    private void render(marker marker, view infowindow) {
        textview title = infowindow.findviewbyid(r.id.info_window_title);
        textview content = infowindow.findviewbyid(r.id.info_window_content);
        title.settext(marker.gettitle());
        content.settext(marker.getsnippet());
    }

    /**
     * 不能修改整个infowindow的背景和边框,返回null
     */
    @override
    public view getinfocontents(marker marker) {
        return null;
    }

    /**
     * 地图点击事件
     * 点击地图区域让当前展示的窗体隐藏
     */
    @override
    public void onmapclick(latlng latlng) {
        //判断当前marker信息窗口是否显示
        if (clickmaker != null && clickmaker.isinfowindowshown()) {
            clickmaker.hideinfowindow();
        }

    }
}

 

3.自定义infowindow窗体布局

 

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="160dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:background="@drawable/infowindow"
    android:orientation="vertical">
    <!--@drawable/infowindow为.9图-->

    <textview
        android:id="@+id/info_window_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="5dp"
        android:textcolor="#333"
        android:textsize="14sp" />

    <textview
        android:id="@+id/info_window_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="5dp"
        android:textcolor="#333"
        android:textsize="12sp" />

</linearlayout>

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网