QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 3275|回复: 0

[Android/IOS] 高德地图marker自定义弹框窗口

[复制链接]

等级头衔

积分成就    金币 : 2841
   泡泡 : 1516
   精华 : 6
   在线时间 : 1294 小时
   最后登录 : 2024-11-21

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2021-4-22 20:42:31 | 显示全部楼层 |阅读模式
1.gradle里添加高德地图依赖6 p9 a! d# ?! w- R0 A( B
  1. implementation 'com.amap.api:map2d:latest.integration'//2d地图功能
  2. implementation 'com.amap.api:location:latest.integration'//定位功能
2.如果要用到定位的话,就首先到高德控制台里面加入本应用的信息获取到key,再在Application里设置key,并在AndroidManifest.xml中应用MainApp. k2 A" e0 B# O, D, J9 o
  1. public class MainApp extends android.app.Application {
  2.     @Override
  3.     public void onCreate() {
  4.         super.onCreate();
  5.         //高德地图注册
  6.         AMapLocationClient.setApiKey("0f1d26a891783cc4d632965a7cc08443");
  7.     }
  8. }
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2.     package="com.hk.testapplication">
  3.     <uses-permission android:name="android.permission.INTERNET" /> <!-- 访问网络权限 -->
  4.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 用于访问GPS定位 -->
  5.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  6.     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
  7.     <application
  8.         android:name=".MainApp"
  9.         android:allowBackup="true"
  10.         android:icon="@mipmap/ic_launcher"
  11.         android:label="@string/app_name"
  12.         android:roundIcon="@mipmap/ic_launcher_round"
  13.         android:supportsRtl="true"
  14.         android:theme="@style/Theme.TestApplication">
  15.         <activity android:name=".MainActivity">
  16.             <intent-filter>
  17.                 <action android:name="android.intent.action.MAIN" />
  18.                 <category android:name="android.intent.category.LAUNCHER" />
  19.             </intent-filter>
  20.         </activity>
  21.     </application>
  22. </manifest>
