RegionDetector

Introduction: 一个支持灵活设置的不规则区域检测控件
More: Author   ReportBugs   
Tags:

一个支持灵活设置的不规则区域检测控件

image

image image

image

更新说明

1.1.0

  • 去除反射
  • 增加矢量图解析器,路径解析器
  • 兼容到 API27

介绍说明

  • 此控件支持不规则区域的识别监测,采用矢量图,有效降低内存,常用来做地图区域识别
  • 支持手动点击模式和中心点定位模式
  • 支持缩放位移操作
  • 支持双击缩放操作
  • 提供渐变动画,拒绝生硬
  • 支持自定义矢量图,但需满足一定要求
  • 开放众多接口满足个性化定制
  • ...

原理介绍

实现思路介绍


使用说明

  • 布局 xml 中添加:
    <com.junmeng.rdetecte.widget.RegionDetectSurfaceView
              android:id="@+id/rdv_detect"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />
    
  • 设置激活区域:
    int[] areaRes = new int[]{
              R.string.china_anhui, R.string.china_beijing, R.string.china_guangdong
              , R.string.china_chongqing, R.string.china_xinjiang, R.string.china_fujian
              , R.string.china_gansu, R.string.china_zhejiang, R.string.china_yunnan
              , R.string.china_xizang, R.string.china_tianjin
              , R.string.china_shandong, R.string.china_heilongjiang, R.string.china_hainan
      };
    binding.rdvDetect.setAreaActivateStatus(areaRes, true);
    
  • 全部区域请查看:
    <resources>
      <string name="china_beijing">北京</string>
      <string name="china_tianjin">天津</string>
      <string name="china_shanghai">上海</string>
      <string name="china_chongqing">重庆</string>
      <string name="china_hebei">河北</string>
      <string name="china_shanxi">山西</string>
      <string name="china_liaoning">辽宁</string>
      <string name="china_jilin">吉林</string>
      <string name="china_heilongjiang">黑龙江</string>
      <string name="china_jiangsu">江苏</string>
      <string name="china_zhejiang">浙江</string>
      <string name="china_anhui">安徽</string>
      <string name="china_fujian">福建</string>
      <string name="china_jiangxi">江西</string>
      <string name="china_shandong">山东</string>
      <string name="china_henan">河南</string>
      <string name="china_hubei">湖北</string>
      <string name="china_hunan">湖南</string>
      <string name="china_guangdong">广东</string>
      <string name="china_hainan">海南</string>
      <string name="china_sichuan">四川</string>
      <string name="china_guizhou">贵州</string>
      <string name="china_yunnan">云南</string>
      <string name="china_shaanxi">陕西</string>
      <string name="china_gansu">甘肃</string>
      <string name="china_qinghai">青海</string>
      <string name="china_taiwan">台湾</string>
      <string name="china_neimenggu">内蒙古</string>
      <string name="china_guangxi">广西</string>
      <string name="china_xizang">西藏</string>
      <string name="china_ningxia">宁夏</string>
      <string name="china_xinjiang">新疆</string>
      <string name="china_xianggang">香港</string>
      </resources>
    
  • 设置监听器:

    binding.rdvDetect.setOnActivateRegionDetectListener(new RegionDetectSurfaceView.OnActivateRegionDetectListener() {
              @Override
              public void onActivateRegionDetect(String name) {
                  binding.tvActivate.setText("高亮区域:" + name);
                  binding.rdvDetect.setSelectedAreaOnlyCloseCenterLocation(name);
              }
          });
          binding.rdvDetect.setOnRegionDetectListener(new RegionDetectSurfaceView.OnRegionDetectListener() {
              @Override
              public void onRegionDetect(String name) {
                  binding.tvDetect.setText("当前区域:" + name);
              }
          });
    
          binding.rdvDetect.setOnDoubleClickListener(new RegionDetectSurfaceView.OnDoubleClickListener() {
              @Override
              public void onDoubleClick(@RegionDetectSurfaceView.ScaleMode int scaleMode) {
                  binding.tvZoom.setText("双击操作:" + (scaleMode == SCALE_ZOOMIN ? "放大" : "缩小"));
              }
          });
    
  • 至此最简单的引用方式已经结束了。

