Android实现区域热力地图功能ChinaMapView
一路向西 · 145浏览量 · 发布于2020-12-07 +关注

作者NoEndToLF,源码ChinaMapView,ChinaMapView:这是一个可拖拽,可点击,可手势放大的自定义中国地图组件,使用简单,具备一个自定义View应有的基本素质

  • 原理 :画地图用path,缩放拖拽用Matrix,判断点击位置用Region,判断滑动和缩放过程中的Map边界用Matrix.mapRect

  • 功能 :

    • 1、可随手势拖动,到边界抵消相应方向的滑动,且只有down的点在map内才可以拖动。

    • 2、可随缩放手势放大缩小,放大缩小的手势不做任何限制,只要在View内即可。

    • 3、点击某个省份回调该Select事件,传递出省份名字

    • 4、提供了刷新入口(Data改变刷新)

  • 基本素质 :

    • 1、旋转屏幕状态不丢失,转之前啥样,回来还是啥样(处理好onSaveInstanceState和onRestoreInstanceState)

    • 2、暴露事件冲突接口,允许外界操作父控件的事件及该view自己的事件(因为这只是个View,没办法直接处理所有的滑动冲突场景)

    • 3、内存抖动要小,防止内存溢出。


示例(真机还比较流畅,压缩的GIF丢帧严重)

Demo演示了普通用法和涉及到SwipeRefreshLayout+AppBarLayout等类似的滑动冲突的用法(细节请看代码)。

  • 1、普通使用 :只有Down的点在map的范围内才可以响应拖拽事件,否则通知父控件拦截;缩放事件不做限制。

  • 2、下拉刷新及其他滑动冲突 :

    • 1、拖拽事件:Down的点在map内,通过onPromiseParentTouchListener方法中使用SwipeRefreshLayout.setEnabled(promise)通知外界设置SwipeRefreshLayout不可以滑动。

    • 2、缩放事件:在MyScaleGestureDetector的onScaleBegin方法中通过onPromiseParentTouchListener方法中使用SwipeRefreshLayout.setEnabled(promise)通知外界设置SwipeRefreshLayout不可以滑动。

    • 3、在SwipeRefreshLayout的OnRefreshListener中设置ChinaMapView的setEnableTouch(false)方法通知刷新期间,ChinaMapView不响应任何事件。

    • 4、同理,监听AppBarLayout的滚动高度来控制只有完全展开才允许SwipeRefreshLayout下拉刷新和ChinaMapView的事件响应,否则都禁止

基本API

所有的省份、自治区、直辖市

安徽,北京,重庆,福建,广东,甘肃,广西,贵州,海南,河北,河南,香港,黑龙江,湖南,湖北,吉林,江苏,江西,辽宁,澳门,内蒙古,宁夏,青海,陕西,四川,山东,上海市,山西,天津,台湾,新疆,西藏,云南,浙江

Data实例类 ChinaMapModel,通过ChinaMapView.getChinaMapModel()获得,以下为使用期间会接触到的属性,别的属性都是为绘制准备的,不用关心,也不用去设置。

属性(均包含set、get方法)类型作用
provinceslistList包含所有的省份model
isShowNameboolean设置是否展示省份名字

Data实例类 ProvinceModel,通过chinaMapModel.getProvinceslist()获得,以下为使用期间会接触到的属性,别的属性都是为绘制准备的,不用关心,也不用去设置。

属性(均包含set、get方法)类型作用
colorint省份填充的颜色
normalBorderColorint省份未选中状态下的边框颜色
selectBorderColorint省份未选中状态下的边框颜色
nameColorint省份名字颜色,每个省份名字的颜色可以不一致

ChinaMapView

方法参数作用
setEnableTouchboolean设置是否可以消费事件(默认为true)
setScaleMinint设置缩放的最小倍数,最终结果>=0
setScaleMaxint设置缩放的最大倍数,最终结果>=1
getChinaMapModelChinaMapModel返回ChinaMapModel对象,用于之后的修改刷新view的展示
setOnProvinceClickLisenerChinaMapView.onProvinceClickLisener省份点击选中接口
setOnPromiseParentTouchListenerChinaMapView.onPromiseParentTouchListener通知外界是否允许chinamapview之上的view拦截事件
notifyDataChangedvoid修改ChinaMapModel对象后,刷新View

使用

引入

Step 1. Add it in your root build.gradle at the end of repositories:

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}

Step 2. Add the dependency

dependencies {
        implementation 'com.github.NoEndToLF:ChinaMapView:1.0.2'
}

布局XML中添加

布局XML中添加与系统View使用方式一样,宽高如果只确定其一,另一个根据parent的宽高和map的比例取最小值确定。最终map的宽度和高度由padding决定

