Baike.dev
All toolsAI codingTrendingOpen sourceNewsSubmit
Log in
< Back to tools
C

ChinaMapView

> 编程语言
Open source

自定义View,可缩放、可平移、可点击的中国地图,有中国地图的全部省份,具备每个省份的点击接口

1.3K stars0 likes0 views
WebsiteGitHub

About

自定义View,可缩放、可平移、可点击的中国地图,有中国地图的全部省份,具备每个省份的点击接口

中国地图 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的事件响应,否则都禁止
常规使用 下拉刷新及其他滑动冲突
展示省份名字(1.0.2新增支持) 只允许点击,不允许缩放和拖动(1.0.4新增支持)

开始使用

  • 基本API
  • 使用
    • 引入
    • 布局XML中添加
    • 代码中修改Data和View属性
  • 反馈与建议

基本API

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

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

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

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

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

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

ChinaMapView

方法 参数 作用
setEnableTouch boolean 设置是否可以消费事件(默认为true)
setEnableScroll boolean 设置是否可以缩放和拖动(默认为true)
setScaleMin int 设置缩放的最小倍数,最终结果>=0
setScaleMax int 设置缩放的最大倍数,最终结果>=1
getChinaMapModel ChinaMapModel 返回ChinaMapModel对象,用于之后的修改刷新view的展示
setOnProvinceClickLisener ChinaMapView.onProvinceClickLisener 省份点击选中接口
setOnPromiseParentTouchListener ChinaMapView.onPromiseParentTouchListener 通知外界是否允许chinamapview之上的view拦截事件
notifyDataChanged void 修改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.1.0'
}

布局XML中添加

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

代码中修改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);;
…

反馈与建议

  • 邮箱:

License

…

Issues· 0 open

View all issuesOpen on GitHub

No open issues yet, or sync has not completed.

> Tags

Javaandroidandroid-viewchina-mapmap

No comments yet. Be the first to share.

> Details

PublishedAug 1, 2026
UpdatedSep 17, 2026
Category编程语言
PricingOpen source

> Related tools

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言