Android高德地图marker自定义弹框窗口

作者:浪克oo 时间:2023-06-22 13:07:05 

本文实例为大家分享了Android高德地图marker自定义弹框窗口的具体代码,供大家参考,具体内容如下

最终效果:

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(); //管理地图的生命周期
   }

}

来源:https://blog.csdn.net/weixin_35959554/article/details/115715979

标签:Android,地图,窗口
0
投稿

猜你喜欢

  • C#微信公众号与订阅号接口开发示例代码

    2023-07-20 09:11:07
  • Android禁止EditText自动弹出软键盘的方法及遇到问题

    2021-07-18 06:35:55
  • springboot整合Shiro

    2022-11-13 11:07:52
  • Java利用Selenium操作浏览器的示例详解

    2022-06-17 17:34:20
  • 分享我的第一次java Selenium自动化测试框架开发过程

    2021-05-30 01:16:25
  • IDEA中的clean,清除项目缓存图文教程

    2022-02-05 09:02:02
  • RSA密钥--JAVA和C#的区别及联系

    2022-09-18 12:16:44
  • java导出Excel文件的步骤全纪录

    2021-10-04 11:18:38
  • IDEA的默认快捷键设置与Eclipse的常用快捷键的设置方法

    2023-04-09 18:32:40
  • Java中包装类介绍与其注意事项

    2023-03-20 18:26:36
  • springboot无法从静态上下文中引用非静态变量的解决方法

    2022-03-05 16:50:05
  • 简单了解Java断言利器AssertJ原理及用法

    2022-07-12 15:54:21
  • 详解Java中NullPointerException异常的原因详解以及解决方法

    2023-01-22 20:13:28
  • SpringMVC适配器模式作用范围介绍

    2023-12-10 23:37:15
  • Android应用更新之自动检测版本及自动升级

    2023-12-27 07:23:01
  • Spring Boot Actuator管理日志的实现

    2023-02-12 10:45:40
  • JAVA 获取系统当前时间实例代码

    2022-09-01 05:53:01
  • Java中批处理框架spring batch详细介绍

    2023-10-19 16:54:21
  • Java 实战范例之线上婚纱摄影预定系统的实现

    2021-08-08 14:19:42
  • SpringMVC @RequestBody的使用解析

    2022-01-30 06:34:32
  • asp之家 软件编程 m.aspxhome.com