Android高德地图marker自定义弹框窗口
程序员文章站
2022-04-23 19:07:07
本文实例为大家分享了android高德地图marker自定义弹框窗口的具体代码,供大家参考,具体内容如下最终效果:1.gradle里添加高德地图依赖implementation 'com.amap.a...
本文实例为大家分享了android高德地图marker自定义弹框窗口的具体代码,供大家参考,具体内容如下
最终效果:
1.gradle里添加高德地图依赖
implementation 'com.amap.api:map2d:latest.integration'//2d地图功能 implementation 'com.amap.api:location:latest.integration'//定位功能
2.如果要用到定位的话,就首先到高德控制台里面加入本应用的信息获取到key,再在application里设置key,并在androidmanifest.xml中应用mainapp
public class mainapp extends android.app.application { @override public void oncreate() { super.oncreate(); //高德地图注册 amaplocationclient.setapikey("0f1d26a891783cc4d632965a7cc08443"); } }
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hk.testapplication"> <uses-permission android:name="android.permission.internet" /> <!-- 访问网络权限 --> <uses-permission android:name="android.permission.access_coarse_location" /> <!-- 用于访问gps定位 --> <uses-permission android:name="android.permission.access_fine_location" /> <uses-permission android:name="android.permission.access_location_extra_commands" /> <application android:name=".mainapp" android:allowbackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundicon="@mipmap/ic_launcher_round" android:supportsrtl="true" android:theme="@style/theme.testapplication"> <activity android:name=".mainactivity"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> </application> </manifest>
3. 创建activity_main.xml地图布局文件
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.constraintlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".mainactivity"> <com.amap.api.maps2d.mapview android:id="@+id/mapview" android:layout_width="match_parent" android:layout_height="match_parent"> </com.amap.api.maps2d.mapview> </androidx.constraintlayout.widget.constraintlayout>
4. mainactivity里加载地图,添加marker
@override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mmapview = findviewbyid(r.id.mapview); mmapview.oncreate(savedinstancestate);// 此方法必须重写 mmap = mmapview.getmap(); initpoint(30.665534,104.070929); //地图中心点位 initmarker();//测试点位 } /** * 绘制marker */ private void initmarker() { mmarkers = new arraylist<>(); //绘制marker 实际使用时会循环创建marker并填入数据 marker marker = mmap.addmarker(new markeroptions() .anchor(0.5f, 0.5f) .position(new latlng(30.665534,104.070929)) .title("标题数据") .snippet("消息数据") .icon(bitmapdescriptorfactory.frombitmap(bitmapfactory .decoderesource(getresources(), r.mipmap.ic_launcher_round))));//点位图标 mmarkers.add(marker); } /** * 加载地图中心点 */ private void initpoint(double latitude, double longitude) { latlng marker1 = new latlng(latitude, longitude); mmap.movecamera(cameraupdatefactory.changelatlng(marker1)); mmap.movecamera(cameraupdatefactory.zoomto(12)); } @override public void onresume() { super.onresume(); if (mmapview != null) mmapview.onresume(); //管理地图的生命周期 } @override public void onpause() { super.onpause(); if (mmapview != null) mmapview.onpause(); //管理地图的生命周期 } @override public void ondestroy() { super.ondestroy(); if (mmapview != null) mmapview.ondestroy(); //管理地图的生命周期 } }
5.添加弹框自定义布局view_map_infowindow.xml
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="50dp" android:minheight="50dp" android:minwidth="100dp" android:background="#ffff" android:gravity="center" > <imageview android:id="@+id/iv_left" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher"/> <textview android:layout_marginleft="10dp" android:layout_marginright="10dp" android:id="@+id/tv_msg" android:text="自定义布局" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <imageview android:id="@+id/iv_right" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher"/>
记得设置布局最小高度和宽度,不然窗口会默认宽度高度,会使布局显示不完整
6.添加自定义弹框窗口adapter
/** *自定义地图弹框adapter * @author hk */ public class mapinfowinadapter implements amap.infowindowadapter, view.onclicklistener { private context mcontext; private latlng latlng; private textview mtvmsg; private imageview mivleft,mivright; private string msnippet,mtitle; @override public view getinfowindow(marker marker) { initdata(marker); view view = initview(); return view; } @override public view getinfocontents(marker marker) { return null; //因为是自定义的布局,返回null } public mapinfowinadapter(context context) { mcontext = context; } private void initdata(marker marker) { //当前点位经纬度 latlng = marker.getposition(); //当前点位带的消息信息 也可通过这个传输数据把数据转成json msnippet = marker.getsnippet(); //当前点位带的标题信息 mtitle = marker.gettitle(); } @nonnull private view initview() { //获取自定义的布局 view view = layoutinflater.from(mcontext).inflate(r.layout.view_map_infowindow, null); mtvmsg = (textview) view.findviewbyid(r.id.tv_msg); mivleft= (imageview) view.findviewbyid(r.id.iv_left); mivright= (imageview) view.findviewbyid(r.id.iv_right); mtvmsg.settext("我是自定义布局弹框"); mivleft.setonclicklistener(this); mivright.setonclicklistener(this); return view; } @override public void onclick(view v) { switch (v.getid()){ case r.id.iv_left: toast.maketext(mcontext,"我是左边按钮点击事件",toast.length_short).show(); break; case r.id.iv_right: toast.maketext(mcontext,"我是右边按钮点击事件",toast.length_short).show(); break; } } }
7.地图绑定adapter
//重要 创建自定义适配器 mapinfowinadapter adapter = new mapinfowinadapter(this); mmap.setinfowindowadapter(adapter);//设置自定义窗口adapter
现在点击marker就会弹出我们自定义的布局了
8.点击地图或弹框关闭弹框窗口
mmap.setoninfowindowclicklistener(this);//弹框窗口点击事件 mmap.setonmapclicklistener(this);//地图点击事件 @override public void onmapclick(latlng latlng) { //点击地图区域关闭所有窗口 for (marker marker : mmarkers) { marker.hideinfowindow(); } } @override public void oninfowindowclick(marker marker) { if (marker.isinfowindowshown()) { marker.hideinfowindow();//再次点击窗口就隐藏窗口 } }
到此自定义弹框窗口就完成了,以下为完整mainactivity代码
public class mainactivity extends appcompatactivity implements amap.oninfowindowclicklistener, amap.onmapclicklistener { private amap mmap; private list<marker> mmarkers; private mapview mmapview; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mmapview = findviewbyid(r.id.mapview); mmapview.oncreate(savedinstancestate);// 此方法必须重写 mmap = mmapview.getmap(); mmap.setonmapclicklistener(this);//地图点击事件 initpoint(30.665534,104.070929); //地图中心点位 initmarker();//测试点位 } /** * 绘制marker */ private void initmarker() { mmarkers = new arraylist<>(); //重要 创建自定义适配器 mapinfowinadapter adapter = new mapinfowinadapter(this); mmap.setinfowindowadapter(adapter);//设置自定义窗口adapter mmap.setoninfowindowclicklistener(this); //绘制marker 实际使用时会循环创建marker并填入数据 marker marker = mmap.addmarker(new markeroptions() .anchor(0.5f, 0.5f) .position(new latlng(30.665534,104.070929)) .title("标题数据") .snippet("消息数据") .icon(bitmapdescriptorfactory.frombitmap(bitmapfactory .decoderesource(getresources(), r.mipmap.ic_launcher_round))));//点位图标 mmarkers.add(marker); } /** * 加载地图中心点 */ private void initpoint(double latitude, double longitude) { latlng marker1 = new latlng(latitude, longitude); mmap.movecamera(cameraupdatefactory.changelatlng(marker1)); mmap.movecamera(cameraupdatefactory.zoomto(12)); } @override public void onmapclick(latlng latlng) { //点击地图区域关闭所有窗口 for (marker marker : mmarkers) { marker.hideinfowindow(); } } @override public void oninfowindowclick(marker marker) { if (marker.isinfowindowshown()) { marker.hideinfowindow();//再次点击窗口就隐藏窗口 } } @override public void onresume() { super.onresume(); if (mmapview != null) mmapview.onresume(); //管理地图的生命周期 } @override public void onpause() { super.onpause(); if (mmapview != null) mmapview.onpause(); //管理地图的生命周期 } @override public void ondestroy() { super.ondestroy(); if (mmapview != null) mmapview.ondestroy(); //管理地图的生命周期 } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。