常用 api 说明:

public void setRegionDetectMode(@RegionDetectMode int detectMode);

  • 可在此设置支持的模式为手动点击模式和中心定位模式
  • 手动点击模式符合一般使用习惯,但区域较小时很难点击
  • 中心定位模式则可以较细致的定位,推荐使用,默认也是此模式

public void setCenterIcon(Bitmap bitmap);

  • 自定义中心定位图标

public void setCenterIconLocationType(@CenterIconLocationType int locationType);

  • 设置中心定位图标的定位位置,支持图标中心和图标底部两种

public void fitCenter();

  • 将地图适合屏幕缩放并居中

public void setAreaColor(@NonNull String areaName, @ColorInt int highlightColor, @ColorInt int activatedColor, @ColorInt int normalColor);

  • 设置区域高亮颜色,激活颜色和普通颜色
  • 此设置优先级高于默认的颜色,如上图的广东会变成黄色

public void setAreaMap(@DrawableRes int map, int originalWidth, int originalHeight);

  • 自定义区域地图
  • 矢量图格式需要如下:
    <vector xmlns:android="http://schemas.android.com/apk/res/android"
      android:width="24dp"
      android:height="24dp"
      android:viewportHeight="600.0"
      android:viewportWidth="700.0">
      <!--黑龙江-->
      <path
          android:name="@string/china_heilongjiang"
          android:fillAlpha="0.1"
          android:fillColor="#51b133"
          android:pathData="M646.2,152 ...... Z"
          android:strokeColor="#ffffff"
          android:strokeWidth="0" />
      <!--吉林-->
      <path
          android:name="@string/china_jilin"
          android:fillAlpha="0.1"
          android:fillColor="#51b133"       
      android:pathData=" ......"
          android:strokeColor="#ffffff"
          android:strokeWidth="0" />
      <!--辽宁-->
      <path
          android:name="@string/china_liaoning"
          android:fillAlpha="0.1"
          android:fillColor="#ff9116"
          android:pathData="M575.1,247.2 ......"
          android:strokeColor="#ffffff"
          android:strokeWidth="0" />
      ......
    </vector>
    
  • 其中 vector 元素的 viewportHeight 和 viewportWidth 以及 path 元素的 name 和 pathData 必须设置

更多请详看在线文档或源码及参照 demo


JavaDoc 文档

  • 在线 JavaDoc
  • 网址:https://jitpack.io/com/github/huweijian5/RegionDetector/[VersionCode]/javadoc/index.html
  • 其中VersionCode请替换为最新版本号
  • 注意文档使用 UTF-8 编码,如遇乱码,请在浏览器选择 UTF-8 编码即可

引用

  • 如果需要引用此库,做法如下:
  • Add it in your root build.gradle at the end of repositories:
    allprojects {
          repositories {
              ...
              maven { url "https://jitpack.io" }
          }
      }
    
  • and then,add the dependecy:
    dependencies {
              compile 'com.github.huweijian5:RegionDetector:latest_version'
    }
    
  • 其中 latest_version 请到releases中查看

注意

  • 为了避免引入第三方库导致工程依赖多个版本的问题,如 android support 库
  • 故建议在个人的工程目录下的 build.gradle 下加入以下变量,具体请看此build.gradle

    ext{
      minSdkVersion = 16
      targetSdkVersion = 25
      compileSdkVersion = 26
      buildToolsVersion = '26.0.1'
    
      // App dependencies
      supportLibraryVersion = '26.1.0'
      junitVersion = '4.12'
      espressoVersion = '2.2.2'
    }
    
  • 请注意,对于此库已有的变量,命名请保持一致
Apps
About Me
GitHub: Trinea
Facebook: Dev Tools