3. 创建activity_main.xml地图布局文件
. W. s/ J  w) `6 A7 V; z
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     tools:context=".MainActivity">
  8.     <com.amap.api.maps2d.MapView
  9.         android:id="@+id/mapview"
  10.         android:layout_width="match_parent"
  11.         android:layout_height="match_parent">
  12.     </com.amap.api.maps2d.MapView>
  13. </androidx.constraintlayout.widget.ConstraintLayout>
4. MainActivity里加载地图,添加marker
* B0 L( w+ z% @' F* f* ]% N
  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3.         super.onCreate(savedInstanceState);
  4.         setContentView(R.layout.activity_main);
  5.         mMapView = findViewById(R.id.mapview);
  6.         mMapView.onCreate(savedInstanceState);// 此方法必须重写
  7.         mMap = mMapView.getMap();
  8.         initPoint(30.665534,104.070929);   //地图中心点位
  9.         initMarker();//测试点位
  10.     }
  11.     /**
  12.      * 绘制marker
  13.      */
  14.     private void initMarker() {
  15.         mMarkers = new ArrayList<>();
  16.         //绘制marker  实际使用时会循环创建marker并填入数据
  17.         Marker marker = mMap.addMarker(new MarkerOptions()
  18.                 .anchor(0.5f, 0.5f)
  19.                 .position(new LatLng(30.665534,104.070929))
  20.                 .title("标题数据")
  21.                 .snippet("消息数据")
  22.                 .icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
  23.                         .decodeResource(getResources(), R.mipmap.ic_launcher_round))));//点位图标
  24.         mMarkers.add(marker);
  25.     }
  26.     /**
  27.      * 加载地图中心点
  28.      */
  29.     private void initPoint(double latitude, double Longitude) {
  30.         LatLng marker1 = new LatLng(latitude, Longitude);
  31.         mMap.moveCamera(CameraUpdateFactory.changeLatLng(marker1));
  32.         mMap.moveCamera(CameraUpdateFactory.zoomTo(12));
  33.     }
  34.    
  35. @Override
  36.     public void onResume() {
  37.         super.onResume();
  38.         if (mMapView != null)
  39.             mMapView.onResume(); //管理地图的生命周期
  40.     }
  41.     @Override
  42.     public void onPause() {
  43.         super.onPause();
  44.         if (mMapView != null)
  45.             mMapView.onPause(); //管理地图的生命周期
  46.     }
  47.     @Override
  48.     public void onDestroy() {
  49.         super.onDestroy();
  50.         if (mMapView != null)
  51.             mMapView.onDestroy(); //管理地图的生命周期
  52.     }
  53. }
5.添加弹框自定义布局view_map_infowindow.xml
6 v8 I  ]7 }6 E9 ?* f
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="horizontal"
  4.     android:layout_width="match_parent"
  5.     android:layout_height="50dp"
  6.     android:minHeight="50dp"
  7.     android:minWidth="100dp"
  8.     android:background="#ffff"
  9.     android:gravity="center"
  10.     >
  11. <ImageView
  12.     android:id="@+id/iv_left"
  13.     android:layout_width="wrap_content"
  14.     android:layout_height="wrap_content"
  15.     android:src="@mipmap/ic_launcher"/>
  16.     <TextView
  17.         android:layout_marginLeft="10dp"
  18.         android:layout_marginRight="10dp"
  19.         android:id="@+id/tv_msg"
  20.         android:text="自定义布局"
  21.         android:layout_width="wrap_content"
  22.         android:layout_height="wrap_content" />
  23.     <ImageView
  24.         android:id="@+id/iv_right"
  25.         android:layout_width="wrap_content"
  26.         android:layout_height="wrap_content"
  27.         android:src="@mipmap/ic_launcher"/>
      记得设置布局最小高度和宽度,不然窗口会默认宽度高度,会使布局显示不完整。9 f+ w2 C9 ^6 r+ u5 H3 L6 n3 _& ?
6.添加自定义弹框窗口adapter2 ?* |7 s! }3 V' }

1 s/ `7 O. k" }/ t
  1. /**
  2. *自定义地图弹框adapter
  3. * @author hk
  4. */
  5. public class MapInfoWinAdapter implements AMap.InfoWindowAdapter, View.OnClickListener {
  6.     private Context mContext;
  7.     private LatLng latLng;
  8.     private TextView mTvMsg;
  9.     private ImageView mIvLeft,mIvRight;
  10.     private String mSnippet,mTitle;
  11.     @Override
  12.     public View getInfoWindow(Marker marker) {
  13.         initData(marker);
  14.         View view = initView();
  15.         return view;
  16.     }
  17.     @Override
  18.     public View getInfoContents(Marker marker) {
  19.         return null; //因为是自定义的布局,返回null
  20.     }
  21.     public MapInfoWinAdapter(Context context) {
  22.         mContext = context;
  23.     }
  24.     private void initData(Marker marker) {
  25.         //当前点位经纬度
  26.         latLng = marker.getPosition();
  27.         //当前点位带的消息信息  也可通过这个传输数据把数据转成json
  28.         mSnippet = marker.getSnippet();
  29.         //当前点位带的标题信息
  30.         mTitle = marker.getTitle();
  31.     }
  32.     @NonNull
  33.     private View initView() {
  34.         //获取自定义的布局
  35.         View view = LayoutInflater.from(mContext).inflate(R.layout.view_map_infowindow, null);
  36.         mTvMsg = (TextView) view.findViewById(R.id.tv_msg);
  37.         mIvLeft= (ImageView) view.findViewById(R.id.iv_left);
  38.         mIvRight= (ImageView) view.findViewById(R.id.iv_right);
  39.         mTvMsg.setText("我是自定义布局弹框");
  40.         mIvLeft.setOnClickListener(this);
  41.         mIvRight.setOnClickListener(this);
  42.         return view;
  43.     }
  44.     @Override
  45.     public void onClick(View v) {
  46.         switch (v.getId()){
  47.             case R.id.iv_left:
  48.                 Toast.makeText(mContext,"我是左边按钮点击事件",Toast.LENGTH_SHORT).show();
  49.                 break;
  50.             case R.id.iv_right:
  51.                 Toast.makeText(mContext,"我是右边按钮点击事件",Toast.LENGTH_SHORT).show();
  52.                 break;
  53.         }
  54.     }
  55. }