<com.wxy.chinamapview.view.ChinaMapView
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:id="@+id/map"></com.wxy.chinamapview.view.ChinaMapView>

代码中修改Data和View属性

代码中通过ChinaMapView的getChinaMapModel()方法拿到ChinaMapModel,通过修改ChinaMapModel的属性来刷新ChinaMapView的显示效果,其他的缩放倍数和接口通过ChinaMapView直接设置,Demo中的SwipRefreshAppbarActivity和NormalActivity中有详细使用代码

拿到ChinaMapModel

chinaMapModel = map.getChinaMapModel();

设置缩放的最大最小值

map.setScaleMin(1);
      map.setScaleMax(3);

修改省份颜色,这里所有省份都处理成一样了,实际场景可给省份设置不同的颜色,修改完后map.notifyDataChanged()刷新View

for (ProvinceModel provinceModel:chinaMapModel.getProvinceslist()){
                                  provinceModel.setColor(color);
                              }
                              map.notifyDataChanged();

修改省份未选中状态下边框颜色,这里所有省份都处理成一样了,实际场景可给省份设置不同的颜色,修改完后map.notifyDataChanged()刷新View

for (ProvinceModel provinceModel:chinaMapModel.getProvinceslist()){
                                  provinceModel.setNormalBordercolor(color);
                              }
                              map.notifyDataChanged();

修改省份选中状态下边框颜色,这里所有省份都处理成一样了,实际场景可给省份设置不同的颜色,修改完后map.notifyDataChanged()刷新View

for (ProvinceModel provinceModel:chinaMapModel.getProvinceslist()){
                                    provinceModel.setSelectBordercolor(color);
                                }
                                map.notifyDataChanged();

修改省份名字的颜色,这里所有省份都处理成一样了,实际场景可给省份设置不同的颜色,修改完后map.notifyDataChanged()刷新View

for (ProvinceModel provinceModel:chinaMapModel.getProvincesList()){
                                    provinceModel.setNameColor(color);
                                }
                                map.notifyDataChanged();

设置省份点击事件,这里传递的是省份或者直辖市或者自治区的名字(上方有全部的name)

map.setOnProvinceClickLisener(new ChinaMapView.onProvinceClickLisener() {
           @Override
           public void onSelectProvince(String provinceName) {
               tvName.setText(provinceName);
           }
       });

添加事件处理回调,即通知外界是否要拦截事件;

chinamapView.setOnPromiseParentTouchListener(new ChinaMapView.onPromiseParentTouchListener() {
            @Override
            public void onPromiseTouch(boolean promise) {
                swipe.setEnabled(promise);
            }

        });

修改完chinamapmodel的数据后,刷新数据用chinamapView.notifyDataChanged(),且刷新期间禁止chinamapView响应事件chinamapView.setEnableTouch(true);;

swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                chinamapView.setEnableTouch(false);
                //模拟耗时
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        String namestring = ColorChangeUtil.nameStrings[++currentColor %               ColorChangeUtil.nameStrings.length];
                        btnChange.setText(namestring);
                        colorView.setList(colorView_hashmap.get(namestring));
                        //重置map各省份颜色
                        ColorChangeUtil.changeMapColors(chinaMapModel, namestring);
                        chinamapView.notifyDataChanged();
                        swipe.setRefreshing(false);
                        chinamapView.setEnableTouch(true);
                    }
                },2000);
            }
        });


相关推荐

一个安卓认证功能AdvancedBiometricPromptCompat源码

相关信息 一路向西 · 114浏览 · 2020-12-30 17:04:47
android实现如何上传文件案例源码

相关信息 talkchan · 117浏览 · 2020-12-30 17:00:53
android APK一键DEX加固脚本

相关信息 安卓巴士 · 123浏览 · 2020-11-30 16:39:36
YCAndroidTool查看分享崩溃记录日志工具

相关信息 luenmicro · 90浏览 · 2020-11-20 16:23:44
集成 常用TabLayout、UIAlertDialog标题栏特效

相关信息 奔跑的男人 · 168浏览 · 2020-11-05 09:32:09
在线多源翻译 (Multi-source Translation, MTrans)案例源码

相关信息 追忆似水年华 · 104浏览 · 2020-10-27 14:27:16
加载中

0评论

评论
欢迎大家关注我,有技术问题可以一起交流探讨!
  • 源码信息
  • 所需 1 点数
  • 源码作者:匿名作者
  • 源码大小:6.142 MB
  • 源码类型:android源码
  • 运行环境:未知
分类专栏
小鸟云服务器
扫码进入手机网页