7.地图绑定adapter- d) M# o- v3 }: j9 K. G9 i7 Z
  1. //重要 创建自定义适配器
  2. MapInfoWinAdapter adapter = new MapInfoWinAdapter(this);
  3. mMap.setInfoWindowAdapter(adapter);//设置自定义窗口adapter
      现在点击marker就会弹出我们自定义的布局了
) F2 n& K" ]5 Q8 {8 D8.点击地图或弹框关闭弹框窗口
, F' k0 T( i; P% U, J* G
  1. mMap.setOnInfoWindowClickListener(this);//弹框窗口点击事件
  2.    mMap.setOnMapClickListener(this);//地图点击事件
  3.     @Override
  4.     public void onMapClick(LatLng latLng) {
  5.         //点击地图区域关闭所有窗口
  6.         for (Marker marker : mMarkers) {
  7.             marker.hideInfoWindow();
  8.         }
  9.     }
  10.     @Override
  11.     public void onInfoWindowClick(Marker marker) {
  12.         if (marker.isInfoWindowShown()) {
  13.             marker.hideInfoWindow();//再次点击窗口就隐藏窗口
  14.         }
  15.     }
      到此自定义弹框窗口就完成了,以下为完整MainActivity代码:6 P8 \. B8 a- B( d1 b& Y
  1. public class MainActivity extends AppCompatActivity implements AMap.OnInfoWindowClickListener, AMap.OnMapClickListener {
  2.     private AMap mMap;
  3.     private List<Marker> mMarkers;
  4.     private MapView mMapView;
  5.     @Override
  6.     protected void onCreate(Bundle savedInstanceState) {
  7.         super.onCreate(savedInstanceState);
  8.         setContentView(R.layout.activity_main);
  9.         mMapView = findViewById(R.id.mapview);
  10.         mMapView.onCreate(savedInstanceState);// 此方法必须重写
  11.         mMap = mMapView.getMap();
  12.         mMap.setOnMapClickListener(this);//地图点击事件
  13.         initPoint(30.665534,104.070929);   //地图中心点位
  14.         initMarker();//测试点位
  15.     }
  16.     /**
  17.      * 绘制marker
  18.      */
  19.     private void initMarker() {
  20.         mMarkers = new ArrayList<>();
  21.         //重要 创建自定义适配器
  22.         MapInfoWinAdapter adapter = new MapInfoWinAdapter(this);
  23.         mMap.setInfoWindowAdapter(adapter);//设置自定义窗口adapter
  24.         mMap.setOnInfoWindowClickListener(this);
  25.         //绘制marker  实际使用时会循环创建marker并填入数据
  26.         Marker marker = mMap.addMarker(new MarkerOptions()
  27.                 .anchor(0.5f, 0.5f)
  28.                 .position(new LatLng(30.665534,104.070929))
  29.                 .title("标题数据")
  30.                 .snippet("消息数据")
  31.                 .icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
  32.                         .decodeResource(getResources(), R.mipmap.ic_launcher_round))));//点位图标
  33.         mMarkers.add(marker);
  34.     }
  35.     /**
  36.      * 加载地图中心点
  37.      */
  38.     private void initPoint(double latitude, double Longitude) {
  39.         LatLng marker1 = new LatLng(latitude, Longitude);
  40.         mMap.moveCamera(CameraUpdateFactory.changeLatLng(marker1));
  41.         mMap.moveCamera(CameraUpdateFactory.zoomTo(12));
  42.     }
  43.     @Override
  44.     public void onMapClick(LatLng latLng) {
  45.         //点击地图区域关闭所有窗口
  46.         for (Marker marker : mMarkers) {
  47.             marker.hideInfoWindow();
  48.         }
  49.     }
  50.     @Override
  51.     public void onInfoWindowClick(Marker marker) {
  52.         if (marker.isInfoWindowShown()) {
  53.             marker.hideInfoWindow();//再次点击窗口就隐藏窗口
  54.         }
  55.     }
  56.     @Override
  57.     public void onResume() {
  58.         super.onResume();
  59.         if (mMapView != null)
  60.             mMapView.onResume(); //管理地图的生命周期
  61.     }
  62.     @Override
  63.     public void onPause() {
  64.         super.onPause();
  65.         if (mMapView != null)
  66.             mMapView.onPause(); //管理地图的生命周期
  67.     }
  68.     @Override
  69.     public void onDestroy() {
  70.         super.onDestroy();
  71.         if (mMapView != null)
  72.             mMapView.onDestroy(); //管理地图的生命周期
  73.     }
  74. }
最终效果:
# x7 m* s8 C; J1 J2 G7 ` 1.jpg 5 V7 ^$ h: U# C# f5 z: O2 m+ k
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号|渝公网安备50010502503914号 )

GMT+8, 2024-11-22 02:43

Powered by paopaomj X3.5 © 2016-2025 sitemap

快速回复 返回顶部 返回列表