Commit 22323871 by Luosp

去掉导航,保留自有需求功能

parent 8753c057
apply plugin: 'com.android.library'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
minSdkVersion 19
targetSdkVersion 29
versionCode 1
versionName "0.0.2"
consumerProguardFiles 'consumer-rules.pro'
ndk {
abiFilters "armeabi-v7a"
// abiFilters "arm64-v8a"
// abiFilters "armeabi"
}
}
buildTypes {
release {
minifyEnabled true
zipAlignEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/assets/'] } }
packagingOptions {
exclude 'assets/tnavi/HCI_AUTH/HCI_AUTH_FOREVER'
exclude 'assets/tnavi/log/gpspos_data.txt'
exclude 'assets/tnavi/pdata/fx.sdb'
exclude 'assets/tnavi/pdata/font.pdt'
exclude 'assets/tnavi/pdata/res.pdt'
exclude 'assets/tnavi/sdb/cdata/rsh_0.sdb'
exclude 'assets/tnavi/sdb/cdata/zon.sdb'
exclude 'assets/tnavi/sdb/cdata/man.cdt'
exclude 'assets/tnavi/sdb/cdata/rsh.sdb'
exclude 'assets/tnavi/sdb/cdata/url.cdt'
exclude 'assets/tnavi/sdb/cdata/gd.sdb'
exclude 'assets/tnavi/sdb/cdata/ano.cdt'
exclude 'assets/tnavi/sdb/adata/tmp'
exclude 'assets/tnavi/config.ini'
exclude 'assets/tnavi/Dictionary.Dat'
exclude 'assets/tnavi/udata/utmp.txt'
exclude 'assets/tnavi/DictionaryWordSort.dat'
exclude 'assets/AccountInfo.txt'
}
}
dependencies {
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
//arcgis地图
implementation 'com.esri.arcgisruntime:arcgis-android:100.6.0'
//权限
implementation 'com.yanzhenjie:permission:2.0.3'
//请求工具类
implementation 'com.squareup.okhttp3:okhttp:3.12.3'
//gson
implementation 'com.google.code.gson:gson:2.8.5'
}
apply from: '../mvn_push.gradle'
ARTIFACT_ID = map
VERSION = 0.0.1
PACKAGING = aar
DESCRIPTION = first create map lib
\ No newline at end of file
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
#############################################
#
# 对于一些基本指令的添加
#
#############################################
# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改
-optimizationpasses 5
# 混合时不使用大小写混合,混合后的类名为小写
-dontusemixedcaseclassnames
# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses
# 这句话能够使我们的项目混淆后产生映射文件
# 包含有类名->混淆后类名的映射关系
-verbose
# 指定不去忽略非公共库的类成员
-dontskipnonpubliclibraryclassmembers
# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
-dontpreverify
# 保留Annotation不混淆
-keepattributes *Annotation*,InnerClasses
# 避免混淆泛型
-keepattributes Signature
# 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable
# 指定混淆是采用的算法,后面的参数是一个过滤器
# 这个过滤器是谷歌推荐的算法,一般不做更改
-optimizations !code/simplification/cast,!field/*,!class/merging/*
# 可以把代码以及所使用到的各种第三方库代码统统移动到同一个包下
-repackageclasses cn.com.founder.arcgislib.view
#############################################
#
# Android开发中一些需要保留的公共部分
#
#############################################
# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆
# 因为这些子类都有可能被外部调用
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Appliction
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
# 保留support下的所有类及其内部类
-keep class android.support.** {*;}
# 保留继承的
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**
# 保留R下面的资源
-keep class **.R$* {*;}
# 保留本地native方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
# 保留在Activity中的方法参数是view的方法,
# 这样以来我们在layout中写的onClick就不会被影响
-keepclassmembers class * extends android.app.Activity{
public void *(android.view.View);
}
# 保留枚举类不被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# 保留我们自定义控件(继承自View)不被混淆
-keep public class * extends android.view.View{
*** get*();
void set*(***);
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
# 保留Parcelable序列化类不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
# 保留Serializable序列化的类不被混淆
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
!private <fields>;
!private <methods>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# 对于带有回调函数**On*Listener的,不能被混淆
-keepclassmembers class * {
void *(**On*Listener);
}
#-------------- okhttp3 start-------------
# OkHttp3
# https://github.com/square/okhttp
# okhttp
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.* { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**
# okhttp 3
-keepattributes Signature
-keepattributes *Annotation*
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**
# Okio
-dontwarn com.squareup.**
-dontwarn okio.**
-keep public class org.codehaus.* { *; }
-keep public class java.nio.* { *; }
#----------okhttp end--------------
-keep class com.esri.arcgisruntime.**{ *; }
-dontwarn com.esri.arcgisruntime.**
-keep class cn.com.founder.arcgislib.nonavi.ArcGisFounder{ *; }
-keepclassmembers class cn.com.founder.arcgislib.nonavi.ArcGisFounder$ArcGisFounderBuilder{
public *;
}
-keepclassmembers class cn.com.founder.arcgislib.nonavi.view.ArcGisLocationView$CalloutStyleBuilder{
public *;
}
-keepclassmembers class cn.com.founder.arcgislib.nonavi.view.ArcGisLocationView$CalloutContentBuilder{
public *;
}
-keepclassmembers class cn.com.founder.arcgislib.nonavi.view.ArcGisClusterView$ClusterStyleBuilder{
public *;
}
-keep class cn.com.founder.arcgislib.nonavi.location.listener.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.location.option.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.compass.listener.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.compass.option.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.zoom.listener.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.zoom.option.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.search.listener.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.search.option.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.cluster.listener.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.cluster.option.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.draw.listener.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.draw.option.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.hotpots.option.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.model.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.view.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.widget.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.widget.cluster.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.widget.draw.**{ *; }
-keep class cn.com.founder.arcgislib.nonavi.widget.popup.**{ *; }
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="cn.com.founder.arcgislib.nonavi">
<!--网络-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--定位-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--导航-->
<!-- 允许在SDCard中创建与删除文件 -->
<uses-permission
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<!--允许不同用户的应用之间可以产生交互-->
<uses-permission
android:name="android.permission.INTERACT_ACROSS_USERS_FULL"
tools:ignore="ProtectedPermissions" />
<!-- 允许程序打开网络套接字 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 允许程序访问网络状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 允许用户改变WiFi连接状态 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 程序访问粗略位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 允许用户访问精确位置 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 允许程序读取手机状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 打电话的权限 -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<!-- 允许程序写入外部存储设备 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 允许程序读取所有者数据 -->
<uses-permission android:name="android.permission.READ_OWNER_DATA" />
<!-- 访问WiFi状态,需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 访问网络的变化, 需要某些信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!--8.0 安装未知程序权限-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<!-- 允许程序读取日志 -->
<uses-permission android:name="android.permission.READ_LOGS"
tools:ignore="ProtectedPermissions"/>
<!--arcgis地图 2D-->
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:networkSecurityConfig="@xml/network_security_config"
android:requestLegacyExternalStorage="true"
android:hardwareAccelerated="true"
tools:targetApi="n" >
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="cn.com.founder.arcgislib.nonavi.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/my_provider_file" />
</provider>
</application>
</manifest>
package cn.com.founder.arcgislib.nonavi;
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import android.view.View;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.GenericLifecycleObserver;
import androidx.lifecycle.Lifecycle;
import com.esri.arcgisruntime.mapping.view.BackgroundGrid;
import com.esri.arcgisruntime.mapping.view.MapView;
import cn.com.founder.arcgislib.nonavi.cluster.ArcGisCluster;
import cn.com.founder.arcgislib.nonavi.cluster.option.IArcGisClusterOption;
import cn.com.founder.arcgislib.nonavi.compass.ArcGisCompass;
import cn.com.founder.arcgislib.nonavi.compass.option.IArcGisCompassOption;
import cn.com.founder.arcgislib.nonavi.draw.ArcGisDraw;
import cn.com.founder.arcgislib.nonavi.draw.option.IArcGisDrawOption;
import cn.com.founder.arcgislib.nonavi.hotpots.ArcGisHotPots;
import cn.com.founder.arcgislib.nonavi.hotpots.option.IArcGisHotPotsOption;
import cn.com.founder.arcgislib.nonavi.location.ArcGisLocation;
import cn.com.founder.arcgislib.nonavi.location.option.IArcGisLocationOption;
import cn.com.founder.arcgislib.nonavi.option.IOption;
import cn.com.founder.arcgislib.nonavi.search.ArcGisSearch;
import cn.com.founder.arcgislib.nonavi.search.option.IArcGisSearchOption;
import cn.com.founder.arcgislib.nonavi.source.ActivitySource;
import cn.com.founder.arcgislib.nonavi.source.ContextSource;
import cn.com.founder.arcgislib.nonavi.source.FragmentSource;
import cn.com.founder.arcgislib.nonavi.source.Source;
import cn.com.founder.arcgislib.nonavi.source.XFragmentSource;
import cn.com.founder.arcgislib.nonavi.utils.ToolUtil;
import cn.com.founder.arcgislib.nonavi.view.ArcGisBaseView;
import cn.com.founder.arcgislib.nonavi.view.ArcGisClusterView;
import cn.com.founder.arcgislib.nonavi.view.ArcGisDrawView;
import cn.com.founder.arcgislib.nonavi.view.ArcGisHotPotsView;
import cn.com.founder.arcgislib.nonavi.view.ArcGisLocationView;
import cn.com.founder.arcgislib.nonavi.view.ArcGisMapCompassView;
import cn.com.founder.arcgislib.nonavi.view.ArcGisMapView;
import cn.com.founder.arcgislib.nonavi.view.ArcGisMapZoomView;
import cn.com.founder.arcgislib.nonavi.view.ArcGisSearchView;
import cn.com.founder.arcgislib.nonavi.zoom.ArcGisZoom;
import cn.com.founder.arcgislib.nonavi.zoom.option.IArcGisZoomOption;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/5 14:52
* EMail:luo_shaopeng@founder.com.cn
* Description:地图操作配置
*/
public class ArcGisFounder implements IOption {
/**
* {@link ArcGisFounderBuilder}
*/
private ArcGisFounderBuilder mArcGisFounderBuilder;
private ArcGisFounder(ArcGisFounderBuilder arcGisFounderBuilder) {
this.mArcGisFounderBuilder = arcGisFounderBuilder;
arcGisFounderBuilder.mLifecycle.addObserver((GenericLifecycleObserver) (source1, event) -> {
if (event == Lifecycle.Event.ON_RESUME) {
mArcGisFounderBuilder.mMapView.resume();
} else if (event == Lifecycle.Event.ON_PAUSE) {
mArcGisFounderBuilder.mMapView.pause();
} else if (event == Lifecycle.Event.ON_STOP) {
} else if (event == Lifecycle.Event.ON_DESTROY) {
mArcGisFounderBuilder.mIArcGisLocationOption.stopLocation();
mArcGisFounderBuilder.mMapView.dispose();
}
});
}
/**
* With context.
*
* @param context {@link Context}.
* @return {@link ArcGisFounderBuilder}.
*/
public static ArcGisFounderBuilder with(Context context) {
return new ArcGisFounderBuilder(getContextSource(context));
}
/**
* With activity.
*
* @param activity {@link Activity}.
* @return {@link ArcGisFounderBuilder}.
*/
public static ArcGisFounderBuilder with(AppCompatActivity activity) {
return new ArcGisFounderBuilder(new ActivitySource(activity));
}
/**
* With {@link android.app.Fragment}.
*
* @param fragment {@link android.app.Fragment}.
* @return {@link ArcGisFounderBuilder}.
*/
public static ArcGisFounderBuilder with(android.app.Fragment fragment) {
return new ArcGisFounderBuilder(new FragmentSource(fragment));
}
/**
* With {@link Fragment}.
*
* @param fragment {@link Fragment}.
* @return {@link ArcGisFounderBuilder}.
*/
public static ArcGisFounderBuilder with(Fragment fragment) {
return new ArcGisFounderBuilder(new XFragmentSource(fragment));
}
/**
* @param context Context
*/
private static Source getContextSource(Context context) {
if (context instanceof Activity) {
return new ActivitySource((Activity) context);
} else if (context instanceof ContextWrapper) {
return getContextSource(((ContextWrapper) context).getBaseContext());
}
return new ContextSource(context);
}
/**
* @return 得到位置操作对象
*/
@Override
public IArcGisLocationOption arcGisLocationOption() {
return mArcGisFounderBuilder.mIArcGisLocationOption;
}
/**
* @return 得到缩放操作对象
*/
@Override
public IArcGisZoomOption arcGisZoomOption() {
return mArcGisFounderBuilder.mIArcGisZoomOption;
}
/**
* @return 得到罗盘操作对象
*/
@Override
public IArcGisCompassOption arcGisCompassOption() {
return mArcGisFounderBuilder.mIArcGisCompassOption;
}
/**
* @return 得到导航操作对象
*/
@Override
public IArcGisSearchOption arcGisSearchOption() {
return mArcGisFounderBuilder.mIArcGisSearchOption;
}
@Override
public IArcGisHotPotsOption arcGisHotPotsOption() {
return mArcGisFounderBuilder.mIArcGisHotPotsOption;
}
@Override
public IArcGisClusterOption arcGisClusterOption() {
return mArcGisFounderBuilder.mIArcGisClusterOption;
}
@Override
public IArcGisDrawOption arcGisDrawOption() {
return mArcGisFounderBuilder.mIArcGisDrawOption;
}
/**
* 外面暴露ArcGisLib相关方法,利用builder模式
*/
public static final class ArcGisFounderBuilder {
/**
* {@link Source}
*/
private Source mSource;
/**
* {@link Lifecycle}
*/
private Lifecycle mLifecycle;
/**
* {@link ArcGisMapView}
*/
private ArcGisBaseView mArcGisBaseView;
/**
* {@link ArcGisMapView}
*/
private ArcGisMapView mArcGisMapView;
/**
* {@link MapView}
*/
private MapView mMapView;
/**
* {@link ArcGisMapCompassView}
*/
private ArcGisLocationView mArcGisLocationView;
/**
* {@link ArcGisMapZoomView}
*/
private ArcGisMapZoomView mArcGisMapZoomView;
/**
* {@link ArcGisMapCompassView}
*/
private ArcGisMapCompassView mArcGisMapCompassView;
/**
* {@link ArcGisSearchView}
*/
private ArcGisSearchView mArcGisSearchView;
/**
* {@link ArcGisHotPotsView}
*/
private ArcGisHotPotsView mArcGisHotPotsView;
/**
* {@link ArcGisClusterView}
*/
private ArcGisClusterView mArcGisClusterView;
/**
* {@link ArcGisDrawView}
*/
private ArcGisDrawView mArcGisDrawView;
/**
* {@link IArcGisZoomOption}
*/
private IArcGisZoomOption mIArcGisZoomOption;
/**
* {@link IArcGisLocationOption}
*/
private IArcGisLocationOption mIArcGisLocationOption;
/**
* {@link IArcGisCompassOption}
*/
private IArcGisCompassOption mIArcGisCompassOption;
/**
* {@link IArcGisSearchOption}
*/
private IArcGisSearchOption mIArcGisSearchOption;
/**
* {@link IArcGisHotPotsOption}
*/
private IArcGisHotPotsOption mIArcGisHotPotsOption;
/**
* {@link IArcGisClusterOption}
*/
private IArcGisClusterOption mIArcGisClusterOption;
/**
* {@link IArcGisDrawOption}
*/
private IArcGisDrawOption mIArcGisDrawOption;
/**
* 地图网格背景
*/
private int mBackgroundGridColor = -1;
/**
* 地图网格线颜色
*/
private int mBackgroundGridLineColor = -1;
/**
* 地图网格线宽度
*/
private float mBackgroundGridLineWidth = 0.0f;
ArcGisFounderBuilder(Source mSource) {
this.mSource = mSource;
}
/**
* @param arcGisBaseView 得到基本布局
*/
public ArcGisFounderBuilder setParentLayout(ArcGisBaseView arcGisBaseView) {
this.mArcGisBaseView = arcGisBaseView;
this.mArcGisMapView = new PreCustomView(this).getArcGisMapView();
this.mMapView = new PreCustomView(this).getMapView();
return this;
}
/**
* @param lifecycle 生命周期
*/
public ArcGisFounderBuilder setLifecycle(Lifecycle lifecycle) {
this.mLifecycle = lifecycle;
return this;
}
/**
* @param colorId 地图网格背景色
*/
public ArcGisFounderBuilder setBackgroundGridColor(int colorId) {
this.mBackgroundGridColor = colorId;
return this;
}
/**
* @param colorId 地图网格线条颜色
*/
public ArcGisFounderBuilder setBackgroundGridLineColor(int colorId) {
this.mBackgroundGridLineColor = colorId;
return this;
}
/**
* @param width 地图网格线条宽度
*/
public ArcGisFounderBuilder setBackgroundGridLineWidth(float width) {
this.mBackgroundGridLineWidth = width;
return this;
}
public ArcGisFounderBuilder setDefaultArcGisLocation() {
this.mArcGisLocationView = new PreCustomView(this).getArcGisLocationView();
this.mIArcGisLocationOption = new PreCommonMapOption(this).defaultArcGisLocationOption();
return this;
}
/**
* 设置缩放View,缩放操作
*/
public ArcGisFounderBuilder setDefaultArcGisZoom() {
this.mArcGisMapZoomView = new PreCustomView(this).getArcGisZoomView();
this.mIArcGisZoomOption = new PreCommonMapOption(this).defaultArcGisZoomOption();
return this;
}
/**
* 设置CompassView,罗盘操作
*/
public ArcGisFounderBuilder setDefaultArcGisCompass() {
this.mArcGisMapCompassView = new PreCustomView(this).getArcGisMapCompassView();
this.mIArcGisCompassOption = new PreCommonMapOption(this).defaultArcGisCompassOption();
return this;
}
/**
* @return 开启搜索功能,默认不开启
*/
public ArcGisFounderBuilder setOpenSearch() {
this.mArcGisSearchView = new PreCustomView(this).getArcGisSearchView();
this.mIArcGisSearchOption = new PreCommonMapOption(this).defaultArcGisSearchOption();
return this;
}
/**
* @return 开启热力图功能,默认不开启
*/
public ArcGisFounderBuilder setOpenHotPots() {
this.mArcGisHotPotsView = new PreCustomView(this).getArcGisHotPotsView();
this.mIArcGisHotPotsOption = new PreCommonMapOption(this).defaultArcGisHotPotsOption();
return this;
}
/**
* @return 开启聚合功能,默认不开启
*/
public ArcGisFounderBuilder setOpenCluster() {
this.mArcGisClusterView = new PreCustomView(this).getArcGisClusterView();
this.mIArcGisClusterOption = new PreCommonMapOption(this).defaultArcGisClusterOption();
return this;
}
/**
* @return 开启绘制功能,默认不开启
*/
public ArcGisFounderBuilder setOpenDraw() {
this.mArcGisDrawView = new PreCustomView(this).getArcGisDrawView();
this.mIArcGisDrawOption = new PreCommonMapOption(this).defaultArcGisDrawOption();
return this;
}
/**
* @return {@link PreArcGisFounder}
*/
public ArcGisFounder createArcGisFounder() {
return new PreArcGisFounder(this).create();
}
/**
* 自定View实例化
*/
static class PreCustomView {
private ArcGisFounderBuilder mArcGisFounderBuilder;
PreCustomView(ArcGisFounderBuilder ArcGisFounderBuilder) {
this.mArcGisFounderBuilder = ArcGisFounderBuilder;
}
/**
* @return {@link ArcGisMapView} 强制将地图加入BaseView
*/
ArcGisMapView getArcGisMapView() {
return (ArcGisMapView) mArcGisFounderBuilder.mArcGisBaseView.getChildAt(0);
}
/**
* @return {@link MapView}
*/
MapView getMapView() {
return (MapView) mArcGisFounderBuilder.mArcGisMapView.getChildAt(0);
}
/**
* @return {@link ArcGisLocationView}
*/
ArcGisLocationView getArcGisLocationView() {
return new ArcGisLocationView(mArcGisFounderBuilder.mSource.getContext(), mArcGisFounderBuilder.mArcGisMapView);
}
/**
* @return {@link ArcGisMapZoomView}
*/
ArcGisMapZoomView getArcGisZoomView() {
return new ArcGisMapZoomView(mArcGisFounderBuilder.mSource.getContext(), mArcGisFounderBuilder.mMapView);
}
/**
* @return {@link ArcGisMapCompassView}
*/
ArcGisMapCompassView getArcGisMapCompassView() {
return new ArcGisMapCompassView(mArcGisFounderBuilder.mSource.getContext(), mArcGisFounderBuilder.mArcGisMapView);
}
/**
* @return {@link ArcGisSearchView}
*/
ArcGisSearchView getArcGisSearchView() {
return new ArcGisSearchView(mArcGisFounderBuilder.mSource.getContext(), mArcGisFounderBuilder.mArcGisLocationView);
}
/**
* @return {@link ArcGisHotPotsView}
*/
ArcGisHotPotsView getArcGisHotPotsView() {
return new ArcGisHotPotsView(mArcGisFounderBuilder.mSource.getContext(), mArcGisFounderBuilder.mArcGisMapView);
}
/**
* @return {@link ArcGisClusterView}
*/
ArcGisClusterView getArcGisClusterView() {
return new ArcGisClusterView(mArcGisFounderBuilder.mSource.getContext(), mArcGisFounderBuilder.mArcGisMapView, mArcGisFounderBuilder.mArcGisLocationView);
}
/**
* @return {@link ArcGisDrawView}
*/
ArcGisDrawView getArcGisDrawView() {
return new ArcGisDrawView(mArcGisFounderBuilder.mSource.getContext(), mArcGisFounderBuilder.mArcGisMapView, mArcGisFounderBuilder.mArcGisLocationView);
}
}
/**
* {@link ArcGisFounder}
*/
static class PreArcGisFounder {
/**
* {@link ArcGisFounderBuilder}
*/
private ArcGisFounderBuilder mArcGisFounderBuilder;
/**
* 地图网格背景对象
*/
private BackgroundGrid mMainBackgroundGrid;
PreArcGisFounder(ArcGisFounderBuilder ArcGisFounderBuilder) {
this.mArcGisFounderBuilder = ArcGisFounderBuilder;
this.mMainBackgroundGrid = new BackgroundGrid();
}
/**
* @return {@link ArcGisFounder}
*/
ArcGisFounder create() {
mMainBackgroundGrid.setColor(mArcGisFounderBuilder.mBackgroundGridColor);
mMainBackgroundGrid.setGridLineColor(mArcGisFounderBuilder.mBackgroundGridLineColor);
mMainBackgroundGrid.setGridLineWidth(mArcGisFounderBuilder.mBackgroundGridLineWidth);
mArcGisFounderBuilder.mMapView.setBackgroundGrid(mMainBackgroundGrid);
if (mArcGisFounderBuilder.mArcGisLocationView != null) {
mArcGisFounderBuilder.mArcGisBaseView.addView(mArcGisFounderBuilder.mArcGisLocationView);
}
if (mArcGisFounderBuilder.mArcGisMapZoomView != null) {
mArcGisFounderBuilder.mArcGisBaseView.addView(mArcGisFounderBuilder.mArcGisMapZoomView);
}
if (mArcGisFounderBuilder.mArcGisMapCompassView != null) {
mArcGisFounderBuilder.mArcGisBaseView.addView(mArcGisFounderBuilder.mArcGisMapCompassView);
}
if (mArcGisFounderBuilder.mArcGisSearchView != null) {
mArcGisFounderBuilder.mArcGisBaseView.addView(mArcGisFounderBuilder.mArcGisSearchView);
}
if (mArcGisFounderBuilder.mArcGisHotPotsView != null) {
mArcGisFounderBuilder.mArcGisBaseView.addView(mArcGisFounderBuilder.mArcGisHotPotsView);
}
if (mArcGisFounderBuilder.mArcGisClusterView != null) {
mArcGisFounderBuilder.mArcGisBaseView.addView(mArcGisFounderBuilder.mArcGisClusterView);
}
if (mArcGisFounderBuilder.mArcGisDrawView != null) {
mArcGisFounderBuilder.mArcGisBaseView.addView(mArcGisFounderBuilder.mArcGisDrawView);
}
if (!ToolUtil.isNetWorkAvailable(mArcGisFounderBuilder.mSource.getContext())) {
Toast.makeText(mArcGisFounderBuilder.mSource.getContext(), mArcGisFounderBuilder.mSource.getContext().getString(R.string.string_net), Toast.LENGTH_LONG).show();
mArcGisFounderBuilder.mArcGisBaseView.setVisibility(View.GONE);
}
return new ArcGisFounder(mArcGisFounderBuilder);
}
}
/**
* 地图所有默认操作实例化
*/
static class PreCommonMapOption {
private ArcGisFounderBuilder mArcGisFounderBuilder;
PreCommonMapOption(ArcGisFounderBuilder ArcGisFounderBuilder) {
this.mArcGisFounderBuilder = ArcGisFounderBuilder;
}
/**
* @return {@link IArcGisZoomOption}
*/
IArcGisZoomOption defaultArcGisZoomOption() {
return new ArcGisZoom(mArcGisFounderBuilder.mArcGisMapZoomView);
}
/**
* @return {@link IArcGisLocationOption}
*/
IArcGisLocationOption defaultArcGisLocationOption() {
return new ArcGisLocation(mArcGisFounderBuilder.mArcGisLocationView);
}
/**
* @return {@link IArcGisCompassOption}
*/
IArcGisCompassOption defaultArcGisCompassOption() {
return new ArcGisCompass(mArcGisFounderBuilder.mArcGisMapCompassView);
}
/**
* @return {@link IArcGisSearchOption}
*/
IArcGisSearchOption defaultArcGisSearchOption() {
return new ArcGisSearch(mArcGisFounderBuilder.mArcGisSearchView);
}
/**
* @return {@link IArcGisHotPotsOption}
*/
IArcGisHotPotsOption defaultArcGisHotPotsOption() {
return new ArcGisHotPots(mArcGisFounderBuilder.mArcGisHotPotsView);
}
/**
* @return {@link IArcGisClusterOption}
*/
IArcGisClusterOption defaultArcGisClusterOption() {
return new ArcGisCluster(mArcGisFounderBuilder.mArcGisClusterView);
}
/**
* @return {@link IArcGisDrawOption}
*/
IArcGisDrawOption defaultArcGisDrawOption() {
return new ArcGisDraw(mArcGisFounderBuilder.mArcGisDrawView);
}
}
}
}
package cn.com.founder.arcgislib.nonavi.cluster;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.cluster.listener.IClusterPointInfoListener;
import cn.com.founder.arcgislib.nonavi.cluster.option.IArcGisClusterOption;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.view.ArcGisClusterView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/16 15:55
* EMail:luo_shaopeng@founder.com.cn
* Description:聚合
*/
public class ArcGisCluster implements IArcGisClusterOption {
/**
* {@link ArcGisClusterView}
*/
private ArcGisClusterView mArcGisClusterView;
public ArcGisCluster(ArcGisClusterView arcGisClusterView) {
this.mArcGisClusterView = arcGisClusterView;
}
/**
* @param isShow boolean-是否显示聚合布局
* 默认显示
*/
@Override
public IArcGisClusterOption setShowClusterLayout(boolean isShow) {
mArcGisClusterView.setShowClusterLayout(isShow);
return this;
}
/**
* @param location {@link Variable.ViewLocation } ClusterView显示位置
*/
@Override
public IArcGisClusterOption setClusterViewLocation(Variable.ViewLocation location) {
mArcGisClusterView.setClusterViewLocation(location);
return this;
}
/**
* @param clusterImage int(资源ID)-聚合图片
*/
@Override
public IArcGisClusterOption setClusterImage(int clusterImage) {
mArcGisClusterView.setClusterImage(clusterImage);
return this;
}
/**
* @param pointList 聚合点集合
*/
@Override
public IArcGisClusterOption setCluseterData(List<PointModel> pointList) {
mArcGisClusterView.setClusterData(pointList);
return this;
}
@Override
public IArcGisClusterOption setGeoDistance(double distance) {
mArcGisClusterView.setGeoDistance(distance);
return this;
}
@Override
public IArcGisClusterOption setIClusterPointInfoListener(IClusterPointInfoListener clusterPointInfoListener) {
mArcGisClusterView.setIClusterPointInfoListener(clusterPointInfoListener);
return this;
}
/**
* @return 得到聚合样式
*/
@Override
public ArcGisClusterView.ClusterStyleBuilder getClusterStyleBuilder() {
return mArcGisClusterView.getClusterStyleBuilder();
}
@Override
public ArcGisClusterView.CalloutStyleBuilder getCalloutStyleBuilder() {
return mArcGisClusterView.getCalloutStyleBuilder();
}
@Override
public ArcGisClusterView.CalloutContentBuilder getCalloutContentBuilder() {
return mArcGisClusterView.getCalloutContentBuilder();
}
}
package cn.com.founder.arcgislib.nonavi.cluster.listener;
import cn.com.founder.arcgislib.nonavi.model.LocationModel;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/6/30 18:32
* EMail:luo_shaopeng@founder.com.cn
* Description:聚合选择得点得信息
*/
public interface IClusterPointInfoListener {
/**
* 点信息回调
* @param locationModel {@link LocationModel}
*/
void pointInfoCallBack(LocationModel locationModel);
}
package cn.com.founder.arcgislib.nonavi.cluster.option;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.cluster.listener.IClusterPointInfoListener;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.view.ArcGisClusterView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/16 15:56
* EMail:luo_shaopeng@founder.com.cn
* Description:聚合
*/
public interface IArcGisClusterOption {
/**
* @param isShow boolean-是否显示聚合布局
* 默认显示
*/
IArcGisClusterOption setShowClusterLayout(boolean isShow);
/**
* @param location {@link Variable.ViewLocation } ClusterView显示位置
*/
IArcGisClusterOption setClusterViewLocation(Variable.ViewLocation location);
/**
* @param clusterImage int(资源ID)-聚合图片
*/
IArcGisClusterOption setClusterImage(int clusterImage);
/**
* @param pointList 聚合点集合
*/
IArcGisClusterOption setCluseterData(List<PointModel> pointList);
/**
* @param distance 默认逆地理编码距离是0.1,单位是km;
* 需要在最上层调用
*
*/
IArcGisClusterOption setGeoDistance(double distance);
/**
* @param clusterPointInfoListener 设置聚合点信息回调
*/
IArcGisClusterOption setIClusterPointInfoListener(IClusterPointInfoListener clusterPointInfoListener);
/**
* @return 得到聚合样式
*/
ArcGisClusterView.ClusterStyleBuilder getClusterStyleBuilder();
/**
* callout样式
*/
ArcGisClusterView.CalloutStyleBuilder getCalloutStyleBuilder();
/**
* callout内容样式
*/
ArcGisClusterView.CalloutContentBuilder getCalloutContentBuilder();
}
package cn.com.founder.arcgislib.nonavi.common;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 17:37
* EMail:luo_shaopeng@founder.com.cn
* Description:共同变量
*/
public class Variable {
public static enum DrawType {
TEXT,
POINT,
LINE,
POLYGON,
ORTHOGON,
CIRCLE;
}
public static enum GraphType {
LINE,
POLYGON,
ORTHOGON,
CIRCLE,
ELLIPSE,
RHOMBUS;
}
public static enum Measure {
M,
KM,
KIM,
M2,
KM2,
HM2,
A2;
}
public static enum LayerType {
TILE,
WMTS,
IMG,
BUNDLE
}
public static enum ViewLocation{
LEFT_TOP,
RIGHT_TOP,
CENTER,
LEFT_BOTTOM,
RIGHT_BOTTOM
}
public static enum TouchUp{
UP,
RORATE,
LONG_PRESS
}
public static enum CalloutLeaderPosition{
DEFAULT,
AUTO
}
public static enum SearchType{
NONE,
SEARCH,
SEARCH_TYPE_RESULT,
START_ADDRESS_SEARCH,
END_ADDRESS_SEARCH,
}
public static enum InputCalendar{
START,
END
}
public static enum LocationChangeType implements Parcelable {
START_LOCATION,
MOVE_MAP,
CLICK_MAP,
IMPORT_POINT,
CALLOUT_OK;
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(ordinal());
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<LocationChangeType> CREATOR = new Creator<LocationChangeType>() {
@Override
public LocationChangeType createFromParcel(Parcel in) {
return LocationChangeType.values()[in.readInt()];
}
@Override
public LocationChangeType[] newArray(int size) {
return new LocationChangeType[size];
}
};
}
}
package cn.com.founder.arcgislib.nonavi.compass;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.compass.listener.IOnClickListener;
import cn.com.founder.arcgislib.nonavi.compass.listener.IRotationListener;
import cn.com.founder.arcgislib.nonavi.compass.option.IArcGisCompassOption;
import cn.com.founder.arcgislib.nonavi.view.ArcGisMapCompassView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/8 14:20
* EMail:luo_shaopeng@founder.com.cn
* Description:罗盘操作
*/
public class ArcGisCompass implements IArcGisCompassOption {
/**
* {@link ArcGisMapCompassView}
*/
private ArcGisMapCompassView mArcGisMapCompassView;
public ArcGisCompass(ArcGisMapCompassView arcGisMapCompassView) {
this.mArcGisMapCompassView = arcGisMapCompassView;
}
/**
* @param isShow boolean-是否显示罗盘布局
*/
@Override
public IArcGisCompassOption setShowCompassLayout(boolean isShow) {
mArcGisMapCompassView.setShowCompassLayout(isShow);
return this;
}
/**
* @param location {@link Variable.ViewLocation } CompassView显示位置
*/
@Override
public IArcGisCompassOption setCompassViewLocation(Variable.ViewLocation location) {
mArcGisMapCompassView.setCompassViewLocation(location);
return this;
}
/**
* @param compassImage int(资源ID)-罗盘图片
*/
@Override
public IArcGisCompassOption setCompassImage(int compassImage) {
mArcGisMapCompassView.setCompassImage(compassImage);
return this;
}
/**
* @param iOnClickListener 罗盘点击事件
*/
@Override
public IArcGisCompassOption setOnClik(IOnClickListener iOnClickListener) {
mArcGisMapCompassView.setIOnClik(iOnClickListener);
return this;
}
/**
* @param iRotationListener 罗盘旋转事件
*/
@Override
public IArcGisCompassOption setIRotationAngleListener(IRotationListener iRotationListener) {
mArcGisMapCompassView.setIRotationListener(iRotationListener);
return this;
}
}
package cn.com.founder.arcgislib.nonavi.compass.listener;
import android.view.View;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/8 14:48
* EMail:luo_shaopeng@founder.com.cn
* Description:点击事件
*/
public interface IOnClickListener {
/**
* @param v 点击罗盘监听
*/
void onClick(View v);
}
package cn.com.founder.arcgislib.nonavi.compass.listener;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/8 15:27
* EMail:luo_shaopeng@founder.com.cn
* Description:地图旋转接口
*/
public interface IRotationListener {
/**
* 旋转监听
*/
void iRotationAngleListener();
}
package cn.com.founder.arcgislib.nonavi.compass.option;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.compass.listener.IOnClickListener;
import cn.com.founder.arcgislib.nonavi.compass.listener.IRotationListener;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/8 14:21
* EMail:luo_shaopeng@founder.com.cn
* Description:罗盘操作
*/
public interface IArcGisCompassOption {
/**
* @param isShow boolean-是否显示罗盘布局
* 默认显示
*/
IArcGisCompassOption setShowCompassLayout(boolean isShow);
/**
* @param location {@link Variable.ViewLocation } CompassView显示位置
*/
IArcGisCompassOption setCompassViewLocation(Variable.ViewLocation location);
/**
* @param compassImage int(资源ID)-罗盘图片
*/
IArcGisCompassOption setCompassImage(int compassImage);
/**
* @param iOnClickListener 罗盘点击事件
* @return
*/
IArcGisCompassOption setOnClik(IOnClickListener iOnClickListener);
/**
* @param iRotationListener 罗盘旋转事件
*/
IArcGisCompassOption setIRotationAngleListener(IRotationListener iRotationListener);
}
package cn.com.founder.arcgislib.nonavi.constants;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 15:41
* EMail:luo_shaopeng@founder.com.cn
* Description:Url 管理
*/
public class Constants {
/*****************************************互联网*********************************************
//互联网-地图
private static String baseUrl = "http://47.92.225.109:6080/arcgis/rest/services/founder/dg20191120/MapServer";
//互联网-Geo
private static String baseGeoUrl = "http://68.174.25.107:8090/esBzdzTestQuery";
//互联网-newGeo
private static String baseNewGeoUrl = "http://68.174.69.46:8051/queryRgeo";
//互联网-搜索
private static String searchUrl = "http://47.92.226.24:8051/selectPoiDataList";
//二标四实-单位
private static String dwUrl = "http://68.174.69.46:8051/selectVdwjx";
//二标四实-房屋
private static String fwUrl = "http://68.174.69.46:8051/selectVfwjx";
//二标四实-地址
private static String dzUrl = "http://68.174.69.46:8051/selectVdzjx";
//热力图
private static String hotMapUrl = "http://47.92.225.109:6080/arcgis/rest/services/gp/rltModel/GPServer/hotPotServer";
// private static String hotMapUrl = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/911CallsHotspot/GPServer/911%20Calls%20Hotspot";
/**********************************************************************************************/
/*****************************************用户网***********************************************/
//用户网-地图
private static String baseUrl = "http://192.168.2.56:19076/arcgis/rest/services/founder/dg20191120/MapServer";
//公安网-Geo
private static String baseGeoUrl = "http://192.168.2.56:19087/esBzdzTestQuery";
//用户网-newGeo
private static String baseNewGeoUrl = "http://192.168.2.56:19084/queryRgeo";
//用户网-搜索
private static String searchUrl = "http://192.168.2.56:19084/selectPoiDataList";
//二标四实-单位
private static String dwUrl = "http://192.168.2.56:19084/selectVdwjx";
//二标四实-房屋
private static String fwUrl = "http://192.168.2.56:19084/selectVfwjx";
//二标四实-地址
private static String dzUrl = "http://192.168.2.56:19084/selectVdzjx";
//热力图
private static String hotMapUrl = "http://192.168.2.56:19088/arcgis/rest/services/gp/rltModel/GPServer/hotPotServer";
/**********************************************************************************************
/*****************************************公安网***********************************************
//公安网-地图
private static String baseUrl = "http://68.174.69.45:6080/arcgis/rest/services/founder/dg20191120/MapServer";
//公安网-Geo
private static String baseGeoUrl = "http://68.174.25.107:8090/esBzdzTestQuery";
//公安网-newGeo
private static String baseNewGeoUrl = "http://68.174.69.46:8051/queryRgeo";
//公安网-搜索
private static String searchUrl = "http://68.174.69.46:8051/selectPoiDataList";
//二标四实-单位
private static String dwUrl = "http://68.174.69.46:8051/selectVdwjx";
//二标四实-房屋
private static String fwUrl = "http://68.174.69.46:8051/selectVfwjx";
//二标四实-地址
private static String dzUrl = "http://68.174.69.46:8051/selectVdzjx";
//热力图
private static String hotMapUrl = "http://68.174.69.45:6081/arcgis/rest/services/gp/rltModel/GPServer/hotPotServer";
/**********************************************************************************************/
// argis证书
private static String baseRunTime = "runtimelite,1000,rud9526010123,none,XXMFA0PL4S0MC2EN0175";
//天地图key,使用的是服务器端
private static String baseTianDiTuKey = "39edeab91620fe3c5a1b282228ef6e46";
//天地图Geo
private static String baseTianDiTuGeoUrl = "http://api.tianditu.gov.cn/geocoder";
//arcGis证书
public static final String BASE_MAP_RUNTIME = baseRunTime;
//服务器Url
public static final String BASE_MAP_SERVER_URL = baseUrl;
//天地图
public static final String BASE_TIANDITU_KEY = baseTianDiTuKey;
//天地图逆地理编码查询
public static final String BASE_TIANDITU_GEO_URL = baseTianDiTuGeoUrl;
//逆地理编码
// public static final String BASE_GEO_URL = baseGeoUrl;
public static final String BASE_GEO_URL = baseNewGeoUrl;
//搜索
public static final String BASE_SEARCH_URL = searchUrl;
//热力图
public static final String BASE_HOT_POTS_URL = hotMapUrl;
//二标四实-房屋
public static final String BASE_FW_URL = fwUrl;
//二标四实-地址
public static final String BASE_DZ_URL = dzUrl;
//二标四实-单位
public static final String BASE_DW_URL = dwUrl;
}
package cn.com.founder.arcgislib.nonavi.draw;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.draw.option.IArcGisDrawOption;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.view.ArcGisDrawView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/7/3 15:15
* EMail:luo_shaopeng@founder.com.cn
* Description:绘制
*/
public class ArcGisDraw implements IArcGisDrawOption {
/**
* {@link ArcGisDrawView}
*/
private ArcGisDrawView mArcGisDrawView;
public ArcGisDraw(ArcGisDrawView arcGisDrawView) {
this.mArcGisDrawView = arcGisDrawView;
}
@Override
public IArcGisDrawOption setShowDrawLayout(boolean isShow) {
mArcGisDrawView.setShowDrawLayout(isShow);
return this;
}
@Override
public IArcGisDrawOption setDrawViewLocation(Variable.ViewLocation location) {
mArcGisDrawView.setDrawViewLocation(location);
return this;
}
@Override
public IArcGisDrawOption setDrawImage(int drawImage) {
mArcGisDrawView.setDrawImage(drawImage);
return this;
}
/**
* @param canvaType 绘制类型:
* "LINE" 线
* "POLYGON" 多边形
* "ORTHOGON" 矩形
* "CIRCLE" 圆
* @param pointModelList 数据集合点
*/
@Override
public IArcGisDrawOption setDrawPointData(String canvaType, List<PointModel> pointModelList) {
mArcGisDrawView.setDrawPointData(canvaType,pointModelList);
return this;
}
}
package cn.com.founder.arcgislib.nonavi.draw.option;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/7/3 15:16
* EMail:luo_shaopeng@founder.com.cn
* Description:绘制
*/
public interface IArcGisDrawOption {
/**
* @param isShow boolean-是否显示绘制布局
* 默认显示
*/
IArcGisDrawOption setShowDrawLayout(boolean isShow);
/**
* @param location {@link Variable.ViewLocation } DrawView显示位置
*/
IArcGisDrawOption setDrawViewLocation(Variable.ViewLocation location);
/**
* @param drawImage int(资源ID)-绘制图片
*/
IArcGisDrawOption setDrawImage(int drawImage);
/**
* @param canvaType 绘制类型:
* "LINE" 线
* "POLYGON" 多边形
* "ORTHOGON" 矩形 2的倍数点
* "CIRCLE" 圆 2的倍数点
* @param pointModelList 数据集合点
*/
IArcGisDrawOption setDrawPointData(String canvaType, List<PointModel> pointModelList);
}
package cn.com.founder.arcgislib.nonavi.hotpots;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.hotpots.option.IArcGisHotPotsOption;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.view.ArcGisHotPotsView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/15 17:33
* EMail:luo_shaopeng@founder.com.cn
* Description:热力图
*/
public class ArcGisHotPots implements IArcGisHotPotsOption {
/**
* {@link ArcGisHotPotsView}
*/
private ArcGisHotPotsView mArcGisHotPots;
public ArcGisHotPots(ArcGisHotPotsView mArcGisHotPots) {
this.mArcGisHotPots = mArcGisHotPots;
}
@Override
public IArcGisHotPotsOption setShowHotPotsLayout(boolean isShow) {
mArcGisHotPots.setShowHotPotsLayout(isShow);
return this;
}
@Override
public IArcGisHotPotsOption setHotPotsViewLocation(Variable.ViewLocation location) {
mArcGisHotPots.setHotPotsViewLocation(location);
return this;
}
@Override
public IArcGisHotPotsOption setHotPotsImage(int hotPotsImage) {
mArcGisHotPots.setHotPotsImage(hotPotsImage);
return this;
}
@Override
public IArcGisHotPotsOption setHotPotsPonitData(List<PointModel> pointList) {
mArcGisHotPots.setHotPotsPointData(pointList);
return this;
}
}
package cn.com.founder.arcgislib.nonavi.hotpots.option;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/15 17:34
* EMail:luo_shaopeng@founder.com.cn
* Description:热力图
*/
public interface IArcGisHotPotsOption {
/**
* @param isShow boolean-是否显示热力图布局
* 默认隐藏
*/
IArcGisHotPotsOption setShowHotPotsLayout(boolean isShow);
/**
* @param location {@link Variable.ViewLocation } HotPotsView显示位置
*/
IArcGisHotPotsOption setHotPotsViewLocation(Variable.ViewLocation location);
/**
* @param hotPotsImage int(资源ID)-热力图图片
*/
IArcGisHotPotsOption setHotPotsImage(int hotPotsImage);
/**
* @param pointList 点集合
*/
IArcGisHotPotsOption setHotPotsPonitData(List<PointModel> pointList);
}
package cn.com.founder.arcgislib.nonavi.location;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.location.listener.ILocationChangeListener;
import cn.com.founder.arcgislib.nonavi.location.option.IArcGisLocationOption;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.view.ArcGisLocationView;
import cn.com.founder.arcgislib.nonavi.view.ArcGisMapView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/5 15:17
* EMail:luo_shaopeng@founder.com.cn
* Description:位置操作
*/
public class ArcGisLocation implements IArcGisLocationOption {
/**
* {@link ArcGisMapView}
*/
private ArcGisLocationView mArcGisLocationView;
public ArcGisLocation(ArcGisLocationView arcGisLocationView) {
this.mArcGisLocationView = arcGisLocationView;
}
/**
* 获取当前位置 默认值5d
*/
@Override
public IArcGisLocationOption startLocation(double scale) {
mArcGisLocationView.startLocation(scale);
return this;
}
/**
* @param x x点
* @param y 点
*/
@Override
public IArcGisLocationOption startLocation(double x, double y, double scale) {
mArcGisLocationView.startLocation(x, y, scale);
return this;
}
/**
* @param locationChangeListener 设置位置监听
*/
@Override
public IArcGisLocationOption setLocationChangeListener(ILocationChangeListener locationChangeListener) {
mArcGisLocationView.setILocationChangeListener(locationChangeListener);
return this;
}
/**
* @return 停止定位
*/
@Override
public IArcGisLocationOption stopLocation() {
mArcGisLocationView.stopLocation();
return this;
}
/**
* @param isShow boolean-是否显示定位布局
*/
@Override
public IArcGisLocationOption setShowLocationLayout(boolean isShow) {
mArcGisLocationView.setShowLocationLayout(isShow);
return this;
}
/**
* @param isShow boolean-是否显示导入布局
*/
@Override
public IArcGisLocationOption setShowTXTImportLayout(boolean isShow) {
mArcGisLocationView.setShowTXTImportLayout(isShow);
return this;
}
/**
* @param location {@link Variable.ViewLocation } LocationView显示位置
*/
@Override
public IArcGisLocationOption setLocationViewLocation(Variable.ViewLocation location) {
mArcGisLocationView.setLocationViewLocation(location);
return this;
}
/**
* @param locationImage int(资源ID)-定位图片
*/
@Override
public IArcGisLocationOption setLocationImage(int locationImage) {
mArcGisLocationView.setLocationImage(locationImage);
return this;
}
/**
* @param importImage int(资源ID)-导入图片
*/
@Override
public IArcGisLocationOption setImportImage(int importImage) {
mArcGisLocationView.setImportImage(importImage);
return this;
}
/**
* @param centerLocationImage int(资源ID)-中心位置图片
*/
@Override
public IArcGisLocationOption setCenterLocationImage(int centerLocationImage) {
mArcGisLocationView.setCenterLocationImage(centerLocationImage);
return this;
}
/**
* @param labelLocationNormalImage int(资源ID)-标记位置正常图片
*/
@Override
public IArcGisLocationOption setLabelLocationNormalImage(int labelLocationNormalImage) {
mArcGisLocationView.setLabelLocationNormalImage(labelLocationNormalImage);
return this;
}
/**
* @param labelLocationSelectedImage int(资源ID)-标记位置选中图片
*/
@Override
public IArcGisLocationOption setLabelLocationSelectedImage(int labelLocationSelectedImage) {
mArcGisLocationView.setLabelLocationSelectedImage(labelLocationSelectedImage);
return this;
}
/**
* @param pointModelList 导入点数据{@link PointModel}
*/
@Override
public IArcGisLocationOption setImportPointData(List<PointModel> pointModelList) {
mArcGisLocationView.setImportPointData(pointModelList);
return this;
}
/**
* @param isFollow 设置是否跟随地图获取中心点
*/
@Override
public IArcGisLocationOption setFollowMapViewPoint(boolean isFollow) {
mArcGisLocationView.setFollowMapViewPoint(isFollow);
return this;
}
/**
* @param distance 默认逆地理编码距离是0.1,单位是km;
* 需要在最上层调用
*/
@Override
public IArcGisLocationOption setGeoDistance(double distance) {
mArcGisLocationView.setGeoDistance(distance);
return this;
}
/**
* @param showMap 是否显示地图,默认显示
*/
@Override
public IArcGisLocationOption setShowMap(boolean showMap) {
mArcGisLocationView.setShowMap(showMap);
return this;
}
/**
* @param showLoading 是否显示请求加载框,默认显示
*/
@Override
public IArcGisLocationOption setShowLoading(boolean showLoading) {
mArcGisLocationView.setShowLoading(showLoading);
return this;
}
@Override
public ArcGisLocationView.CalloutStyleBuilder getCalloutStyleBuilder() {
return mArcGisLocationView.getCalloutStyleBuilder();
}
@Override
public ArcGisLocationView.CalloutContentBuilder getCalloutContentBuilder() {
return mArcGisLocationView.getCalloutContentBuilder();
}
}
package cn.com.founder.arcgislib.nonavi.location.listener;
import cn.com.founder.arcgislib.nonavi.model.LocationModel;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/7 17:00
* EMail:luo_shaopeng@founder.com.cn
* Description:位置改变监听
*/
public interface ILocationChangeListener {
/**
* 位置信息回调
* @param locationModel {@link LocationModel}
*/
void locationCallBack(LocationModel locationModel);
}
package cn.com.founder.arcgislib.nonavi.location.option;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.location.listener.ILocationChangeListener;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.view.ArcGisLocationView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/5 15:18
* EMail:luo_shaopeng@founder.com.cn
* Description:位置
*/
public interface IArcGisLocationOption {
/**
* 开始定位
* @param scale 初始地图Zoom层级 默认4d
*/
IArcGisLocationOption startLocation(double scale);
/**
* 手动定位
* @param x x点
* @param y 点
*/
IArcGisLocationOption startLocation(double x, double y,double scale);
/**
* @param locationChangeListener 设置位置监听
*/
IArcGisLocationOption setLocationChangeListener(ILocationChangeListener locationChangeListener);
/**
* @return 停止获取位置
*/
IArcGisLocationOption stopLocation();
/**
* @param isShow boolean-是否显示定位布局
* 默认显示
*/
IArcGisLocationOption setShowLocationLayout(boolean isShow);
/**
* @param isShow boolean-是否显示导入TXT布局
* 默认隐藏
*/
IArcGisLocationOption setShowTXTImportLayout(boolean isShow);
/**
* @param location {@link Variable.ViewLocation } LocationView显示位置
*/
IArcGisLocationOption setLocationViewLocation(Variable.ViewLocation location);
/**
* @param locationImage int(资源ID)-定位图片
*/
IArcGisLocationOption setLocationImage(int locationImage);
/**
* @param importImage int(资源ID)-导入图片
*/
IArcGisLocationOption setImportImage(int importImage);
/**
* @param centerLocationImage int(资源ID)-中心位置图片
*/
IArcGisLocationOption setCenterLocationImage(int centerLocationImage);
/**
* @param labelLocationNormalImage int(资源ID)-标记位置正常图片
*/
IArcGisLocationOption setLabelLocationNormalImage(int labelLocationNormalImage);
/**
* @param labelLocationSelectedImage int(资源ID)-标记位置选中图片
*/
IArcGisLocationOption setLabelLocationSelectedImage(int labelLocationSelectedImage);
/**
* @param pointModelList 导入点数据{@link PointModel}
*/
IArcGisLocationOption setImportPointData(List<PointModel> pointModelList);
/**
* @param isFollow 设置是否跟随地图获取中心点
* 默认不跟随
*/
IArcGisLocationOption setFollowMapViewPoint(boolean isFollow);
/**
* @param distance 默认逆地理编码距离是0.1,单位是km;
* 需要在最上层调用
*
*/
IArcGisLocationOption setGeoDistance(double distance);
/**
* @param showMap 是否显示地图,默认显示
*/
IArcGisLocationOption setShowMap(boolean showMap);
/**
* @param showLoading 是否显示请求加载框,默认显示
*/
IArcGisLocationOption setShowLoading(boolean showLoading);
/**
* callout样式
*/
ArcGisLocationView.CalloutStyleBuilder getCalloutStyleBuilder();
/**
* callout内容样式
*/
ArcGisLocationView.CalloutContentBuilder getCalloutContentBuilder();
}
package cn.com.founder.arcgislib.nonavi.model;
import android.os.Parcel;
import android.os.Parcelable;
import cn.com.founder.arcgislib.nonavi.common.Variable;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/7 17:32
* EMail:luo_shaopeng@founder.com.cn
* Description:位置数据模型
*/
public class LocationModel implements Parcelable {
/**
* x点
*/
private double xPoint;
/**
* y点
*/
private double yPoint;
/**
* 地址
*/
private String address;
/**
* poi
*/
private String poi;
/**
* 补充信息
*/
private String extraInfo;
private Variable.LocationChangeType locationChangeType;
private boolean isPoiData = true;
public LocationModel(double xPoint, double yPoint, String address, String poi, String extraInfo, Variable.LocationChangeType locationChangeType) {
this.xPoint = xPoint;
this.yPoint = yPoint;
this.address = address;
this.poi = poi;
this.extraInfo = extraInfo;
this.locationChangeType = locationChangeType;
}
public LocationModel(double xPoint, double yPoint, String address, String poi, String extraInfo) {
this.xPoint = xPoint;
this.yPoint = yPoint;
this.address = address;
this.poi = poi;
this.extraInfo = extraInfo;
}
private LocationModel(Parcel in){
this.xPoint = in.readDouble();
this.yPoint = in.readDouble();
this.address = in.readString();
this.poi = in.readString();
this.extraInfo = in.readString();
this.locationChangeType = in.readParcelable(Variable.LocationChangeType.class.getClassLoader());
this.isPoiData = in.readByte() != 0;
}
public static final Creator<LocationModel> CREATOR = new Creator<LocationModel>() {
@Override
public LocationModel createFromParcel(Parcel in) {
return new LocationModel(in);
}
@Override
public LocationModel[] newArray(int size) {
return new LocationModel[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeDouble(xPoint);
parcel.writeDouble(yPoint);
parcel.writeString(address);
parcel.writeString(poi);
parcel.writeString(extraInfo);
parcel.writeParcelable(locationChangeType,i);
parcel.writeByte(this.isPoiData ? (byte) 1 : (byte) 0);
}
/**
* @return double-得到X点
*/
public double getXPoint() {
return xPoint;
}
/**
* @param xPoint 设置X点
*/
public void setXPoint(double xPoint) {
this.xPoint = xPoint;
}
/**
* @return double-得到Y点
*/
public double getYPoint() {
return yPoint;
}
/**
* @param yPoint 设置Y点
*/
public void setYPoint(double yPoint) {
this.yPoint = yPoint;
}
/**
* @return String-得到地址
*/
public String getAddress() {
return address;
}
/**
* @param address 设置地址
*/
public void setAddress(String address) {
this.address = address;
}
/**
* @return String-得到poi
*/
public String getPoi() {
return poi;
}
/**
* @param poi 设置poi
*/
public void setPoi(String poi) {
this.poi = poi;
}
/**
* @return String-得到补充信息
*/
public String getExtraInfo() {
return extraInfo;
}
/**
* @param extraInfo 设置补充信息
*/
public void setExtraInfo(String extraInfo) {
this.extraInfo = extraInfo;
}
public String getLocationChangeType() {
switch (locationChangeType){
case START_LOCATION:
return "START_LOCATION";
case MOVE_MAP:
return "MOVE_MAP";
case CLICK_MAP:
return "CLICK_MAP";
case IMPORT_POINT:
return "IMPORT_POINT";
case CALLOUT_OK:
return "CALLOUT_OK";
default:
return "未知操作";
}
}
public void setLocationChangeType(Variable.LocationChangeType locationChangeType) {
this.locationChangeType = locationChangeType;
}
public double getxPoint() {
return xPoint;
}
public void setxPoint(double xPoint) {
this.xPoint = xPoint;
}
public double getyPoint() {
return yPoint;
}
public void setyPoint(double yPoint) {
this.yPoint = yPoint;
}
public boolean isPoiData() {
return isPoiData;
}
public void setPoiData(boolean poiData) {
isPoiData = poiData;
}
}
package cn.com.founder.arcgislib.nonavi.model;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/4/16 09:49
* EMail:luo_shaopeng@founder.com.cn
* Description:当前项目导入点实体类
*/
public class PointModel implements Parcelable {
/**
* x点 (经度 longitude)
*/
private double xPoint;
/**
* y点 (纬度 latitude)
*/
private double yPoint;
private String pointName;
public PointModel(){}
public PointModel(double xPoint, double yPoint) {
this.xPoint = xPoint;
this.yPoint = yPoint;
}
public PointModel(double xPoint, double yPoint, String pointName) {
this.xPoint = xPoint;
this.yPoint = yPoint;
this.pointName = pointName;
}
public PointModel(Parcel in){
xPoint = in.readDouble();
yPoint = in.readDouble();
pointName = in.readString();
}
public static final Creator<PointModel> CREATOR = new Creator<PointModel>() {
@Override
public PointModel createFromParcel(Parcel in) {
return new PointModel(in);
}
@Override
public PointModel[] newArray(int size) {
return new PointModel[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeDouble(xPoint);
parcel.writeDouble(yPoint);
parcel.writeString(pointName);
}
public double getxPoint() {
return xPoint;
}
public void setxPoint(double xPoint) {
this.xPoint = xPoint;
}
public double getyPoint() {
return yPoint;
}
public void setyPoint(double yPoint) {
this.yPoint = yPoint;
}
public String getPointName() {
return pointName;
}
public void setPointName(String pointName) {
this.pointName = pointName;
}
}
package cn.com.founder.arcgislib.nonavi.model;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/13 17:05
* EMail:luo_shaopeng@founder.com.cn
* Description:搜索结果
*/
public class SearchModel implements Parcelable {
/**
* 名称
*/
private String poiname;
/**
* 地址
*/
private String poiaddress;
/**
* 经度 longitude
*/
private double x;
/**
* 纬度 latitude
*/
private double y;
/**
* 客户要求需区分数据源,目前在搜索时poi和二标四十
*/
private boolean isPoiData;
public SearchModel(){}
public String getPoiname() {
return poiname;
}
public void setPoiname(String poiname) {
this.poiname = poiname;
}
public String getPoiaddress() {
return poiaddress;
}
public void setPoiaddress(String poiaddress) {
this.poiaddress = poiaddress;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public boolean isPoiData() {
return isPoiData;
}
public void setPoiData(boolean poiData) {
isPoiData = poiData;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.poiname);
dest.writeString(this.poiaddress);
dest.writeDouble(this.x);
dest.writeDouble(this.y);
dest.writeByte(this.isPoiData ? (byte) 1 : (byte) 0);
}
protected SearchModel(Parcel in) {
this.poiname = in.readString();
this.poiaddress = in.readString();
this.x = in.readDouble();
this.y = in.readDouble();
this.isPoiData = in.readByte() != 0;
}
public static final Creator<SearchModel> CREATOR = new Creator<SearchModel>() {
@Override
public SearchModel createFromParcel(Parcel source) {
return new SearchModel(source);
}
@Override
public SearchModel[] newArray(int size) {
return new SearchModel[size];
}
};
}
package cn.com.founder.arcgislib.nonavi.option;
import cn.com.founder.arcgislib.nonavi.cluster.option.IArcGisClusterOption;
import cn.com.founder.arcgislib.nonavi.compass.option.IArcGisCompassOption;
import cn.com.founder.arcgislib.nonavi.draw.option.IArcGisDrawOption;
import cn.com.founder.arcgislib.nonavi.hotpots.option.IArcGisHotPotsOption;
import cn.com.founder.arcgislib.nonavi.location.option.IArcGisLocationOption;
import cn.com.founder.arcgislib.nonavi.search.option.IArcGisSearchOption;
import cn.com.founder.arcgislib.nonavi.zoom.option.IArcGisZoomOption;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:23
* EMail:luo_shaopeng@founder.com.cn
* Description:地图操作
*/
public interface IOption {
/**
* 位置操作
*/
IArcGisLocationOption arcGisLocationOption();
/**
* 缩放操作
*/
IArcGisZoomOption arcGisZoomOption();
/**
* 罗盘操作
*/
IArcGisCompassOption arcGisCompassOption();
/**
* 搜索操作
*/
IArcGisSearchOption arcGisSearchOption();
/**
* 热力图操作
*/
IArcGisHotPotsOption arcGisHotPotsOption();
/**
* 聚合操作
*/
IArcGisClusterOption arcGisClusterOption();
/**
* 绘制操作
*/
IArcGisDrawOption arcGisDrawOption();
}
package cn.com.founder.arcgislib.nonavi.search;
import cn.com.founder.arcgislib.nonavi.search.listener.ISearchSelectedListener;
import cn.com.founder.arcgislib.nonavi.search.option.IArcGisSearchOption;
import cn.com.founder.arcgislib.nonavi.view.ArcGisSearchView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/11 19:37
* EMail:luo_shaopeng@founder.com.cn
* Description:搜索
*/
public class ArcGisSearch implements IArcGisSearchOption {
/**
* {@link ArcGisSearchView}
*/
private ArcGisSearchView mArcGisSearchView;
public ArcGisSearch(ArcGisSearchView arcGisSearchView) {
this.mArcGisSearchView = arcGisSearchView;
}
/**
* @param type 搜索类型:0:poi,1:实有单位,2:实有房屋,3:标准地址
* @param keyWord 关键字
*/
@Override
public IArcGisSearchOption setSearchData(int type, String keyWord) {
mArcGisSearchView.setSearchData(type,keyWord);
return this;
}
@Override
public IArcGisSearchOption setSearchSelectedListener(ISearchSelectedListener listener) {
mArcGisSearchView.setSearchSelectedListener(listener);
return this;
}
}
package cn.com.founder.arcgislib.nonavi.search.listener;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.model.SearchModel;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/5/13 10:03
* EMail:luo_shaopeng@founder.com.cn
* Description:搜索接口回调
*/
public interface ISearchResultListener {
/**
* @param searchModelList 搜索回调
*/
void callBack(List<SearchModel> searchModelList);
}
package cn.com.founder.arcgislib.nonavi.search.listener;
import cn.com.founder.arcgislib.nonavi.model.SearchModel;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/14 19:00
* EMail:luo_shaopeng@founder.com.cn
* Description:搜索选择监听
*/
public interface ISearchSelectedListener {
/**
* @param searchModel 选择的结果
*/
void selectedResult(SearchModel searchModel);
}
package cn.com.founder.arcgislib.nonavi.search.option;
import cn.com.founder.arcgislib.nonavi.search.listener.ISearchSelectedListener;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/11 19:38
* EMail:luo_shaopeng@founder.com.cn
* Description:搜索
*/
public interface IArcGisSearchOption {
/**
* @param type 搜索类型:0:poi,1:实有单位,2:实有房屋,3:标准地址
* @param keyWord 关键字
*/
IArcGisSearchOption setSearchData(int type , String keyWord);
/**
* @param listener 设置列表点击事件监听
*/
IArcGisSearchOption setSearchSelectedListener(ISearchSelectedListener listener);
}
package cn.com.founder.arcgislib.nonavi.source;
import android.app.Activity;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:06
* EMail:luo_shaopeng@founder.com.cn
* Description:Activity Context
*/
public class ActivitySource extends Source implements LifecycleOwner {
private Activity activity;
public ActivitySource (Activity activity){
this.activity = activity;
}
@Override
public Context getContext() {
return activity;
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return null;
}
}
package cn.com.founder.arcgislib.nonavi.source;
import android.content.Context;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:07
* EMail:luo_shaopeng@founder.com.cn
* Description:Context
*/
public class ContextSource extends Source {
private Context context;
public ContextSource(Context context){
this.context = context;
}
@Override
public Context getContext() {
return context;
}
}
package cn.com.founder.arcgislib.nonavi.source;
import android.app.Fragment;
import android.content.Context;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:09
* EMail:luo_shaopeng@founder.com.cn
* Description:Fragment Context
*/
public class FragmentSource extends Source{
private Fragment fragment;
public FragmentSource (Fragment fragment){
this.fragment = fragment;
}
@Override
public Context getContext() {
return fragment.getActivity();
}
}
package cn.com.founder.arcgislib.nonavi.source;
import android.app.AppOpsManager;
import android.app.NotificationManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import androidx.annotation.RequiresApi;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:01
* EMail:luo_shaopeng@founder.com.cn
* Description:全局最基层类
*/
public abstract class Source {
/**
* @return Context
*/
public abstract Context getContext();
/**
* 版本
*/
private int mTargetSdkVersion;
/**
* 包名
*/
private String mPackageName;
/**
* 包名管理
*/
private PackageManager mPackageManager;
/**
* app管理
*/
private AppOpsManager mAppOpsManager;
/**
* 通知
*/
private NotificationManager mNotificationManager;
/**
* @return 获取版本
*/
public int getTargetSdkVersion() {
if (mTargetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
mTargetSdkVersion = getContext().getApplicationInfo().targetSdkVersion;
}
return mTargetSdkVersion;
}
/**
* @return 获取包名
*/
public String getPackageName() {
if (mPackageName == null) {
mPackageName = getContext().getApplicationContext().getPackageName();
}
return mPackageName;
}
private PackageManager getPackageManager() {
if (mPackageManager == null) {
mPackageManager = getContext().getPackageManager();
}
return mPackageManager;
}
/**
* @return app
*/
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private AppOpsManager getAppOpsManager() {
if (mAppOpsManager == null) {
mAppOpsManager = (AppOpsManager) getContext().getSystemService(Context.APP_OPS_SERVICE);
}
return mAppOpsManager;
}
/**
* @return 通知
*/
private NotificationManager getNotificationManager() {
if (mNotificationManager == null) {
mNotificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
}
return mNotificationManager;
}
}
package cn.com.founder.arcgislib.nonavi.source;
import android.content.Context;
import androidx.fragment.app.Fragment;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:13
* EMail:luo_shaopeng@founder.com.cn
* Description:androidx Fragment Context
*/
public class XFragmentSource extends Source{
private Fragment fragment;
public XFragmentSource (Fragment fragment){
this.fragment = fragment;
}
@Override
public Context getContext() {
return fragment.getContext();
}
}
package cn.com.founder.arcgislib.nonavi.utils;
import android.content.Context;
import android.util.DisplayMetrics;
/**
* 导航屏幕工具
*/
public class DensityUtil {
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 将sp值转换为px值,保证文字大小不变
*
* @param spValue
* (DisplayMetrics类中属性scaledDensity)
* @return
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
public static int getScreenWidth(Context context){
DisplayMetrics dm = context.getResources().getDisplayMetrics();
return dm.widthPixels;
}
public static int getScreenHeight(Context context){
DisplayMetrics dm = context.getResources().getDisplayMetrics();
return dm.heightPixels;
}
}
package cn.com.founder.arcgislib.nonavi.utils;
import android.text.TextUtils;
import java.math.BigDecimal;
/**
* Created by lijingru on 2017/4/18.
*/
public class FormatUtil {
/**
* 时间的统一表示方式
* @param mm 毫秒
* @return
*/
public static String FormatTime(long mm){
int hour,minute,second;
second = (int) (mm/1000);
hour = second/3600;
minute = (second - hour*3600)/60;
second = second-hour*300-minute*60;
// if (minute< 10){
// return hour+":0"+minute;
// }
// return hour+":"+minute;
if (hour == 0 ){
return minute+" 分钟";
}
return hour+" 小时 "+minute+" 分钟";
}
/**
* 时间的统一表示方式
* @param mm 毫秒
* @return
*/
public static String FormatTime2(long mm){
int hour,minute,second;
second = (int) (mm/1000);
hour = second/3600;
minute = (second - hour*3600)/60;
second = second-hour*300-minute*60;
// if (minute< 10){
// return hour+":0"+minute;
// }
// return hour+":"+minute;
if (hour == 0 ){
return minute+"分钟";
}
return hour+"小时 "+minute+"分钟";
}
/**
* 时间的统一表示方式
* @param mm 毫秒
* @return
*/
public static String FormatTime3(long mm){
int hour,minute,second;
second = (int) (mm/1000);
hour = second/3600;
minute = (second - hour*3600)/60;
second = second-hour*300-minute*60;
// if (minute< 10){
// return hour+":0"+minute;
// }
// return hour+":"+minute;
if (hour == 0 ){
return minute+"分钟";
}
return hour+"小时"+minute+"分钟";
}
/**
* 时间的统一表示方式
* @param mm 毫秒
* @return
*/
public static String FormatTime00(long mm){
int hour,minute,second;
second = (int) (mm/1000);
hour = second/3600;
minute = (second - hour*3600)/60;
second = second-hour*300-minute*60;
if (minute< 10){
return hour+":0"+minute;
}
return hour+":"+minute;
}
/**
* 时间的表示方式
* @param mm 毫秒
* @return XX分钟
*/
public static int FormatTimeToMinute(long mm){
int hour,minute,second;
second = (int) (mm/1000);
minute = second/60;
return minute;
}
/**
* 距离的KM表示方式
* @return
*/
public static String FormatDistByKM(long ulDist) {
String strdist = null;
int ulDistanceResult = 0;
/* 避免显示出1.0公里、2.0公里、9.0公里等 */
if (ulDist / 100 * 100 % 1000 == 0) {
strdist = ulDist / 1000 + "";
} else {
// ulDist = (ulDist ) /100 * 100;
/* sprintf函数会自动四舍五入*/
float fDistanceResult = (float) ulDist / (float) 1000;
BigDecimal org = new BigDecimal(fDistanceResult);
org = org.setScale(1, BigDecimal.ROUND_HALF_UP);
fDistanceResult = org.floatValue();
if (fDistanceResult * 10 % 10 == 0) {
strdist = (int) fDistanceResult + "";
} else {
strdist = fDistanceResult + "";
}
}
return strdist;
}
public static String FormatDistKm(long ulDist){
String strdist = FormatDist(ulDist);
strdist = strdist.replace("米","m");
strdist = strdist.replace("公里","Km");
return strdist;
}
/**
* 距离的公里表示方式
* @return
*/
public static String FormatDistOnKM(long ulDist) {
String strdist = null;
int ulDistanceResult = 0;
if (ulDist < 10) {
strdist = "0.1";
} else if (ulDist < 1000) {
ulDistanceResult = Math.round((float)ulDist / 10) * 10;
if (ulDistanceResult == 1000) {
strdist = "1";
}else {
strdist = "0." + ulDistanceResult/100;
}
} else if(ulDist < 100000) {
/* 避免显示出1.0公里、2.0公里、9.0公里等 */
if (ulDist / 100 * 100 % 1000 == 0) {
strdist = ulDist / 1000 + "";
} else {
// ulDist = (ulDist ) /100 * 100;
/* sprintf函数会自动四舍五入*/
float fDistanceResult = (float) ulDist / (float) 1000;
BigDecimal org = new BigDecimal(fDistanceResult);
org = org.setScale(1, BigDecimal.ROUND_HALF_UP);
fDistanceResult = org.floatValue();
if (fDistanceResult * 10 % 10 == 0) {
strdist = (int) fDistanceResult + "";
} else {
strdist = fDistanceResult + "";
}
}
} else {
ulDistanceResult = Math.round((float)ulDist / 1000);
if (ulDistanceResult > 9999) {
ulDistanceResult = 9999;
}
strdist = ulDistanceResult + "";
}
return strdist;
}
/**
* 距离的统一表示方式
* @return
*/
public static String FormatDist(long ulDist) {
String strdist = null;
int ulDistanceResult = 0;
if (ulDist == 0)
ulDist = 1;
if (ulDist < 10) {
strdist = ulDist + "米";
} else if (ulDist < 1000) {
ulDistanceResult = Math.round((float)ulDist / 10) * 10;
if (ulDistanceResult == 1000) {
strdist = "1公里";
}else {
strdist = ulDistanceResult + "米";
}
} else if (ulDist < 100000) {
strdist = inOneAndHundredKM(ulDist);
} else {
strdist = moreHundredKM(ulDist);
}
return strdist;
}
// /**
// * 距离的统一表示方式
// * @return
// */
// public static Tuple.TwoTuple FormatDistForT(long ulDist) {
// Tuple.TwoTuple tuple = null;
// String strdist = null;
// String danwei = null;
// int ulDistanceResult = 0;
// if (ulDist < 10) {
// strdist = ulDist+"";
// danwei = "米";
// } else if (ulDist < 1000) {
// ulDistanceResult = Math.round((float)ulDist / 10) * 10;
// if (ulDistanceResult == 1000) {
// strdist = "1";
// danwei = "公里";
// }else {
// strdist = ulDistanceResult + "";
// danwei = "米";
// }
// } else if (ulDist < 100000) {
// strdist = inOneAndHundredKM(ulDist);
// strdist = strdist.replace("公里","");
// danwei = "公里";
// } else {
// strdist = moreHundredKM(ulDist);
// strdist = strdist.replace("公里","");
// danwei = "公里";
// }
// tuple = new Tuple.TwoTuple(strdist,danwei);
// return tuple;
// }
/**
* 大于1公里小于100公里的距离格式化
* @return
*/
public static String inOneAndHundredKM(long ulDist){
String strdist;
/* 避免显示出1.0公里、2.0公里、9.0公里等 */
if (ulDist / 100 * 100 % 1000 == 0) {
strdist = ulDist / 1000 + "公里";
} else {
// ulDist = (ulDist ) /100 * 100;
/* sprintf函数会自动四舍五入*/
float fDistanceResult = (float) ulDist / (float) 1000;
BigDecimal org = new BigDecimal(fDistanceResult);
org = org.setScale(1, BigDecimal.ROUND_HALF_UP);
fDistanceResult = org.floatValue();
if (fDistanceResult * 10 % 10 == 0) {
strdist = (int) fDistanceResult + "公里";
} else {
strdist = fDistanceResult + "公里";
}
}
return strdist;
}
/**
* 大于100公里的距离格式化
* @return
*/
public static String moreHundredKM(long ulDist){
String strdist;
int ulDistanceResult = Math.round((float)ulDist / 1000);
if (ulDistanceResult > 9999) {
ulDistanceResult = 9999;
}
strdist = ulDistanceResult + "公里";
return strdist;
}
/**
* 格式化周期Str
*
* @param week
* @return
*/
public static String FormatWeek(String week) {
String pushDates = "";
if (!TextUtils.isEmpty(week)){
if (week.equals("1|2|3|4|5")) {
pushDates = "工作日";
} else if (week.equals("6|7")) {
pushDates = "周末";
} else if (week.equals("1|2|3|4|5|6|7")) {
pushDates = "每天";
} else {
String str = week;
str = str.replace("1", "一");
str = str.replace("2", "二");
str = str.replace("3", "三");
str = str.replace("4", "四");
str = str.replace("5", "五");
str = str.replace("6", "六");
str = str.replace("7", "日");
str = str.replace("|", ",");
pushDates = "周" + str;
}
}
return pushDates;
}
}
package cn.com.founder.arcgislib.nonavi.utils;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/18 11:27
* EMail:luo_shaopeng@founder.com.cn
* Description:转化工具类
*/
public class GpsUtil {
private final static double a = 6378245.0;
private final static double pi = 3.1415926535897932384626;
private final static double ee = 0.00669342162296594323;
/**
* 计算地球上任意两点(经纬度)距离
*
* @param lat1 第一点纬度
* @param lng1 第一点经度
* @param lat2 第二点纬度
* @param lng2 第二点经度
* @return 返回距离 单位:米
*/
public static double distance(double lat1, double lng1, double lat2, double lng2) {
double a, b, R;
R = 6378137; // 地球半径
lat1 = lat1 * Math.PI / 180.0;
lat2 = lat2 * Math.PI / 180.0;
a = lat1 - lat2;
b = (lng1 - lng2) * Math.PI / 180.0;
double d;
double sa2, sb2;
sa2 = Math.sin(a / 2.0);
sb2 = Math.sin(b / 2.0);
d = 2 * R * Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1) * Math.cos(lat2) * sb2 * sb2));
return d;
}
/**
* Description: WGS-84 to GCJ-02 <BR>
*
* @param latitude 纬度
* @param longitude 经度
* @return [纬度,经度]
*/
public static double[] toGCJ02Point(double latitude, double longitude) {
double[] dev = calDev(latitude, longitude);
double retLat = latitude + dev[0];
double retLon = longitude + dev[1];
return new double[]{retLat, retLon};
}
/**
* Description: WGS-84 to GCJ-02 <BR>
*
* @param latitude 纬度
* @param longitude 经度
* @param scale 经纬度保留小数位数
* @return [纬度,经度]
* @author dsn
* @date 2017年10月24日 下午2:09:27
* @version 1.0
*/
public static double[] toGCJ02Point(double latitude, double longitude, int scale) {
double[] dev = calDev(latitude, longitude);
double retLat = latitude + dev[0];
double retLon = longitude + dev[1];
return new double[]{new BigDecimal(retLat).setScale(scale, RoundingMode.DOWN).doubleValue(),
new BigDecimal(retLon).setScale(scale, RoundingMode.DOWN).doubleValue()};
}
/**
* Description:GCJ-02 to WGS-84 <BR>
*
* @param latitude 纬度
* @param longitude 经度
* @return [纬度,经度]
*/
public static double[] toWGS84Point(double latitude, double longitude) {
double[] dev = calDev(latitude, longitude);
double retLat = latitude - dev[0];
double retLon = longitude - dev[1];
dev = calDev(retLat, retLon);
retLat = latitude - dev[0];
retLon = longitude - dev[1];
return new double[]{retLat, retLon};
}
private static double[] calDev(double wgLat, double wgLon) {
if (isOutOfChina(wgLat, wgLon)) {
return new double[]{0, 0};
}
double dLat = calLat(wgLon - 105.0, wgLat - 35.0);
double dLon = calLon(wgLon - 105.0, wgLat - 35.0);
double radLat = wgLat / 180.0 * pi;
double magic = Math.sin(radLat);
magic = 1 - ee * magic * magic;
double sqrtMagic = Math.sqrt(magic);
dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
return new double[]{dLat, dLon};
}
private static boolean isOutOfChina(double lat, double lon) {
if (lon < 72.004 || lon > 137.8347)
return true;
if (lat < 0.8293 || lat > 55.8271)
return true;
return false;
}
private static double calLat(double x, double y) {
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
return ret;
}
private static double calLon(double x, double y) {
double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0;
return ret;
}
}
package cn.com.founder.arcgislib.nonavi.utils;
import android.text.TextUtils;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/13 17:16
* EMail:luo_shaopeng@founder.com.cn
* Description:gson
*/
public class GsonUtil {
private static Gson gson = null;
static {
if (gson == null) {
gson = new Gson();
}
}
private GsonUtil() {
}
/**
* 转成json
*
* @param object
* @return
*/
public static String gsonString(Object object) {
String gsonString = null;
if (gson != null) {
gsonString = gson.toJson(object);
}
return gsonString;
}
/**
* 转成bean
*
* @param gsonString
* @param cls
* @return
*/
public static <T> T gsonToBean(String gsonString, Class<T> cls) {
T t = null;
if (gson != null) {
t = gson.fromJson(gsonString, cls);
}
return t;
}
/**
* 转成list
* 泛型在编译期类型被擦除导致报错
* @param gsonString
* @param cls
* @return
*/
public static <T> List<T> gsonToList(String gsonString, Class<T> cls) {
List<T> list = null;
if (gson != null) {
list = gson.fromJson(gsonString, new TypeToken<List<T>>() {
}.getType());
}
return list;
}
/**
* 转成list
* 解决泛型问题
* @param json
* @param cls
* @param <T>
* @return
*/
public static <T> List<T> jsonToList(String json, Class<T> cls) {
Gson gson = new Gson();
List<T> list = new ArrayList<T>();
JsonArray array = new JsonParser().parse(json).getAsJsonArray();
for(final JsonElement elem : array){
list.add(gson.fromJson(elem, cls));
}
return list;
}
/**
* 转成list中有map的
*
* @param gsonString
* @return
*/
public static <T> List<Map<String, T>> gsonToListMaps(String gsonString) {
List<Map<String, T>> list = null;
if (gson != null) {
list = gson.fromJson(gsonString,
new TypeToken<List<Map<String, T>>>() {
}.getType());
}
return list;
}
/**
* 转成map的
*
* @param gsonString
* @return
*/
public static <T> Map<String, T> gsonToMaps(String gsonString) {
Map<String, T> map = null;
if (gson != null) {
map = gson.fromJson(gsonString, new TypeToken<Map<String, T>>() {
}.getType());
}
return map;
}
/**
* 按章节点得到相应的内容
* @param jsonString json字符串
* @param note 节点
* @return 节点对应的内容
*/
public static String getNoteJsonString(String jsonString,String note){
if(TextUtils.isEmpty(jsonString)){
throw new RuntimeException("json字符串");
}
if(TextUtils.isEmpty(note)){
throw new RuntimeException("note标签不能为空");
}
JsonElement element = new JsonParser().parse(jsonString);
if(element.isJsonNull()){
throw new RuntimeException("得到的jsonElement对象为空");
}
return element.getAsJsonObject().get(note).toString();
}
/**
* 按照节点得到节点内容,然后传化为相对应的bean数组
* @param jsonString 原json字符串
* @param note 节点标签
* @param beanClazz 要转化成的bean class
* @return 返回bean的数组
*/
public static <T> List<T> parserJsonToArrayBeans(String jsonString,String note,Class<T> beanClazz){
String noteJsonString = getNoteJsonString(jsonString,note);
return parserJsonToArrayBeans(noteJsonString,beanClazz);
}
/**
* 按照节点得到节点内容,转化为一个数组
* @param jsonString json字符串
* @param beanClazz 集合里存入的数据对象
* @return 含有目标对象的集合
*/
public static <T> List<T> parserJsonToArrayBeans(String jsonString,Class<T> beanClazz){
if(TextUtils.isEmpty(jsonString)){
throw new RuntimeException("json字符串为空");
}
JsonElement jsonElement = new JsonParser().parse(jsonString);
if(jsonElement.isJsonNull()){
throw new RuntimeException("得到的jsonElement对象为空");
}
if(!jsonElement.isJsonArray()){
throw new RuntimeException("json字符不是一个数组对象集合");
}
JsonArray jsonArray = jsonElement.getAsJsonArray();
List<T> beans = new ArrayList<T>();
for (JsonElement jsonElement2: jsonArray) {
T bean = new Gson().fromJson(jsonElement2, beanClazz);
beans.add(bean);
}
return beans;
}
/**
* 把相对应节点的内容封装为对象
* @param jsonString json字符串
* @param clazzBean 要封装成的目标对象
* @return 目标对象
*/
public static <T> T parserJsonToArrayBean(String jsonString,Class<T> clazzBean){
if(TextUtils.isEmpty(jsonString)){
throw new RuntimeException("json字符串为空");
}
JsonElement jsonElement = new JsonParser().parse(jsonString);
if(jsonElement.isJsonNull()){
throw new RuntimeException("json字符串为空");
}
if(!jsonElement.isJsonObject()){
throw new RuntimeException("json不是一个对象");
}
return new Gson().fromJson(jsonElement, clazzBean);
}
/**
* 按照节点得到节点内容,转化为一个数组
* @param jsonString json字符串
* @param note json标签
* @param clazzBean 集合里存入的数据对象
* @return 含有目标对象的集合
*/
public static <T> T parserJsonToArrayBean(String jsonString,String note,Class<T> clazzBean){
String noteJsonString = getNoteJsonString(jsonString, note);
return parserJsonToArrayBean(noteJsonString, clazzBean);
}
/**
* 把bean对象转化为json字符串
* @param obj bean对象
* @return 返回的是json字符串
*/
public static String toJsonString(Object obj){
if(obj!=null){
return new Gson().toJson(obj);
}else{
throw new RuntimeException("对象不能为空");
}
}
}
package cn.com.founder.arcgislib.nonavi.utils;
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/11 20:27
* EMail:luo_shaopeng@founder.com.cn
* Description:键盘
*/
public class KeyboardUtil {
/**
* 显示软键盘的延迟时间
*/
public static final int SHOW_KEYBOARD_DELAY_TIME = 200;
public final static int KEYBOARD_VISIBLE_THRESHOLD_DP = 100;
public static void showKeyboard(final EditText editText, boolean delay) {
showKeyboard(editText, delay ? SHOW_KEYBOARD_DELAY_TIME : 0);
}
/**
* 针对给定的editText显示软键盘(editText会先获得焦点). 可以和{@link #hideKeyboard(View)}
* 搭配使用,进行键盘的显示隐藏控制。
*/
public static void showKeyboard(final EditText editText, int delay) {
if (null == editText)
return;
if (!editText.requestFocus()) {
return;
}
if (delay > 0) {
editText.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) editText.getContext().getApplicationContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}, delay);
} else {
InputMethodManager imm = (InputMethodManager) editText.getContext().getApplicationContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}
/**
* 隐藏软键盘 可以和{@link #showKeyboard(EditText, boolean)}搭配使用,进行键盘的显示隐藏控制。
*
* @param view 当前页面上任意一个可用的view
*/
public static boolean hideKeyboard(final View view) {
if (null == view)
return false;
InputMethodManager inputManager = (InputMethodManager) view.getContext().getApplicationContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
// 即使当前焦点不在editText,也是可以隐藏的。
return inputManager.hideSoftInputFromWindow(view.getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
/**
* Set keyboard visibility change event listener.
*
* @param activity Activity
* @param listener KeyboardVisibilityEventListener
*/
@SuppressWarnings("deprecation")
public static void setVisibilityEventListener(final Activity activity,
final KeyboardVisibilityEventListener listener) {
if (activity == null) {
throw new NullPointerException("Parameter:activity must not be null");
}
if (listener == null) {
throw new NullPointerException("Parameter:listener must not be null");
}
final View activityRoot = ((ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT)).getChildAt(0);
final ViewTreeObserver.OnGlobalLayoutListener layoutListener =
new ViewTreeObserver.OnGlobalLayoutListener() {
private final Rect r = new Rect();
private final int visibleThreshold = Math.round(
DensityUtil.dip2px(activity, KEYBOARD_VISIBLE_THRESHOLD_DP));
private boolean wasOpened = false;
@Override
public void onGlobalLayout() {
activityRoot.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRoot.getRootView().getHeight() - r.height();
boolean isOpen = heightDiff > visibleThreshold;
if (isOpen == wasOpened) {
// keyboard state has not changed
return;
}
wasOpened = isOpen;
boolean removeListener = listener.onVisibilityChanged(isOpen, heightDiff);
if (removeListener) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
activityRoot.getViewTreeObserver()
.removeOnGlobalLayoutListener(this);
} else {
activityRoot.getViewTreeObserver()
.removeGlobalOnLayoutListener(this);
}
}
}
};
activityRoot.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
}
/**
* Determine if keyboard is visible
*
* @param activity Activity
* @return Whether keyboard is visible or not
*/
public static boolean isKeyboardVisible(Activity activity) {
Rect r = new Rect();
View activityRoot = ((ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT)).getChildAt(0);
int visibleThreshold =
Math.round(DensityUtil.dip2px(activity, KEYBOARD_VISIBLE_THRESHOLD_DP));
activityRoot.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRoot.getRootView().getHeight() - r.height();
return heightDiff > visibleThreshold;
}
public interface KeyboardVisibilityEventListener {
/**
* @return to remove global listener or not
*/
boolean onVisibilityChanged(boolean isOpen, int heightDiff);
}
}
package cn.com.founder.arcgislib.nonavi.utils;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.ConnectionPool;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2021/1/12 15:55
* EMail:luo_shaopeng@founder.com.cn
* Description:okhttp工具类
*/
public class OkHttpUtil {
private static OkHttpClient client;
public static OkHttpClient getInstance() {
if (client == null) {
synchronized (OkHttpUtil.class) {
if (client == null) {
client = (new OkHttpClient.Builder()).connectTimeout(10L, TimeUnit.SECONDS).
writeTimeout(10L, TimeUnit.SECONDS).readTimeout(10L, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(5, 1L, TimeUnit.SECONDS))
.sslSocketFactory(ToolUtil.getSSLSocketFactory())
.hostnameVerifier(ToolUtil.getHostnameVerifier()).build();
}
}
}
return client;
}
public static void doPost(String url, String jsonParams, Callback callback) {
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonParams);
Request request = (new okhttp3.Request.Builder()).url(url).post(body).build();
Call call = getInstance().newCall(request);
call.enqueue(callback);
}
public static void doGet(String url, Callback callback) {
Request request = (new okhttp3.Request.Builder()).url(url).build();
Call call = getInstance().newCall(request);
call.enqueue(callback);
}
}
\ No newline at end of file
package cn.com.founder.arcgislib.nonavi.utils;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
import android.widget.Toast;
import com.yanzhenjie.permission.AndPermission;
import java.util.List;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/3/22 0022 18:00
* EMail:luo_shaopeng@founder.com.cn
* Description:权限工具类
*/
public class PermissionUtil {
/**
* 请求权限
* @param requestPermissionCode 总是拒绝后提示用户去设置
* @param listener 权限申请监听
* @param permissionGroup 权限
*/
@SuppressLint("WrongConstant")
public static void requestPermission(Context context, int requestPermissionCode, final PermissionQuestListener listener, final String... permissionGroup) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (AndPermission.hasPermissions(context, permissionGroup)) {
listener.onGranted();
return;
}
// 没有权限,申请权限
AndPermission.with(context)
.runtime()
.permission(permissionGroup)
.onGranted(data -> {
if (listener != null){
listener.onGranted();
}
})
.onDenied(data -> {
if (AndPermission.hasAlwaysDeniedPermission(context, permissionGroup)) {
Toast.makeText(context,"定位权限获取失败",Toast.LENGTH_LONG).show();
} else {
//拒绝后重复请求
requestPermission(context,requestPermissionCode,listener, permissionGroup);
}
})
.start();
} else {
listener.onGranted();
}
}
/**
* 权限申请监听
*/
public interface PermissionQuestListener {
/**
* 允许获得权限后操作
*/
void onGranted();
/**
* 拒绝权限后操作
*
* @param data 权限列表
*/
void onDenied(List<String> data);
/**
* 总是拒绝后不再提示信息
*
* @return 权限
*/
String onAlwaysDenied();
}
}
package cn.com.founder.arcgislib.nonavi.utils;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Toast;
import com.esri.arcgisruntime.geometry.Point;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import cn.com.founder.arcgislib.nonavi.common.Variable;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 17:35
* EMail:luo_shaopeng@founder.com.cn
* Description:工具类
*/
public class ToolUtil {
/**
* 判断是否打开网络
* @param context
* @return
*/
public static boolean isNetWorkAvailable(Context context){
boolean isAvailable = false ;
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
if(networkInfo!=null && networkInfo.isAvailable()){
isAvailable = true;
}
return isAvailable;
}
/**
* @param context 上下文
* @param value
* @return
*/
public static int valueToSp(Context context, int value){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
}
/**
* @param num 数值
* @return 保留两位小数的String
*/
public static String forMatDouble(double num){
BigDecimal b = new BigDecimal(num);
double df = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
return df+"";
}
/**
* @param length 数值
* @param type {@link Variable.Measure}
* @return 距离长度转换
*/
public static double lengthChange(double length, Variable.Measure type){
if(type== Variable.Measure.M) return length;
if(type==Variable.Measure.KM || type==Variable.Measure.KIM)
return mToKm(length);
return 0;
}
public static double mToKm(double length){
return length/1000;
}
/**
* @param type {@link Variable.Measure}
* @return String
*/
public static String lengthEnameToCname(Variable.Measure type){
switch (type){
case M:
return "米";
case KM:
return "千米";
case KIM:
return "公里";
case M2:
return "平方米";
case KM2:
return "平方千米";
case HM2:
return "公顷";
case A2:
return "亩";
}
return null;
}
/**
* @param area 数值
* @param type {@link Variable.Measure}
* @return 区域计算
*/
public static double areaChange(double area, Variable.Measure type){
switch (type){
case M2:
return area;
case KM2:
return m2ToKm2(area);
case HM2:
return m2ToHm2(area);
case A2:
return m2ToA2(area);
}
return 0;
}
private static double m2ToKm2(double area){
return area/1000;
}
private static double m2ToHm2(double area){
return area/10000;
}
private static double m2ToA2(double area){
return area/666.67;
}
/**
* 获取 DisplayMetrics
*
* @return
*/
private static DisplayMetrics getDisplayMetrics(Context context) {
return context.getResources().getDisplayMetrics();
}
/**
* 把以 dp 为单位的值,转化为以 px 为单位的值
*
* @param dpValue 以 dp 为单位的值
* @return px value
*/
public static int dpToPx(Context context, int dpValue) {
return (int) (dpValue * getDisplayMetrics(context).density + 0.5f);
}
/**
* 获取屏幕宽度
*
* @return
*/
public static int getScreenWidth(Context context) {
return getDisplayMetrics(context).widthPixels;
}
/**
* 获取屏幕高度
*
* @return
*/
public static int getScreenHeight(Context context) {
int screenHeight = getDisplayMetrics(context).heightPixels;
return screenHeight;
}
/**
* 动态显示软键盘
*
*/
public static void showSoftInput(Context context, final View view) {
final InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
inputMethodManager.showSoftInput(view, 0);
}
}, 200);
}
/**
* 动态隐藏软键盘
*
*/
public static void hideSoftInput(Context context, final View view) {
try {
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
} catch (Exception e) {
}
}
/**
* 根据行读取内容
* @return List<String>
*/
public static List<String> getFileContent(Context context,String filePath) {
List<String> newList=new ArrayList<>();
try {
File file = new File(filePath);
int count = 0;//初始化 key值
if (file.isFile() && file.exists()) {//文件存在
InputStreamReader isr = new InputStreamReader(new FileInputStream(file));
BufferedReader br = new BufferedReader(isr);
String lineTxt = null;
while ((lineTxt = br.readLine()) != null) {
if (!"".equals(lineTxt)) {
String reds = lineTxt.split("\\+")[0]; //java 正则表达式
newList.add(count, reds);
count++;
}
}
isr.close();
br.close();
}else {
Toast.makeText(context,"找不到指定文件",Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
return newList;
}
/**
* 通过中心点获取指定范围内的最大最小经纬度
* @param point 中心点
* @param distance 距离 单位km
* @return 数组:最大经度,最小经度,最大纬度,最小纬度
*/
public static double[] calcMaxMinLng(Point point, double distance){
//范围
double range = 180 / Math.PI * distance / 6372.797;
//经度弧度
double lngRad = range / Math.cos(point.getY() * Math.PI / 180);
double[] resultPoint = new double[4];
//最大经度
resultPoint[0] = point.getX() + lngRad;
//最小经度
resultPoint[1] = point.getX() - lngRad;
//最大纬度
resultPoint[2] = point.getY() + range;
//最小纬度
resultPoint[3] = point.getY() - range;
return resultPoint;
}
/**
* @return 东莞最大最小经纬度
*/
public static String dongGuanSearchParams(String value){
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("jsjd", "114.26742553710938");
jsonObject.put("qsjd", "113.50799560546875");
jsonObject.put("jswd","23.152313232421875");
jsonObject.put("qswd", "22.646942138671875");
jsonObject.put("value", value);
jsonObject.put("isAll", "0");
return jsonObject.toString();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
//获取这个SSLSocketFactory
public static SSLSocketFactory getSSLSocketFactory() {
try {
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, getTrustManager(), new SecureRandom());
return sslContext.getSocketFactory();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//获取TrustManager
private static TrustManager[] getTrustManager() {
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
}
};
return trustAllCerts;
}
//获取HostnameVerifier
public static HostnameVerifier getHostnameVerifier() {
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
};
return hostnameVerifier;
}
}
package cn.com.founder.arcgislib.nonavi.view;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/8 15:47
* EMail:luo_shaopeng@founder.com.cn
* Description:BaseView
*/
public class ArcGisBaseView extends FrameLayout {
public ArcGisBaseView(@NonNull Context context) {
this(context, null, 0);
}
public ArcGisBaseView(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public ArcGisBaseView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
addView(new ArcGisMapView(context,attrs,defStyleAttr));
}
}
package cn.com.founder.arcgislib.nonavi.view;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Color;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import com.esri.arcgisruntime.concurrent.ListenableFuture;
import com.esri.arcgisruntime.data.ServiceFeatureTable;
import com.esri.arcgisruntime.geometry.GeometryEngine;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.geometry.PointCollection;
import com.esri.arcgisruntime.geometry.SpatialReference;
import com.esri.arcgisruntime.layers.FeatureLayer;
import com.esri.arcgisruntime.mapping.view.Callout;
import com.esri.arcgisruntime.mapping.view.DrawStatus;
import com.esri.arcgisruntime.mapping.view.Graphic;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import cn.com.founder.arcgislib.nonavi.R;
import cn.com.founder.arcgislib.nonavi.cluster.listener.IClusterPointInfoListener;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.constants.Constants;
import cn.com.founder.arcgislib.nonavi.model.LocationModel;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.utils.GsonUtil;
import cn.com.founder.arcgislib.nonavi.utils.OkHttpUtil;
import cn.com.founder.arcgislib.nonavi.utils.ToolUtil;
import cn.com.founder.arcgislib.nonavi.widget.cluster.ClusterLayer;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/16 15:48
* EMail:luo_shaopeng@founder.com.cn
* Description:点聚合
*/
public class ArcGisClusterView extends LinearLayout implements View.OnClickListener, ArcGisMapView.MyTouchClusterListener {
protected static ArcGisClusterView instance;
/**
* {@link Context}
*/
private Context mContext;
/**
* 聚合根布局
*/
private LinearLayout mClusterTotalLayout;
/**
* 聚合图片
*/
protected ImageView mClusterIv;
/**
* {@link ArcGisMapView}
*/
private ArcGisMapView mArcGisMapView;
private ArcGisLocationView mArcGisLocationView;
/**
* {@link MapView}
*/
private MapView mMapView;
/**
* {@link GraphicsOverlay}
*/
private GraphicsOverlay graphicsOverlay;
/**
* {@link FeatureLayer}
*/
private FeatureLayer featureLayer;
/**
* {@link ClusterLayer}
*/
private ClusterLayer clusterLayer;
/**
* 是否清楚图层
*/
private boolean isClean;
/**
* 模拟点集合
*/
private PointCollection mPointCollection;
/**
* 实际数据源
*/
private List<PointModel> pointList = new ArrayList<>();
private boolean isFirstCreate = true;
/**
* {@link ClusterStyleBuilder}
*/
private ClusterStyleBuilder mClusterStyleBuilder;
/**
* 当前中心点图标,数据的综合体
*/
private Graphic mCenteredGraphic = null;
/**
* 加载框
*/
protected ProgressDialog myDialog;
/**
* 默认逆地理编码距离是0.1,单位是km;
*/
private double distance = 0.1;
private IClusterPointInfoListener mIClusterPointInfoListener;
/**
* {@link CalloutStyleBuilder}
*/
private CalloutStyleBuilder mCalloutStyleBuilder;
/**
* {@link CalloutContentBuilder}
*/
private CalloutContentBuilder mCalloutContentBuilder;
public ArcGisClusterView(Context context, ArcGisMapView arcGisMapView, ArcGisLocationView arcGisLocationView) {
this(context);
this.mContext = context;
this.mArcGisMapView = arcGisMapView;
this.mMapView = mArcGisMapView.getMapView();
this.mArcGisLocationView = arcGisLocationView;
this.graphicsOverlay = arcGisMapView.getClusterGraphicsOverlay();
arcGisMapView.setMyTouchClusterListener(this);
mCalloutStyleBuilder = new CalloutStyleBuilder(context);
mCalloutContentBuilder = new CalloutContentBuilder();
mPointCollection = new PointCollection(SpatialReference.create(4326));
mClusterStyleBuilder = new ClusterStyleBuilder(mContext);
// addFeatureLayer();
}
private ArcGisClusterView(Context context) {
this(context, null, 0);
}
private ArcGisClusterView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
private ArcGisClusterView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inflate(context, R.layout.layout_cluster, this);
instance = this;
mClusterTotalLayout = findViewById(R.id.cluster_layout);
mClusterIv = findViewById(R.id.cluster_iv);
mClusterIv.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if(clusterLayer == null){
return;
}
if (isClean) {
graphicsOverlay.setVisible(false);
clusterLayer.setGraphicVisible(false);
} else {
graphicsOverlay.setVisible(true);
clusterLayer.setGraphicVisible(true);
}
isClean = !isClean;
// featureLayer.setVisible(false);
// ClusterFeatureLayer clusterFeatureLayer = new ClusterFeatureLayer(
// mMapView, featureLayer, mContext, 150
// );
// clusterFeatureLayer.setGraphicVisible(true);
}
private void addFeatureLayer() {
featureLayer = new FeatureLayer(new ServiceFeatureTable(
"https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer/0"));
mMapView.getMap().getOperationalLayers().add(featureLayer);
}
/**
* 设置数据源
*/
public void setClusterData(List<PointModel> pointModelList) {
boolean isEmpty = pointModelList == null || pointModelList.isEmpty();
if (isEmpty) {
Toast.makeText(mContext, "暂无数据源", Toast.LENGTH_LONG).show();
return;
}
pointList = pointModelList;
for (PointModel pointModel : pointModelList) {
double x = pointModel.getxPoint();
double y = pointModel.getyPoint();
if(x < 0 || y < 0){
break;
}
Point point = new Point(x, y, SpatialReference.create(4326));
graphicsOverlay.getGraphics().add(new Graphic(point, simpleMarkerSymbol));
}
mMapView.addDrawStatusChangedListener(drawStatusChangedEvent -> {
if (drawStatusChangedEvent.getDrawStatus() == DrawStatus.COMPLETED && isFirstCreate) {
graphicsOverlay.setVisible(true);
if (clusterLayer == null) {
clusterLayer = new ClusterLayer(mMapView, graphicsOverlay, mContext,mClusterStyleBuilder);
}
clusterLayer.setGraphicVisible(true);
isClean = true;
isFirstCreate = false;
if(mArcGisLocationView != null){
mArcGisLocationView.preventClick = true;
}
}
});
}
/**
* 模拟数据源
*/
private void initRamdData() {
graphicsOverlay.getGraphics().clear();
mPointCollection.clear();
mPointCollection.add(new Point(113.935576, 22.995918));
mPointCollection.add(new Point(113.959722, 23.000176));
mPointCollection.add(new Point(113.97582, 22.949069));
mPointCollection.add(new Point(113.952823, 22.916051));
mPointCollection.add(new Point(114.019513, 22.951198));
mPointCollection.add(new Point(113.876934, 22.998047));
mPointCollection.add(new Point(113.909129, 22.936289));
mPointCollection.add(new Point(113.847039, 22.998047));
mPointCollection.add(new Point(114.114949, 22.995918));
mPointCollection.add(new Point(114.047109, 22.97356));
mPointCollection.add(new Point(114.066656, 22.935224));
for (Point point : mPointCollection) {
Point graPoint = (Point) GeometryEngine.project(point, mMapView.getSpatialReference());
Graphic gra1 = new Graphic(graPoint, simpleMarkerSymbol);
graphicsOverlay.getGraphics().add(gra1);
}
//随机点
// for (int i = 0; i < 1000; i++) {
// double lat = Math.random() + 23.02067;
// double lon = Math.random() + 113.75179;
// Point point = new Point(lon, lat, SpatialReference.create(4326));
// Point graPoint= (Point) GeometryEngine.project(point,mMapView.getSpatialReference());
// Graphic gra1 = new Graphic(graPoint, simpleMarkerSymbol);
// graphicsOverlay.getGraphics().add(gra1);
// }
}
SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.BLACK, 0);
/**
* @param isShow boolean-是否显示聚合布局
* 默认显示
*/
public void setShowClusterLayout(boolean isShow) {
if (isShow) {
mClusterTotalLayout.setVisibility(VISIBLE);
} else {
mClusterTotalLayout.setVisibility(GONE);
}
}
/**
* @param location {@link Variable.ViewLocation } ClusterView显示位置
*/
public void setClusterViewLocation(Variable.ViewLocation location) {
switch (location) {
case LEFT_TOP:
mClusterTotalLayout.setGravity(Gravity.LEFT | Gravity.TOP);
break;
case RIGHT_TOP:
mClusterTotalLayout.setGravity(Gravity.RIGHT | Gravity.TOP);
break;
case CENTER:
mClusterTotalLayout.setGravity(Gravity.CENTER);
break;
case LEFT_BOTTOM:
mClusterTotalLayout.setGravity(Gravity.LEFT | Gravity.BOTTOM);
break;
case RIGHT_BOTTOM:
mClusterTotalLayout.setGravity(Gravity.RIGHT | Gravity.BOTTOM);
break;
}
}
@Override
public void onUp(Variable.TouchUp touchUp, MotionEvent motionEvent) {
}
@Override
public void onSingleTap(MotionEvent motionEvent) {
if(clusterLayer == null){
if(mArcGisLocationView != null){
mArcGisLocationView.preventClick = false;
}
return;
}
final android.graphics.Point screenPoint = new android.graphics.Point(
(int) motionEvent.getX(),
(int) motionEvent.getY());
//获取屏幕上的点,误差在10米以内
final ListenableFuture<IdentifyGraphicsOverlayResult> identifyGraphic = mMapView
.identifyGraphicsOverlayAsync(clusterLayer.getGraphicLayer(), screenPoint, 10, false);
identifyGraphic.addDoneListener(() -> {
try {
if (mCenteredGraphic != null) {
mCenteredGraphic.setZIndex(0);
mCenteredGraphic.setSelected(false);
}
// get the list of graphics returned by identify
final IdentifyGraphicsOverlayResult graphic = identifyGraphic.get();
// get size of list in results
final int identifyResultSize = graphic.getGraphics().size();
boolean isExist = false;
if (identifyResultSize > 0) {
final Graphic foundGraphic = graphic.getGraphics().get(0);
final List<Graphic> graphics = clusterLayer.getGraphicLayer().getGraphics();
for (final Graphic g : graphics) {
if (g.getGeometry().equals(foundGraphic.getGeometry())) {
mCenteredGraphic = g;
isExist = true;
break;
}
}
}
if (isExist) {
Point centerPoint = (Point) mCenteredGraphic.getGeometry();
mMapView.setViewpointCenterAsync(centerPoint);
Map<String, Object> attrResultMap = mCenteredGraphic.getAttributes();
int count = (Integer) attrResultMap.get("count");
if(count == 1){
mCenteredGraphic.setZIndex(3);
mCenteredGraphic.setSelected(true);
requestGeoCeoder(centerPoint,true,true);
}else{
double scale = mMapView.getMapScale();
double currScale = scale * (1.0 / 4);
mMapView.setViewpointScaleAsync(currScale);
}
}
} catch (InterruptedException | ExecutionException ie) {
ie.printStackTrace();
}
});
}
public static class ClusterStyleBuilder {
private Context mContext;
/**
* 默认展开得图标 单个点
*/
private int mDefaultExpandImage;
/**
* 聚合时圆的大小
*/
private int mClusterCircleSize;
/**
* 聚合时圆的背景
*/
private int mClusterCircleBg;
/**
* 圆中文字的大小
*/
private int mClusterTextSize;
/**
* 聚合时圆中文字得颜色
*/
private int mClusterTextColor;
public ClusterStyleBuilder(Context context){
this.mContext = context;
this.mDefaultExpandImage = R.drawable.icon_label_location_normal;
this.mClusterCircleSize = 28;
this.mClusterCircleBg = Color.BLACK;
this.mClusterTextColor = Color.WHITE;
this.mClusterTextSize = 18;
}
public int getmDefaultExpandImage() {
return mDefaultExpandImage;
}
/**
* @param expandImage int(资源ID)-最终展开后单点图片,R.drawable.xxx
*/
public void setmDefaultExpandImage(int expandImage) {
if(expandImage > 0){
return;
}
this.mDefaultExpandImage = expandImage;
}
public int getmClusterCircleSize() {
return mClusterCircleSize;
}
/**
* @param mClusterCircleSize 设置聚合时圆的大小
* 默认28
*/
public void setmClusterCircleSize(int mClusterCircleSize) {
if(mClusterCircleSize < 10){
return;
}
this.mClusterCircleSize = mClusterCircleSize;
}
public int getmClusterCircleBg() {
return mClusterCircleBg;
}
/**
* @param mClusterCircleBg 设置聚合时圆的背景色,R.color.xxxx
* 默认黑色
*/
public void setmClusterCircleBg(int mClusterCircleBg) {
if(mClusterCircleBg == -1){
return;
}
this.mClusterCircleBg = ContextCompat.getColor(mContext, mClusterCircleBg);
}
public int getmClusterTextSize() {
return mClusterTextSize;
}
/**
* @param mClusterTextSize 设置聚合时圆中文字的大小
* 默认18
*/
public void setmClusterTextSize(int mClusterTextSize) {
if(mClusterTextSize < 10){
return;
}
this.mClusterTextSize = mClusterTextSize;
}
public int getmClusterTextColor() {
return mClusterTextColor;
}
/**
* @param mClusterTextColor 设置聚合时圆中文字得颜色
* 默认白色
*/
public void setmClusterTextColor(int mClusterTextColor) {
if(mClusterTextColor < -1){
return;
}
this.mClusterTextColor = ContextCompat.getColor(mContext, mClusterTextColor);
}
}
/**
* @param clusterImage int(资源ID)-聚合图片
*/
public void setClusterImage(int clusterImage) {
mClusterIv.setImageDrawable(getResources().getDrawable(clusterImage));
}
/**
* @return 聚合样式
*/
public ClusterStyleBuilder getClusterStyleBuilder() {
return mClusterStyleBuilder;
}
/**
* @param distance 默认逆地理编码距离是0.1,单位是km;
* 需要在最上层调用
*/
public void setGeoDistance(double distance){
this.distance = distance;
}
protected void showDialog() {
try {
if (myDialog != null && myDialog.isShowing()) {
myDialog.dismiss();
}
myDialog = new ProgressDialog(mContext);
myDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
myDialog.setMessage("正在加载...");
myDialog.setIndeterminate(false);
myDialog.setCancelable(false);
myDialog.show();
} catch (Exception e) {
}
}
/**
* 关闭
*/
protected void disDialog() {
try {
if (myDialog != null && myDialog.isShowing()) {
myDialog.dismiss();
}
myDialog = null;
} catch (Exception e) {
}
}
/**
* 天地图逆地址编码
* 当导入数据得时候,不显示加载框,不显示气泡组件
*
* @param point 当前点位
* @param isLoading 加载框
* @param showCallout 气泡
*/
private void requestGeoCeoder(Point point, boolean isLoading, boolean showCallout) {
if (isLoading) {
showDialog();
}
JSONObject jsonObject = new JSONObject();
try {
// jsonObject.put("index", "bzdz");
//
// JSONObject infoObject = new JSONObject();
// infoObject.put("field", "xy");
// infoObject.put("distance", String.valueOf(distance));
//
// JSONObject xyObject = new JSONObject();
// xyObject.put("lat", String.valueOf(point.getY()));
// xyObject.put("lon", String.valueOf(point.getX()));
// infoObject.put("point", xyObject);
//
// jsonObject.put("geographicInfo", infoObject);
jsonObject.put("lnglat",point.getX()+","+point.getY());
jsonObject.put("ak","93e478f664404c448b2bbe37ba35161c9");
} catch (JSONException e) {
e.printStackTrace();
}
// Log.e("GEOCeoder========",jsonObject.toString());
OkHttpUtil.doPost(Constants.BASE_GEO_URL, jsonObject.toString(), new Callback() {
@Override
public void onFailure(Call call, IOException e) {
disDialog();
// Toast.makeText(mContext, "请求失败,请重试", Toast.LENGTH_LONG).show();
Log.e("Fail", "e=" + e.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
disDialog();
String address = null;
String poi = null;
if (response.isSuccessful()) {
if (response.body() != null) {
String responseStr = response.body().string();
// Log.e("responseStr", responseStr);
JsonObject jsonObject = GsonUtil.gsonToBean(responseStr, JsonObject.class);
int status = jsonObject.get("status").getAsInt();
if (status == 200) {
JsonArray dataArray = jsonObject.get("data").getAsJsonArray();
if (dataArray != null && dataArray.size() > 0) {
JsonObject jsonObject1 = (JsonObject) dataArray.get(0);
// //地址全称
// address = jsonObject1.get("dzqc").getAsString();
// ///地址详址
// poi = jsonObject1.get("dzxz").getAsString();
address = jsonObject1.get("name").getAsString();
if(jsonObject1.get("pois").isJsonObject()){
poi = jsonObject1.get("pois").getAsJsonObject().get("name").getAsString();
}else{
poi = jsonObject1.get("name").getAsString();
}
}
}
}
}
Message message = Message.obtain();
message.obj = new LocationModel(point.getX(), point.getY(), address, poi, null);
message.what = 0;
message.arg1 = showCallout ? 0 : 1;
mHandler.sendMessage(message);
}
});
}
@SuppressLint("HandlerLeak")
Handler mHandler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
LocationModel locationModel = (LocationModel) msg.obj;
if(msg.what == 0){
setCallout(mCenteredGraphic, locationModel.getAddress(), locationModel.getPoi(), msg.arg1 == 0);
if (mIClusterPointInfoListener != null) {
mIClusterPointInfoListener.pointInfoCallBack(locationModel);
}
}
}
};
/**
* @param listener 点信息监听
*/
public void setIClusterPointInfoListener(IClusterPointInfoListener listener) {
this.mIClusterPointInfoListener = listener;
}
/**
* 设置气泡组件
*/
protected void setCallout(Graphic graphic, String address, String poi, boolean isShowCallout) {
Point point = (Point) graphic.getGeometry();
Callout mCallout = mMapView.getCallout();
if (mCallout.isShowing()) {
mCallout.dismiss();
}
View view = LayoutInflater.from(mContext).inflate(R.layout.layout_callout, null, false);
TextView mXPointTv = view.findViewById(R.id.callout_x_tv);
TextView mYPointTv = view.findViewById(R.id.callout_y_tv);
TextView mAddressTv = view.findViewById(R.id.callout_address_tv);
TextView mPoiTv = view.findViewById(R.id.callout_poi_tv);
ImageView mInfoIv = view.findViewById(R.id.callout_info_iv);
LinearLayout mDelLayout = view.findViewById(R.id.callout_del_ll);
TextView mDelTv = view.findViewById(R.id.callout_del_tv);
TextView mDescLabelTv = view.findViewById(R.id.callout_label_tv);
EditText mDescEt = view.findViewById(R.id.callout_desc_et);
TextView mCancelTv = view.findViewById(R.id.callout_cancel_tv);
TextView mOkTv = view.findViewById(R.id.callout_ok_tv);
if (mCalloutContentBuilder.mXPointFontColor != -1) {
mXPointTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mXPointFontColor));
}
if (mCalloutContentBuilder.mXPointFontSize != -1) {
mXPointTv.setTextSize(mCalloutContentBuilder.mXPointFontSize);
}
if (mCalloutContentBuilder.mXPointHide) {
mXPointTv.setVisibility(View.GONE);
} else {
mXPointTv.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mYPointFontColor != -1) {
mYPointTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mYPointFontColor));
}
if (mCalloutContentBuilder.mYPointFontSize != -1) {
mYPointTv.setTextSize(mCalloutContentBuilder.mYPointFontSize);
}
if (mCalloutContentBuilder.mYPointHide) {
mYPointTv.setVisibility(View.GONE);
} else {
mYPointTv.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mAddressFontColor != -1) {
mAddressTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mAddressFontColor));
}
if (mCalloutContentBuilder.mAddressFontSize != -1) {
mAddressTv.setTextSize(mCalloutContentBuilder.mAddressFontSize);
}
if (mCalloutContentBuilder.mAddressHide) {
mAddressTv.setVisibility(View.GONE);
} else {
mAddressTv.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mPoiFontColor != -1) {
mPoiTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mPoiFontColor));
}
if (mCalloutContentBuilder.mPoiFontSize != -1) {
mPoiTv.setTextSize(mCalloutContentBuilder.mPoiFontSize);
}
if (mCalloutContentBuilder.mPoiHide) {
mPoiTv.setVisibility(View.GONE);
} else {
mPoiTv.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mInfoImage != -1) {
mInfoIv.setImageDrawable(getResources().getDrawable(mCalloutContentBuilder.mInfoImage));
}
if (mCalloutContentBuilder.mInfoImageHide) {
mInfoIv.setVisibility(View.GONE);
} else {
mInfoIv.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mDelBackground != -1) {
mDelLayout.setBackground(getResources().getDrawable(mCalloutContentBuilder.mDelBackground));
}
if (mCalloutContentBuilder.mDelFontColor != -1) {
mDelTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mDelFontColor));
}
if (mCalloutContentBuilder.mDelFontSize != -1) {
mDelTv.setTextSize(mCalloutContentBuilder.mDelFontSize);
}
if (mCalloutContentBuilder.mDelHide) {
mDelLayout.setVisibility(View.GONE);
} else {
mDelLayout.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mDescLabelFontColor != -1) {
mDescLabelTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mDescLabelFontColor));
}
if (mCalloutContentBuilder.mDescLabelFontSize != -1) {
mDescLabelTv.setTextSize(mCalloutContentBuilder.mDescLabelFontSize);
}
if (mCalloutContentBuilder.mDescBackground != -1) {
mDescEt.setBackground(getResources().getDrawable(mCalloutContentBuilder.mDescBackground));
}
if (mCalloutContentBuilder.mDescFontColor != -1) {
mDescEt.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mDescFontColor));
}
if (mCalloutContentBuilder.mDescFontSize != -1) {
mDescEt.setTextSize(mCalloutContentBuilder.mDescFontSize);
}
if (mCalloutContentBuilder.mDescHide) {
mDescLabelTv.setVisibility(View.GONE);
mDescEt.setVisibility(View.GONE);
} else {
mDescLabelTv.setVisibility(View.VISIBLE);
mDescEt.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mCancelBackground != -1) {
mCancelTv.setBackground(getResources().getDrawable(mCalloutContentBuilder.mCancelBackground));
}
if (mCalloutContentBuilder.mCancelFontColor != -1) {
mCancelTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mCancelFontColor));
}
if (mCalloutContentBuilder.mCancelFontSize != -1) {
mCancelTv.setTextSize(mCalloutContentBuilder.mCancelFontSize);
}
if (mCalloutContentBuilder.mCancelHide) {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(0, 0, 0, 0);
mOkTv.setLayoutParams(layoutParams);//因为在xml布局中有40dip的Margin
mCancelTv.setVisibility(View.GONE);
} else {
mCancelTv.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mOkBackground != -1) {
mOkTv.setBackground(getResources().getDrawable(mCalloutContentBuilder.mOkBackground));
}
if (mCalloutContentBuilder.mOkFontColor != -1) {
mOkTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mOkFontColor));
}
if (mCalloutContentBuilder.mOkFontSize != -1) {
mOkTv.setTextSize(mCalloutContentBuilder.mOkFontSize);
}
if (mCalloutContentBuilder.mOkHide) {
mOkTv.setVisibility(View.GONE);
} else {
mOkTv.setVisibility(View.VISIBLE);
}
mDescEt.setOnFocusChangeListener((view15, b) -> {
if (b) {
ToolUtil.showSoftInput(mContext, mDescEt);
} else {
ToolUtil.hideSoftInput(mContext, mDescEt);
}
});
mXPointTv.setText(mContext.getString(R.string.string_callout_point_x, String.valueOf(point.getX())));
mYPointTv.setText(mContext.getString(R.string.string_callout_point_y, String.valueOf(point.getY())));
mAddressTv.setText(mContext.getString(R.string.string_callout_point_address, TextUtils.isEmpty(address) ? "暂无" : address));
mPoiTv.setText(mContext.getString(R.string.string_callout_point_POI, TextUtils.isEmpty(poi) ? "暂无" : poi));
Map<String, Object> attrResultMap = graphic.getAttributes();
if (attrResultMap != null && attrResultMap.size() > 0 && attrResultMap.containsKey("DESCRIPTION")) {
mDescEt.setText(attrResultMap.get("DESCRIPTION").toString());
}
mInfoIv.setOnClickListener(view1 -> {
if (mDelLayout.getVisibility() == View.GONE) {
mDelLayout.setVisibility(View.VISIBLE);
} else {
mDelLayout.setVisibility(View.GONE);
}
});
mCancelTv.setOnClickListener(view13 -> mCallout.dismiss());
mOkTv.setOnClickListener(view12 -> {
Map<String, Object> attrMap = graphic.getAttributes();
attrMap.put("DESCRIPTION", mDescEt.getText().toString());
if (mIClusterPointInfoListener != null) {
mIClusterPointInfoListener.pointInfoCallBack(new LocationModel(point.getX(), point.getY(), address, poi, mDescEt.getText().toString()));
}
mCallout.dismiss();
});
Callout.Style mCalloutStyle = new Callout.Style(mContext);
mCalloutStyle.setMaxWidth(mCalloutStyleBuilder.mCalloutMaxWidth); //设置最大宽度
if (mCalloutStyleBuilder.mCalloutMaxHeight != -1) {
mCalloutStyle.setMaxHeight(mCalloutStyleBuilder.mCalloutMaxHeight); //设置最大高度
}
mCalloutStyle.setMinWidth(mCalloutStyleBuilder.mCalloutMinWidth); //设置最小宽度
if (mCalloutStyleBuilder.mCalloutMinHeight != -1) {
mCalloutStyle.setMinHeight(mCalloutStyleBuilder.mCalloutMinHeight); //设置最小高度
}
mCalloutStyle.setBackgroundColor(ContextCompat.getColor(mContext, mCalloutStyleBuilder.mCalloutBackgroundColor)); //设置背景颜色
mCalloutStyle.setBorderWidth(mCalloutStyleBuilder.mCalloutBorderWidth); //设置边框宽度
mCalloutStyle.setBorderColor(ContextCompat.getColor(mContext, mCalloutStyleBuilder.mCalloutBorderColor)); //设置边框颜色
mCalloutStyle.setCornerRadius(mCalloutStyleBuilder.mCalloutCornerRadius); //设置圆角半径
if (mCalloutStyleBuilder.mCalloutLeaderLength != -1) {
mCalloutStyle.setLeaderLength(mCalloutStyleBuilder.mCalloutLeaderLength); //设置指示性长度
}
if (mCalloutStyleBuilder.mCalloutLeaderWidth != -1) {
mCalloutStyle.setLeaderWidth(mCalloutStyleBuilder.mCalloutLeaderWidth); //设置指示性宽度
}
mCalloutStyle.setLeaderPosition(mCalloutStyleBuilder.mLeaderPosition); //设置指示性位置
mCallout.setStyle(mCalloutStyle);
mCallout.setLocation(point);
mCallout.setContent(view);
if (isShowCallout) {
mCallout.show();
}
mMapView.setViewpointCenterAsync(point);
mInfoIv.setVisibility(View.GONE);
}
public CalloutStyleBuilder getCalloutStyleBuilder() {
return mCalloutStyleBuilder;
}
public static class CalloutStyleBuilder {
/**
* {@link Context}
*/
private Context mContext;
/**
* callout最大宽度
*/
private int mCalloutMaxWidth;
/**
* callout最大高度
*/
private int mCalloutMaxHeight = -1;
/**
* callout最小宽度
*/
private int mCalloutMinWidth;
/**
* callout最小高度
*/
private int mCalloutMinHeight = -1;
/**
* callout背景色
*/
private int mCalloutBackgroundColor;
/**
* callout圆角半径
*/
private int mCalloutCornerRadius;
/**
* callout边框宽度
*/
private int mCalloutBorderWidth;
/**
* callout边框颜色
*/
private int mCalloutBorderColor;
/**
* callout指示器长度
*/
private int mCalloutLeaderLength = -1;
/**
* callout指示器宽度
*/
private int mCalloutLeaderWidth = -1;
/**
* callout指示器位置
*/
private Callout.Style.LeaderPosition mLeaderPosition;
CalloutStyleBuilder(Context context) {
this.mContext = context;
this.mCalloutMaxWidth = (int) (ToolUtil.getScreenWidth(mContext) * 0.9);
this.mCalloutMinWidth = (int) (ToolUtil.getScreenWidth(mContext) * 0.9);
this.mCalloutBackgroundColor = R.color.colorWhiteTras;
this.mCalloutCornerRadius = 5;
this.mCalloutBorderWidth = 1;
this.mCalloutBorderColor = R.color.color_13227A;
this.mLeaderPosition = Callout.Style.LeaderPosition.LOWER_MIDDLE;
}
/**
* @param width callout最大宽度
*/
public void setCalloutMaxWidth(int width) {
this.mCalloutMaxWidth = width;
}
/**
* @param height callout最大高度
*/
public void setCalloutMaxHeight(int height) {
this.mCalloutMaxHeight = height;
}
/**
* @param width callout最小宽度
*/
public void setCalloutMinWidth(int width) {
this.mCalloutMinWidth = width;
}
/**
* @param height callout最小高度
*/
public void setCalloutMinHeight(int height) {
this.mCalloutMinHeight = height;
}
/**
* @param colorResId callout背景色,资源ID
*/
public void setCalloutBackgroundColor(int colorResId) {
this.mCalloutBackgroundColor = colorResId;
}
/**
* @param cornerRadius callout圆角半径
*/
public void setCalloutCornerRadius(int cornerRadius) {
this.mCalloutCornerRadius = cornerRadius;
}
/**
* @param borderWidth callout边框宽度
*/
public void setCalloutBorderWidth(int borderWidth) {
this.mCalloutBorderWidth = borderWidth;
}
/**
* @param colorResId callout边框颜色,资源ID
*/
public void setCalloutBorderColor(int colorResId) {
this.mCalloutBorderColor = colorResId;
}
/**
* @param leaderLength callout指示器长度
*/
public void setCalloutLeaderLength(int leaderLength) {
this.mCalloutLeaderLength = leaderLength;
}
/**
* @param leaderWidth callout指示器宽度
*/
public void setCalloutLeaderWidth(int leaderWidth) {
this.mCalloutLeaderWidth = leaderWidth;
}
/**
* @param position callout指示器位置
*/
public void setCalloutLeaderPosition(Variable.CalloutLeaderPosition position) {
if (position == Variable.CalloutLeaderPosition.DEFAULT) {
this.mLeaderPosition = Callout.Style.LeaderPosition.LOWER_MIDDLE;
} else if (position == Variable.CalloutLeaderPosition.AUTO) {
this.mLeaderPosition = Callout.Style.LeaderPosition.AUTOMATIC;
}
}
}
public CalloutContentBuilder getCalloutContentBuilder() {
return mCalloutContentBuilder;
}
public static class CalloutContentBuilder {
/**
* x点字体颜色
*/
private int mXPointFontColor = -1;
/**
* x点字体大小
*/
private int mXPointFontSize = -1;
/**
* x点隐藏
*/
private boolean mXPointHide = false;
/**
* y点字体颜色
*/
private int mYPointFontColor = -1;
/**
* y点字体大小
*/
private int mYPointFontSize = -1;
/**
* y点隐藏
*/
private boolean mYPointHide = false;
/**
* 地址字体颜色
*/
private int mAddressFontColor = -1;
/**
* 地址字体大小
*/
private int mAddressFontSize = -1;
/**
* 地址隐藏
*/
private boolean mAddressHide = false;
/**
* poi字体颜色
*/
private int mPoiFontColor = -1;
/**
* poi字体大小
*/
private int mPoiFontSize = -1;
/**
* poi隐藏
*/
private boolean mPoiHide = false;
/**
* 右边信息图标
*/
private int mInfoImage = -1;
/**
* 右边信息图标隐藏
*/
private boolean mInfoImageHide = false;
/**
* 右边删除背景
*/
private int mDelBackground = -1;
/**
* 右边删除字体颜色
*/
private int mDelFontColor = -1;
/**
* 右边删除字体大小
*/
private int mDelFontSize = -1;
/**
* 右边删除隐藏
*/
private boolean mDelHide = true;
/**
* 补充信息label字体颜色
*/
private int mDescLabelFontColor = -1;
/**
* 补充信息label字体大小
*/
private int mDescLabelFontSize = -1;
/**
* 补充信息字体颜色
*/
private int mDescFontColor = -1;
/**
* 补充信息字体大小
*/
private int mDescFontSize = -1;
/**
* 补充信息背景
*/
private int mDescBackground = -1;
/**
* 补充信息隐藏
*/
private boolean mDescHide = false;
/**
* 取消字体颜色
*/
private int mCancelFontColor = -1;
/**
* 取消字体大小
*/
private int mCancelFontSize = -1;
/**
* 取消背景
*/
private int mCancelBackground = -1;
/**
* 取消隐藏
*/
private boolean mCancelHide = false;
/**
* 确定字体颜色
*/
private int mOkFontColor = -1;
/**
* 确定字体大小
*/
private int mOkFontSize = -1;
/**
* 确定背景
*/
private int mOkBackground = -1;
/**
* 确定隐藏
*/
private boolean mOkHide = false;
/**
* @param mXPointFontColor x点字体颜色
*/
public void setmXPointFontColor(int mXPointFontColor) {
this.mXPointFontColor = mXPointFontColor;
}
/**
* @param mXPointFontSize x点字体大小
*/
public void setmXPointFontSize(int mXPointFontSize) {
this.mXPointFontSize = mXPointFontSize;
}
/**
* @param mXPointHide x点隐藏
*/
public void setmXPointHide(boolean mXPointHide) {
this.mXPointHide = mXPointHide;
}
/**
* @param mYPointFontColor y点字体颜色
*/
public void setmYPointFontColor(int mYPointFontColor) {
this.mYPointFontColor = mYPointFontColor;
}
/**
* @param mYPointFontSize y点字体大小
*/
public void setmYPointFontSize(int mYPointFontSize) {
this.mYPointFontSize = mYPointFontSize;
}
/**
* @param mYPointHide y点隐藏
*/
public void setmYPointHide(boolean mYPointHide) {
this.mYPointHide = mYPointHide;
}
/**
* @param mAddressFontColor 地址字体颜色
*/
public void setmAddressFontColor(int mAddressFontColor) {
this.mAddressFontColor = mAddressFontColor;
}
/**
* @param mAddressFontSize 地址字体大小
*/
public void setmAddressFontSize(int mAddressFontSize) {
this.mAddressFontSize = mAddressFontSize;
}
/**
* @param mAddressHide 地址隐藏
*/
public void setmAddresstHide(boolean mAddressHide) {
this.mAddressHide = mAddressHide;
}
/**
* @param mPoiFontColor Poi字体颜色
*/
public void setmPoiFontColor(int mPoiFontColor) {
this.mPoiFontColor = mPoiFontColor;
}
/**
* @param mPoiFontSize Poi字体大小
*/
public void setmPoiFontSize(int mPoiFontSize) {
this.mPoiFontSize = mPoiFontSize;
}
/**
* @param mPoiHide Poi隐藏
*/
public void setmPoiHide(boolean mPoiHide) {
this.mPoiHide = mPoiHide;
}
/**
* @param mInfoImage 右边信息图标
*/
public void setmInfoImage(int mInfoImage) {
this.mInfoImage = mInfoImage;
}
/**
* @param mInfoImageHide 右边信息图标隐藏
*/
public void setmInfoImageHide(boolean mInfoImageHide) {
this.mInfoImageHide = mInfoImageHide;
}
/**
* @param mDelBackground 右边删除背景
*/
public void setmDelBackground(int mDelBackground) {
this.mDelBackground = mDelBackground;
}
/**
* @param mDelFontColor 右边删除字体颜色
*/
public void setmDelFontColor(int mDelFontColor) {
this.mDelFontColor = mDelFontColor;
}
/**
* @param mDelFontSize 右边删除字体大小
*/
public void setmDelFontSize(int mDelFontSize) {
this.mDelFontSize = mDelFontSize;
}
/**
* @param mDelHide 右边删除隐藏
*/
public void setmDelHide(boolean mDelHide) {
this.mDelHide = mDelHide;
}
/**
* @param mDescLabelFontColor 补充信息label字体颜色
*/
public void setmDescLabelFontColor(int mDescLabelFontColor) {
this.mDescLabelFontColor = mDescLabelFontColor;
}
/**
* @param mDescLabelFontSize 补充信息label字体大小
*/
public void setmDescLabelFontSize(int mDescLabelFontSize) {
this.mDescLabelFontSize = mDescLabelFontSize;
}
/**
* @param mDescFontColor 补充信息字体颜色
*/
public void setmDescFontColor(int mDescFontColor) {
this.mDescFontColor = mDescFontColor;
}
/**
* @param mDescFontSize 补充信息字体大小
*/
public void setmDescFontSize(int mDescFontSize) {
this.mDescFontSize = mDescFontSize;
}
/**
* @param mDescBackground 补充信息背景
*/
public void setmDescBackground(int mDescBackground) {
this.mDescBackground = mDescBackground;
}
/**
* @param mDescHide 补充信息隐藏
*/
public void setmDescHide(boolean mDescHide) {
this.mDescHide = mDescHide;
}
/**
* @param mCancelFontColor 取消按钮字体颜色
*/
public void setmCancelFontColor(int mCancelFontColor) {
this.mCancelFontColor = mCancelFontColor;
}
/**
* @param mCancelFontSize 取消按钮字体大小
*/
public void setmCancelFontSize(int mCancelFontSize) {
this.mCancelFontSize = mCancelFontSize;
}
/**
* @param mCancelBackground 取消按钮背景
*/
public void setmCancelBackground(int mCancelBackground) {
this.mCancelBackground = mCancelBackground;
}
/**
* @param mCancelHide 取消按钮隐藏
*/
public void setmCancelHide(boolean mCancelHide) {
this.mCancelHide = mCancelHide;
}
/**
* @param mOkFontColor 确定按钮字体颜色
*/
public void setmOkFontColor(int mOkFontColor) {
this.mOkFontColor = mOkFontColor;
}
/**
* @param mOkFontSize 确定按钮字体大小
*/
public void setmOkFontSize(int mOkFontSize) {
this.mOkFontSize = mOkFontSize;
}
/**
* @param mOkBackground 确定按钮背景
*/
public void setmOkBackground(int mOkBackground) {
this.mOkBackground = mOkBackground;
}
/**
* @param mOkHide 确定按钮隐藏
*/
public void setmOkHide(boolean mOkHide) {
this.mOkHide = mOkHide;
}
}
}
package cn.com.founder.arcgislib.nonavi.view;
import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.geometry.SpatialReference;
import com.esri.arcgisruntime.mapping.view.MapView;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.R;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.widget.draw.DrawEntity;
import cn.com.founder.arcgislib.nonavi.widget.draw.DrawLayer;
import cn.com.founder.arcgislib.nonavi.widget.draw.DrawView;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/7/3 10:42
* EMail:luo_shaopeng@founder.com.cn
* Description:绘制
*/
public class ArcGisDrawView extends LinearLayout implements View.OnClickListener, ArcGisMapView.MyTouchDrawListener {
protected static ArcGisDrawView instance;
/**
* {@link Context}
*/
private Context mContext;
/**
* 绘制根布局
*/
private RelativeLayout mDrawTotalLayout;
/**
* 绘制图片布局
*/
protected RelativeLayout mDrawIvLayout;
/**
* 绘制图片
*/
protected ImageView mDrawIv;
/**
* 绘制操作内容
*/
private LinearLayout mDrawContentLayout;
/**
* 绘制线
*/
private LinearLayout mDrawLineLayout;
/**
* 绘制圆
*/
private LinearLayout mDrawCircleLayout;
/**
* 绘制矩形
*/
private LinearLayout mDrawOrthogonLayout;
/**
* 绘制多边形
*/
private LinearLayout mDrawPolygonLayout;
/**
* 撤销
*/
private LinearLayout mDrawPrevLayout;
/**
* 恢复
*/
private LinearLayout mDrawNextLayout;
/**
* 清除
*/
private LinearLayout mDrawClearLayout;
/**
* 完成
*/
private LinearLayout mDrawEndLayout;
/**
* {@link ArcGisMapView}
*/
private ArcGisMapView mArcGisMapView;
private ArcGisLocationView mArcGisLocationView;
/**
* {@link MapView}
*/
private MapView mMapView;
/**
* {@link DrawLayer}
*/
private DrawView mDrawView;
private Variable.DrawType drawType = null;
private Variable.Measure measureLengthType = Variable.Measure.M;
private Variable.Measure measureAreaType = Variable.Measure.M2;
public ArcGisDrawView(Context context, ArcGisMapView arcGisMapView, ArcGisLocationView arcGisLocationView) {
this(context);
this.mContext = context;
this.mArcGisMapView = arcGisMapView;
this.mMapView = mArcGisMapView.getMapView();
this.mArcGisLocationView = arcGisLocationView;
if(mArcGisLocationView != null){
mArcGisLocationView.preventClick = true;
}
arcGisMapView.setMyTouchDrawListener(this);
mDrawView = new DrawView(context, mMapView);
}
private ArcGisDrawView(Context context) {
this(context, null, 0);
}
private ArcGisDrawView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
private ArcGisDrawView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inflate(context, R.layout.layout_draw, this);
instance = this;
mDrawTotalLayout = findViewById(R.id.draw_layout);
mDrawIvLayout = findViewById(R.id.draw_iv_layout);
mDrawIv = findViewById(R.id.draw_iv);
mDrawContentLayout = findViewById(R.id.draw_content_layout);
mDrawLineLayout = findViewById(R.id.draw_line_layout);
mDrawCircleLayout = findViewById(R.id.draw_circle_layout);
mDrawOrthogonLayout = findViewById(R.id.draw_orthogon_layout);
mDrawPolygonLayout = findViewById(R.id.draw_polygon_layout);
mDrawPrevLayout = findViewById(R.id.draw_prev_layout);
mDrawNextLayout = findViewById(R.id.draw_next_layout);
mDrawClearLayout = findViewById(R.id.draw_clear_layout);
mDrawEndLayout = findViewById(R.id.draw_end_layout);
mDrawIv.setOnClickListener(this);
mDrawLineLayout.setOnClickListener(this);
mDrawCircleLayout.setOnClickListener(this);
mDrawOrthogonLayout.setOnClickListener(this);
mDrawPolygonLayout.setOnClickListener(this);
mDrawPrevLayout.setOnClickListener(this);
mDrawNextLayout.setOnClickListener(this);
mDrawClearLayout.setOnClickListener(this);
mDrawEndLayout.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.draw_iv) {
if (mDrawContentLayout.getVisibility() == View.VISIBLE) {
mDrawContentLayout.setVisibility(View.GONE);
} else {
mDrawContentLayout.setVisibility(View.VISIBLE);
}
} else if (view.getId() == R.id.draw_line_layout) {//线
drawType = Variable.DrawType.LINE;
mDrawView.endMeasure();
} else if (view.getId() == R.id.draw_circle_layout) {//圆
drawType= Variable.DrawType.CIRCLE;
} else if (view.getId() == R.id.draw_orthogon_layout) {//矩形
drawType= Variable.DrawType.ORTHOGON;
} else if (view.getId() == R.id.draw_polygon_layout) {//多边形
drawType = Variable.DrawType.POLYGON;
mDrawView.endMeasure();
} else if (view.getId() == R.id.draw_prev_layout) {//撤销
boolean hasPrev = mDrawView.prevDraw();
} else if (view.getId() == R.id.draw_next_layout) {//恢复
boolean hasNext = mDrawView.nextDraw();
} else if (view.getId() == R.id.draw_clear_layout) {//清除
drawType = null;
DrawEntity draw = mDrawView.clearMeasure();
} else if (view.getId() == R.id.draw_end_layout) {//完成
drawType = null;
DrawEntity draw = mDrawView.endMeasure();
}
}
/**
* @param isShow boolean-是否显示绘制布局
* 默认显示
*/
public void setShowDrawLayout(boolean isShow) {
if (isShow) {
mDrawTotalLayout.setVisibility(VISIBLE);
} else {
mDrawTotalLayout.setVisibility(GONE);
}
}
/**
* @param location {@link Variable.ViewLocation } DrawView显示位置
*/
public void setDrawViewLocation(Variable.ViewLocation location) {
switch (location) {
case LEFT_TOP:
mDrawIvLayout.setGravity(Gravity.LEFT | Gravity.TOP);
break;
case RIGHT_TOP:
mDrawIvLayout.setGravity(Gravity.RIGHT | Gravity.TOP);
break;
case CENTER:
mDrawIvLayout.setGravity(Gravity.CENTER);
break;
case LEFT_BOTTOM:
mDrawIvLayout.setGravity(Gravity.LEFT | Gravity.BOTTOM);
break;
case RIGHT_BOTTOM:
mDrawIvLayout.setGravity(Gravity.RIGHT | Gravity.BOTTOM);
break;
}
}
/**
* @param drawImage int(资源ID)-绘制图片
*/
public void setDrawImage(int drawImage) {
mDrawIv.setImageDrawable(getResources().getDrawable(drawImage));
}
public void setDrawPointData(String canvaType, List<PointModel> pointModelList){
if(TextUtils.isEmpty(canvaType)){
Toast.makeText(mContext, "请设置绘画类型", Toast.LENGTH_LONG).show();
return;
}
boolean isEmpty = pointModelList == null || pointModelList.isEmpty();
if (isEmpty) {
Toast.makeText(mContext, "暂无数据源", Toast.LENGTH_LONG).show();
return;
}
if(canvaType.equals("LINE")){//线
drawType = Variable.DrawType.LINE;
mDrawView.endMeasure();
}else if(canvaType.equals("POLYGON")){//多边形
drawType = Variable.DrawType.POLYGON;
mDrawView.endMeasure();
}else if(canvaType.equals("ORTHOGON")){//矩形
drawType= Variable.DrawType.ORTHOGON;
}else if(canvaType.equals("CIRCLE")){//圆
drawType= Variable.DrawType.CIRCLE;
}
for (PointModel pointModel : pointModelList) {
double x = pointModel.getxPoint();
double y = pointModel.getyPoint();
if(x < 0 || y < 0){
break;
}
Point point = new Point(x, y, SpatialReference.create(4326));
if(drawType==Variable.DrawType.LINE) {
mDrawView.drawPointLine(point);
}else if(drawType==Variable.DrawType.POLYGON){
mDrawView.drawPointPolygon(point);
}else if(drawType == Variable.DrawType.CIRCLE){
mDrawView.drawCircle(point);
}else if(drawType == Variable.DrawType.ORTHOGON){
mDrawView.drawBox(point);
}
}
drawType = null;
DrawEntity draw = mDrawView.endMeasure();
}
@Override
public void onMapSingleTapUp(MotionEvent e) {
if(drawType==Variable.DrawType.LINE) {
mDrawView.startMeasuredLength(e.getX(), e.getY());
}else if(drawType==Variable.DrawType.POLYGON){
mDrawView.startMeasuredArea(e.getX(), e.getY());
}else if(drawType == Variable.DrawType.CIRCLE){
mDrawView.drawCircle(e.getX(), e.getY());
}else if(drawType == Variable.DrawType.ORTHOGON){
mDrawView.drawBox(e.getX(), e.getY());
}
}
}
package cn.com.founder.arcgislib.nonavi.view;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.esri.arcgisruntime.concurrent.Job;
import com.esri.arcgisruntime.concurrent.ListenableFuture;
import com.esri.arcgisruntime.geometry.SpatialReference;
import com.esri.arcgisruntime.layers.ArcGISMapImageLayer;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.tasks.geoprocessing.GeoprocessingJob;
import com.esri.arcgisruntime.tasks.geoprocessing.GeoprocessingParameters;
import com.esri.arcgisruntime.tasks.geoprocessing.GeoprocessingResult;
import com.esri.arcgisruntime.tasks.geoprocessing.GeoprocessingString;
import com.esri.arcgisruntime.tasks.geoprocessing.GeoprocessingTask;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import cn.com.founder.arcgislib.nonavi.R;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.constants.Constants;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.widget.popup.PopupLayout;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/2/15 17:26
* EMail:luo_shaopeng@founder.com.cn
* Description:热力图
*/
public class ArcGisHotPotsView extends LinearLayout implements View.OnClickListener {
private static final String TAG = "ArcGisHotPotsView";
protected static ArcGisHotPotsView instance;
/**
* 热力图根布局
*/
private LinearLayout mHotPotsTotalLayout;
/**
* 热力图图片
*/
protected ImageView mHotPotsIv;
/**
* {@link Context}
*/
private Context mContext;
/**
* {@link ArcGisMapView}
*/
private ArcGisMapView mArcGisMapView;
/**
* popup
*/
private PopupLayout popupLayout;
/**
* 底部导航布局
*/
private View bottomParentView;
/**
* 出发地
*/
private TextView startTimeTv;
/**
* 目的地
*/
private TextView endTimeTv;
/**
* {@link MapView}
*/
private MapView mMapView;
/**
* {@link GeoprocessingTask}
*/
private GeoprocessingTask mGeoprocessingTask;
/**
* {@link GeoprocessingJob}
*/
private GeoprocessingJob mGeoprocessingJob;
/**
* 是否取消
*/
private boolean canceled;
/**
* 是否清除热力图
*/
private boolean isClean;
/**
* 实际数据源
*/
private List<PointModel> pointList = new ArrayList<>();
private GraphicsOverlay mPointOverlay;
public ArcGisHotPotsView(Context context, ArcGisMapView arcGisMapView){
this(context);
this.mContext = context;
this.mArcGisMapView = arcGisMapView;
this.mMapView = arcGisMapView.getMapView();
mPointOverlay = new GraphicsOverlay();
mPointOverlay.setOpacity(0.8f);
mMapView.getGraphicsOverlays().add(mPointOverlay);
// map.setInitialViewpoint(new Viewpoint(
// new Envelope(-13893029.0, 3573174.0, -12038972.0, 5309823.0, SpatialReferences.getWebMercator())));
mGeoprocessingTask = new GeoprocessingTask(Constants.BASE_HOT_POTS_URL);
mGeoprocessingTask.loadAsync();
}
private ArcGisHotPotsView(Context context) {
this(context,null,0);
}
private ArcGisHotPotsView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
private ArcGisHotPotsView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inflate(context, R.layout.layout_hot_pots, this);
instance = this;
mHotPotsTotalLayout = findViewById(R.id.hot_pots_layout);
mHotPotsIv = findViewById(R.id.hot_pots_iv);
mHotPotsIv.setOnClickListener(this);
}
public void setHotPotsPointData(List<PointModel> pointModelList){
boolean isEmpty = pointModelList == null || pointModelList.isEmpty();
if (isEmpty) {
Toast.makeText(mContext, "暂无数据源", Toast.LENGTH_LONG).show();
return;
}
// pointList = pointModelList;
//
// for (PointModel pointModel : pointModelList) {
// double x = pointModel.getxPoint();
// double y = pointModel.getyPoint();
//
// if(x < 0 || y < 0){
// break;
// }
//
// Point point = new Point(x, y, SpatialReference.create(4326));
// mPointOverlay.getGraphics().add(new Graphic(point));
// }
pointModelList.add(new PointModel(114.26742553710938,23.152313232421875));
pointModelList.add(new PointModel(114.26742553710938,22.646942138671875));
pointModelList.add(new PointModel(113.50799560546875,22.646942138671875));
pointModelList.add(new PointModel(113.50799560546875,23.152313232421875));
pointList = pointModelList;
analyzeHotspots();
}
@Override
public void onClick(View view) {
if(isClean){
mMapView.getMap().getOperationalLayers().clear();
}else{
analyzeHotspots();
}
isClean = !isClean;
}
/**
* @param isShow boolean-是否显示热力图布局
* 默认显示
*/
public void setShowHotPotsLayout(boolean isShow) {
if (isShow) {
mHotPotsTotalLayout.setVisibility(VISIBLE);
} else {
mHotPotsTotalLayout.setVisibility(GONE);
}
}
/**
* @param location {@link Variable.ViewLocation } CompassView显示位置
*/
public void setHotPotsViewLocation(Variable.ViewLocation location) {
switch (location) {
case LEFT_TOP:
mHotPotsTotalLayout.setGravity(Gravity.LEFT | Gravity.TOP);
break;
case RIGHT_TOP:
mHotPotsTotalLayout.setGravity(Gravity.RIGHT | Gravity.TOP);
break;
case CENTER:
mHotPotsTotalLayout.setGravity(Gravity.CENTER);
break;
case LEFT_BOTTOM:
mHotPotsTotalLayout.setGravity(Gravity.LEFT | Gravity.BOTTOM);
break;
case RIGHT_BOTTOM:
mHotPotsTotalLayout.setGravity(Gravity.RIGHT | Gravity.BOTTOM);
break;
}
}
/**
* @param hotPotsImage int(资源ID)-热力图图片
*/
public void setHotPotsImage(int hotPotsImage) {
mHotPotsIv.setImageDrawable(getResources().getDrawable(hotPotsImage));
}
/**
* Runs the geoprocessing job, updating progress while loading. On job done, loads the resulting
* ArcGISMapImageLayer to the map and resets the Viewpoint of the MapView.
*/
private void analyzeHotspots() {
// cancel previous job request
if (mGeoprocessingJob != null) {
mGeoprocessingJob.cancel();
}
// a map image layer is generated as a result. Remove any layer previously added to the map
mMapView.getMap().getOperationalLayers().clear();
// set canceled flag to false
canceled = false;
Toast.makeText(mContext, "请稍等...", Toast.LENGTH_LONG).show();
// parameters
final ListenableFuture<GeoprocessingParameters> paramsFuture = mGeoprocessingTask.createDefaultParametersAsync();
paramsFuture.addDoneListener(() -> {
try {
GeoprocessingParameters geoprocessingParameters = paramsFuture.get();
geoprocessingParameters.setProcessSpatialReference(SpatialReference.create(4326));
// geoprocessingParameters.setOutputSpatialReference(mMapView.getSpatialReference());
geoprocessingParameters.setOutputSpatialReference(SpatialReference.create(4326));
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("displayFieldName","");
jsonObject.put("geometryType","esriGeometryPoint");
JSONObject spatialObject = new JSONObject();
spatialObject.put("wkid",4326);
spatialObject.put("latestWkid",4326);
jsonObject.put("spatialReference",spatialObject);
JSONArray fieldsArray = new JSONArray();
JSONObject fieldOneObject = new JSONObject();
fieldOneObject.put("name","FID");
fieldOneObject.put("type","esriFieldTypeOID");
fieldOneObject.put("alias","FID");
JSONObject fieldTwoObject = new JSONObject();
fieldTwoObject.put("name","x");
fieldTwoObject.put("type","esriFieldTypeDouble");
fieldTwoObject.put("alias","x");
JSONObject fieldThreeObject = new JSONObject();
fieldThreeObject.put("name","y");
fieldThreeObject.put("type","esriFieldTypeDouble");
fieldThreeObject.put("alias","y");
fieldsArray.put(fieldOneObject);
fieldsArray.put(fieldTwoObject);
fieldsArray.put(fieldThreeObject);
jsonObject.put("fields",fieldsArray);
JSONArray featuresArray = new JSONArray();
for(PointModel pointModel : pointList){
JSONObject featuresChildObject = new JSONObject();
JSONObject geometryObject = new JSONObject();
JSONObject spatialReferenceObject = new JSONObject();
spatialReferenceObject.put("wkid",4326);
geometryObject.put("spatialReference",spatialReferenceObject);
geometryObject.put("x",pointModel.getxPoint());
geometryObject.put("y",pointModel.getyPoint());
featuresChildObject.put("geometry",geometryObject);
JSONObject symbolObject = new JSONObject();
symbolObject.put("type","esriSMS");
JSONArray symbolColorArray = new JSONArray();
symbolColorArray.put(255);
symbolColorArray.put(0);
symbolColorArray.put(0);
symbolColorArray.put(255);
symbolObject.put("color",symbolColorArray);
symbolObject.put("angle",0);
symbolObject.put("xoffset",0);
symbolObject.put("yoffset",0);
symbolObject.put("size",12);
symbolObject.put("style","esriSMSCircle");
JSONObject outlineObject = new JSONObject();
outlineObject.put("type","esriSLS");
JSONArray outlineColorArray = new JSONArray();
outlineColorArray.put(255);
outlineColorArray.put(255);
outlineColorArray.put(255);
outlineColorArray.put(255);
outlineObject.put("color", outlineColorArray);
outlineObject.put("width",2);
outlineObject.put("style","esriSLSSolid");
symbolObject.put("outline",outlineObject);
featuresChildObject.put("symbol",symbolObject);
featuresChildObject.put("attributes",new JSONObject());
featuresChildObject.put("popupTemplate","");
featuresArray.put(featuresChildObject);
}
jsonObject.put("features",featuresArray);
jsonObject.put("exceededTransferLimit",false);
} catch (JSONException e) {
e.printStackTrace();
}
geoprocessingParameters.getInputs().put("InputFeatures", new GeoprocessingString(jsonObject.toString()));
// Log.e(TAG, "InputFeatures=: " + jsonObject.toString());
// create job
mGeoprocessingJob = mGeoprocessingTask.createJob(geoprocessingParameters);
// start job
mGeoprocessingJob.start();
// create a dialog to show progress of the geoprocessing job
final ProgressDialog progressDialog = new ProgressDialog(mContext);
progressDialog.setTitle("正在加载...");
progressDialog.setIndeterminate(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(100);
progressDialog.setCancelable(false);
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", (dialog, which) -> {
dialog.dismiss();
// set canceled flag to true
canceled = true;
mGeoprocessingJob.cancel();
});
progressDialog.show();
// update progress
mGeoprocessingJob.addProgressChangedListener(() -> progressDialog.setProgress(mGeoprocessingJob.getProgress()));
// mGeoprocessingJob.addJobChangedListener(() -> {
//
// Log.e("hotPotsID",mGeoprocessingJob.getServerJobId()+"");
//
// for(Job.Message message : mGeoprocessingJob.getMessages()){
// Log.e("***********","***********");
// Log.e("hotPotsM----",message.getMessage());
// Log.e("###########","###########");
// }
//
// });
mGeoprocessingJob.addJobDoneListener(() -> {
progressDialog.dismiss();
if (mGeoprocessingJob.getStatus() == Job.Status.SUCCEEDED) {
Log.i(TAG, "Job succeeded.");
GeoprocessingResult geoprocessingResult = mGeoprocessingJob.getResult();
final ArcGISMapImageLayer hotspotMapImageLayer = geoprocessingResult.getMapImageLayer();
hotspotMapImageLayer.setOpacity(0.6f);
// add the new layer to the map
mMapView.getMap().getOperationalLayers().add(hotspotMapImageLayer);
hotspotMapImageLayer.addDoneLoadingListener(() -> {
// set the map viewpoint to the MapImageLayer, once loaded
mMapView.setViewpointGeometryAsync(hotspotMapImageLayer.getFullExtent());
});
} else if (canceled) {
Toast.makeText(mContext, "热力图加载取消", Toast.LENGTH_SHORT).show();
Log.i(TAG, "Job cancelled.");
} else {
Log.e(TAG, "Job did not succeed!");
Toast.makeText(mContext, "热力图加载失败!", Toast.LENGTH_LONG).show();
}
});
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
});
}
}
package cn.com.founder.arcgislib.nonavi.view;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import com.esri.arcgisruntime.concurrent.ListenableFuture;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.geometry.SpatialReference;
import com.esri.arcgisruntime.location.LocationDataSource;
import com.esri.arcgisruntime.mapping.view.Callout;
import com.esri.arcgisruntime.mapping.view.DrawStatus;
import com.esri.arcgisruntime.mapping.view.DrawStatusChangedEvent;
import com.esri.arcgisruntime.mapping.view.DrawStatusChangedListener;
import com.esri.arcgisruntime.mapping.view.Graphic;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import com.esri.arcgisruntime.mapping.view.IdentifyGraphicsOverlayResult;
import com.esri.arcgisruntime.mapping.view.LocationDisplay;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.symbology.PictureMarkerSymbol;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.runtime.Permission;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import cn.com.founder.arcgislib.nonavi.R;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.constants.Constants;
import cn.com.founder.arcgislib.nonavi.location.listener.ILocationChangeListener;
import cn.com.founder.arcgislib.nonavi.model.LocationModel;
import cn.com.founder.arcgislib.nonavi.model.PointModel;
import cn.com.founder.arcgislib.nonavi.utils.GsonUtil;
import cn.com.founder.arcgislib.nonavi.utils.OkHttpUtil;
import cn.com.founder.arcgislib.nonavi.utils.PermissionUtil;
import cn.com.founder.arcgislib.nonavi.utils.ToolUtil;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/8 17:08
* EMail:luo_shaopeng@founder.com.cn
* Description:位置相关类
*/
public class ArcGisLocationView extends LinearLayout implements View.OnClickListener, ArcGisMapView.MyTouchLocationListener {
private final String[] LOCTION_PERMISSION_GROUP = new String[]{Permission.ACCESS_COARSE_LOCATION, Permission.ACCESS_FINE_LOCATION};
private final String[] STORAGE_PERMISSION_GROUP = new String[]{Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE};
private final int FLAG_START_LOCATION = 0;
private final int FLAG_CREATE_MARKER = 1;
protected static ArcGisLocationView instance;
private Context mContext;
/**
* 定位根布局
*/
private LinearLayout mLocationTotalLayout;
/**
* {@link MapView}
*/
protected MapView mMapView;
/**
* 地图操作图层(点,线,面)
*/
protected GraphicsOverlay mLocationGraphicsOverlay;
/**
* 当前中心点图标,数据的综合体
*/
private Graphic mCenteredGraphic = null;
/**
* 位置显示对象
*/
protected LocationDisplay mLocationDisplay;
/**
* 位置监听
*/
private ILocationChangeListener mILocationChangeListener;
/**
* 地图层级
*/
private double mScale;
/**
* 手动定位图层
*/
protected GraphicsOverlay mManualGraphicsOverlay;
/**
* 手动定位x点
*/
private double mManualXPoint;
/**
* 手动定位y点
*/
private double mManualYPoint;
/**
* 手动定位层级
*/
private double mManualScale;
/**
* 定位图片
*/
private ImageView mLocationIv;
/**
* 导入图片
*/
private ImageView mImportIv;
/**
* 中心点位置图标
*/
private int mCenterLocationImage;
/**
* 标记位置正常图标
*/
private int mLabelLocationNormalImage;
/**
* 标记位置选中图标
*/
private int mLabelLocationSelectedImage;
/**
* {@link CalloutStyleBuilder}
*/
private CalloutStyleBuilder mCalloutStyleBuilder;
/**
* {@link CalloutContentBuilder}
*/
private CalloutContentBuilder mCalloutContentBuilder;
/**
* 地图中心X点
*/
private int mScreenCenterXPoint;
/**
* 地图中心Y点
*/
private int mScreenCenterYPoint;
/**
* 跟随地图回去中心点
*/
private boolean mFollowMapGetCenterPoint;
/**
* 当前搜索类型
*/
protected Variable.SearchType currSearchType = Variable.SearchType.NONE;
/**
* 导航图层
*/
protected GraphicsOverlay mNaviGraphicsOverlay;
/**
* 导航图标图层
*/
protected GraphicsOverlay mRouteMarkerGraphicsOverlay;
/**
* 导航起点图标
*/
private int mNaviStartImage;
/**
* 导航终点图标
*/
private int mNaviEndImage;
/**
* 加载框
*/
protected ProgressDialog myDialog;
/**
* 已经载入得点,保存在list,直接取出地址信息,不需要再请求接口
*/
private List<LocationModel> locationModelList = new LinkedList<>();
/**
* 默认逆地理编码距离是0.1,单位是km;
*/
private double distance = 0.1;
/**
* 阻止点击
*/
protected boolean preventClick = false;
/**
* 是否显示地图,比如后台定位
*/
private boolean isShowMap = true;
/**
* 是否显示请求加载框
*/
private boolean isShowLoading = true;
public ArcGisLocationView(Context context, ArcGisMapView arcGisMapView) {
this(context);
this.mContext = context;
this.mMapView = arcGisMapView.getMapView();
this.mLocationGraphicsOverlay = arcGisMapView.getLocationGraphicsOverlay();
this.mNaviGraphicsOverlay = arcGisMapView.getNaviGraphicsOverlay();
this.mRouteMarkerGraphicsOverlay = arcGisMapView.getRouteMarkerGraphicsOverlay();
this.mCenterLocationImage = R.drawable.icon_local_location;
this.mLabelLocationNormalImage = R.drawable.icon_label_location_normal;
this.mLabelLocationSelectedImage = R.drawable.icon_label_location_selected;
this.mFollowMapGetCenterPoint = false;
arcGisMapView.setMyTouchLocationListener(this);
mCalloutStyleBuilder = new CalloutStyleBuilder(context);
mCalloutContentBuilder = new CalloutContentBuilder();
mMapView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mMapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
mScreenCenterXPoint = mMapView.getWidth() / 2; // 获取宽度
mScreenCenterYPoint = mMapView.getHeight() / 2; // 获取高度
}
});
}
private ArcGisLocationView(Context context) {
this(context, null, 0);
}
private ArcGisLocationView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
private ArcGisLocationView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inflate(context, R.layout.layout_location, this);
instance = this;
mLocationTotalLayout = findViewById(R.id.location_layout);
mLocationIv = findViewById(R.id.location_iv);
mImportIv = findViewById(R.id.import_iv);
mLocationIv.setOnClickListener(this);
mImportIv.setOnClickListener(this);
}
/**
* @param iLocationChangeListener 位置变化监听
*/
public void setILocationChangeListener(ILocationChangeListener iLocationChangeListener) {
this.mILocationChangeListener = iLocationChangeListener;
}
/**
* @param isShow boolean-是否显示定位布局
* 默认显示
*/
public void setShowLocationLayout(boolean isShow) {
if (isShow) {
mLocationTotalLayout.setVisibility(VISIBLE);
} else {
mLocationTotalLayout.setVisibility(GONE);
}
}
/**
* @param isShow boolean-是否显示TXT导入布局
* 默认不显示
*/
public void setShowTXTImportLayout(boolean isShow) {
if (isShow) {
mImportIv.setVisibility(VISIBLE);
} else {
mImportIv.setVisibility(GONE);
}
}
/**
* @param location {@link Variable.ViewLocation } LocationView显示位置
*/
public void setLocationViewLocation(Variable.ViewLocation location) {
switch (location) {
case LEFT_TOP:
mLocationTotalLayout.setGravity(Gravity.LEFT | Gravity.TOP);
break;
case RIGHT_TOP:
mLocationTotalLayout.setGravity(Gravity.RIGHT | Gravity.TOP);
break;
case CENTER:
mLocationTotalLayout.setGravity(Gravity.CENTER);
break;
case LEFT_BOTTOM:
mLocationTotalLayout.setGravity(Gravity.LEFT | Gravity.BOTTOM);
break;
case RIGHT_BOTTOM:
mLocationTotalLayout.setGravity(Gravity.RIGHT | Gravity.BOTTOM);
break;
}
}
/**
* 手动定位
*
* @param x
* @param y
* @param scale
*/
public void startLocation(double x, double y, double scale) {
if (AndPermission.hasPermissions(getContext(), LOCTION_PERMISSION_GROUP)) {
ManualLocation(x, y, scale);
} else {
PermissionUtil.requestPermission(getContext(), 0, new PermissionUtil.PermissionQuestListener() {
@Override
public void onGranted() {
ManualLocation(x, y, scale);
}
@Override
public void onDenied(List<String> data) {
}
@Override
public String onAlwaysDenied() {
return "定位权限获取失败";
}
}, LOCTION_PERMISSION_GROUP);
}
}
/**
* 手动定位
*
* @param x x点
* @param y y点
* @param scale 缩放层级默认5d
*/
private void ManualLocation(double x, double y, double scale) {
if (scale <= 0) {
scale = 5d;
}
if (this.mManualScale < 100000) {
scale = scale * 100000;
this.mManualScale = scale;
}
mManualXPoint = x;
mManualYPoint = y;
Point point = new Point(x, y);
try {
if (mManualGraphicsOverlay == null) {
mManualGraphicsOverlay = new GraphicsOverlay();
mMapView.getGraphicsOverlays().add(mManualGraphicsOverlay);
}
Resources resources = getResources();
BitmapDrawable bitmapDrawable = new BitmapDrawable(resources, BitmapFactory.decodeResource(resources, mCenterLocationImage));
final PictureMarkerSymbol campsiteSymbol = new PictureMarkerSymbol(bitmapDrawable);
mManualGraphicsOverlay.getGraphics().add(new Graphic(point, campsiteSymbol));
mMapView.setViewpointCenterAsync(point).addDoneListener(() -> {
mMapView.setViewpointScaleAsync(mManualScale);
requestGeoCeoder(point, Variable.LocationChangeType.START_LOCATION, FLAG_START_LOCATION);
});
} catch (Exception ie) {
ie.printStackTrace();
}
}
/**
* 开始定位
*
* @param scale 地图初始层级
*/
public void startLocation(double scale) {
startMLocation(scale);
}
/**
* 开始定位
*
* @param scale 地图初始层级
*/
private void startMLocation(double scale) {
initLocationPermission(scale);
}
/**
* 停止定位
*/
public void stopLocation() {
stopMLocation();
}
/**
* 停止定位
*/
private void stopMLocation() {
if (mLocationDisplay != null) {
if (mLocationDisplay.isStarted()) {
mLocationDisplay.stop();
}
}
}
/**
* @param scale 获取位置 默认5d
*/
@SuppressLint("ClickableViewAccessibility")
private void getLocation(double scale) {
if (scale <= 0) {
scale = 5d;
}
scale = scale * 100000;
this.mScale = scale;
if (!isShowMap) {
mLocationDisplay = mMapView.getLocationDisplay();
mLocationDisplay.setAutoPanMode(LocationDisplay.AutoPanMode.RECENTER);
mLocationDisplay.startAsync();
//如果要在LocationDisplay里进行位置信息的自动监听
mLocationDisplay.addLocationChangedListener(new LocationDisplay.LocationChangedListener() {
@Override
public void onLocationChanged(LocationDisplay.LocationChangedEvent locationChangedEvent) {
mLocationDisplay.removeLocationChangedListener(this);
stopLocation();
//业务逻辑没有导航,所以定位一次就好了,其他的可以直接直接调用定位代码
LocationDataSource.Location locationInfo = locationChangedEvent.getLocation();
requestGeoCeoder(new Point(locationInfo.getPosition().getX(), locationInfo.getPosition().getY()), Variable.LocationChangeType.START_LOCATION, FLAG_START_LOCATION);
}
});
} else {
mMapView.addDrawStatusChangedListener(new DrawStatusChangedListener() {
@Override
public void drawStatusChanged(final DrawStatusChangedEvent drawStatusChangedEvent) {
if (drawStatusChangedEvent.getDrawStatus() == DrawStatus.COMPLETED) {
mMapView.removeDrawStatusChangedListener(this);
mLocationDisplay = mMapView.getLocationDisplay();
//设置模式:
// COMPASS_NAVIGATION 和NAVIGATION 分别最适用于步行导航和车载导航,用户的位置符号会固定显示在屏幕的某个点上,并且指向设备的顶部(也就是地图会随着用户移动而平移,随用户转弯而旋转)
// OFF 模式,用户位置符号会随位置变化而移动,但地图不会动
// RECENTER模式,当用户位置处于当前地图范围内时候,用户位置符号会随位置变化而移动,但地图不会动;当用户位置处于地图边缘时候,地图会自动平移是用户的当前位置重新居于显示地图中心
mLocationDisplay.setAutoPanMode(LocationDisplay.AutoPanMode.RECENTER);
//设置默认定位图标
Resources resources = getResources();
BitmapDrawable bitmapDrawable = new BitmapDrawable(resources, BitmapFactory.decodeResource(resources, mCenterLocationImage));
final PictureMarkerSymbol campsiteSymbol = new PictureMarkerSymbol(bitmapDrawable);
campsiteSymbol.loadAsync();
campsiteSymbol.addDoneLoadingListener(() -> {
//设置默认符号
mLocationDisplay.setDefaultSymbol(campsiteSymbol);
//隐藏符号的缓存区域
mLocationDisplay.setShowAccuracy(false);
//隐藏位置更新的符号动画
mLocationDisplay.setShowPingAnimation(false);
});
//隐藏符号
// mLocationDisplay.setShowLocation(false);
//显示当前位置
mLocationDisplay.startAsync();
//设置初始Zoom层级
mLocationDisplay.setInitialZoomScale(mScale);
//获取的点是基于当前地图坐标系的点
Point point = mLocationDisplay.getMapLocation();
//获取基于GPS的位置信息
LocationDataSource.Location location = mLocationDisplay.getLocation();
//基于WGS84的经纬度坐标。
Point point1 = location.getPosition();
//如果要在LocationDisplay里进行位置信息的自动监听
mLocationDisplay.addLocationChangedListener(new LocationDisplay.LocationChangedListener() {
@Override
public void onLocationChanged(LocationDisplay.LocationChangedEvent locationChangedEvent) {
mLocationDisplay.removeLocationChangedListener(this);
stopLocation();
//业务逻辑没有导航,所以定位一次就好了,其他的可以直接直接调用定位代码
LocationDataSource.Location locationInfo = locationChangedEvent.getLocation();
requestGeoCeoder(new Point(locationInfo.getPosition().getX(), locationInfo.getPosition().getY()), Variable.LocationChangeType.START_LOCATION, FLAG_START_LOCATION);
}
});
}
}
});
}
}
/**
* 获取定位权限
*
* @param scale 缩放级别
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void initLocationPermission(double scale) {
if (AndPermission.hasPermissions(getContext(), LOCTION_PERMISSION_GROUP)) {
getLocation(scale);
} else {
PermissionUtil.requestPermission(getContext(), 0, new PermissionUtil.PermissionQuestListener() {
@Override
public void onGranted() {
getLocation(scale);
}
@Override
public void onDenied(List<String> data) {
}
@Override
public String onAlwaysDenied() {
return "定位权限获取失败";
}
}, LOCTION_PERMISSION_GROUP);
}
}
/**
* 获取文件读写权限
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void initStoragePermission() {
if (AndPermission.hasPermissions(getContext(), STORAGE_PERMISSION_GROUP)) {
getSDTxtFile();
} else {
PermissionUtil.requestPermission(getContext(), 0, new PermissionUtil.PermissionQuestListener() {
@Override
public void onGranted() {
getSDTxtFile();
}
@Override
public void onDenied(List<String> data) {
}
@Override
public String onAlwaysDenied() {
return "文件读取权限失败";
}
}, STORAGE_PERMISSION_GROUP);
}
}
//x(经度)y(纬度)
private void getSDTxtFile() {
String path = Environment.getExternalStorageDirectory().getPath();
File file = new File(path + File.separator + "LngLat.txt");
List<String> contentList = ToolUtil.getFileContent(mContext, file.getPath());
if (contentList.size() > 0) {
for (String pointStr : contentList) {
double x = Double.parseDouble(pointStr.split(",")[0]);
double y = Double.parseDouble(pointStr.split(",")[1]);
Point point = new Point(x, y, SpatialReference.create(4326));
try {
BitmapDrawable bitmapDrawableNormal = (BitmapDrawable) ContextCompat
.getDrawable(mContext, mLabelLocationNormalImage);
PictureMarkerSymbol destinationSymbolNormal = null;
destinationSymbolNormal = PictureMarkerSymbol.createAsync(bitmapDrawableNormal).get();
mLocationGraphicsOverlay.getGraphics().add(new Graphic(point, destinationSymbolNormal));
mCenteredGraphic = mLocationGraphicsOverlay.getGraphics().get(mLocationGraphicsOverlay.getGraphics().size() - 1);
BitmapDrawable bitmapDrawableCenter = (BitmapDrawable) ContextCompat
.getDrawable(mContext, mLabelLocationNormalImage);
PictureMarkerSymbol destinationSymbolCenter = PictureMarkerSymbol.createAsync(bitmapDrawableCenter).get();
mCenteredGraphic.setSymbol(destinationSymbolCenter);
requestGeoCeoder(point, Variable.LocationChangeType.IMPORT_POINT, FLAG_CREATE_MARKER, false, false);
} catch (InterruptedException | ExecutionException ie) {
ie.printStackTrace();
}
}
}
}
/**
* @param pointModelList 批量导入数据{@link PointModel}
*/
public void setImportPointData(List<PointModel> pointModelList) {
boolean isEmpty = pointModelList == null || pointModelList.isEmpty();
if (!isEmpty) {
for (PointModel pointModel : pointModelList) {
double x = pointModel.getxPoint();
double y = pointModel.getyPoint();
if (x < 0 || y < 0) {
break;
}
Point point = new Point(x, y, SpatialReference.create(4326));
try {
BitmapDrawable bitmapDrawableNormal = (BitmapDrawable) ContextCompat
.getDrawable(mContext, mLabelLocationNormalImage);
PictureMarkerSymbol destinationSymbolNormal = null;
destinationSymbolNormal = PictureMarkerSymbol.createAsync(bitmapDrawableNormal).get();
mLocationGraphicsOverlay.getGraphics().add(new Graphic(point, destinationSymbolNormal));
mCenteredGraphic = mLocationGraphicsOverlay.getGraphics().get(mLocationGraphicsOverlay.getGraphics().size() - 1);
BitmapDrawable bitmapDrawableCenter = (BitmapDrawable) ContextCompat
.getDrawable(mContext, mLabelLocationNormalImage);
PictureMarkerSymbol destinationSymbolCenter = PictureMarkerSymbol.createAsync(bitmapDrawableCenter).get();
mCenteredGraphic.setSymbol(destinationSymbolCenter);
requestGeoCeoder(point, Variable.LocationChangeType.IMPORT_POINT, FLAG_CREATE_MARKER, false, false);
} catch (InterruptedException | ExecutionException ie) {
ie.printStackTrace();
}
}
}
}
/**
* 设置气泡组件
*/
private void setCallout(Graphic graphic, String address, String poi, boolean isShowCallout) {
Point point = (Point) graphic.getGeometry();
Callout mCallout = mMapView.getCallout();
if (mCallout.isShowing()) {
mCallout.dismiss();
}
View view = LayoutInflater.from(mContext).inflate(R.layout.layout_callout, null, false);
TextView mXPointTv = view.findViewById(R.id.callout_x_tv);
TextView mYPointTv = view.findViewById(R.id.callout_y_tv);
TextView mAddressTv = view.findViewById(R.id.callout_address_tv);
TextView mPoiTv = view.findViewById(R.id.callout_poi_tv);
ImageView mInfoIv = view.findViewById(R.id.callout_info_iv);
LinearLayout mDelLayout = view.findViewById(R.id.callout_del_ll);
TextView mDelTv = view.findViewById(R.id.callout_del_tv);
TextView mDescLabelTv = view.findViewById(R.id.callout_label_tv);
EditText mDescEt = view.findViewById(R.id.callout_desc_et);
TextView mCancelTv = view.findViewById(R.id.callout_cancel_tv);
TextView mOkTv = view.findViewById(R.id.callout_ok_tv);
if (mCalloutContentBuilder.mXPointFontColor != -1) {
mXPointTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mXPointFontColor));
}
if (mCalloutContentBuilder.mXPointFontSize != -1) {
mXPointTv.setTextSize(mCalloutContentBuilder.mXPointFontSize);
}
if (mCalloutContentBuilder.mXPointHide) {
mXPointTv.setVisibility(View.GONE);
} else {
mXPointTv.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mYPointFontColor != -1) {
mYPointTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mYPointFontColor));
}
if (mCalloutContentBuilder.mYPointFontSize != -1) {
mYPointTv.setTextSize(mCalloutContentBuilder.mYPointFontSize);
}
if (mCalloutContentBuilder.mYPointHide) {
mYPointTv.setVisibility(View.GONE);
} else {
mYPointTv.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mAddressFontColor != -1) {
mAddressTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mAddressFontColor));
}
if (mCalloutContentBuilder.mAddressFontSize != -1) {
mAddressTv.setTextSize(mCalloutContentBuilder.mAddressFontSize);
}
if (mCalloutContentBuilder.mAddressHide) {
mAddressTv.setVisibility(View.GONE);
} else {
mAddressTv.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mPoiFontColor != -1) {
mPoiTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mPoiFontColor));
}
if (mCalloutContentBuilder.mPoiFontSize != -1) {
mPoiTv.setTextSize(mCalloutContentBuilder.mPoiFontSize);
}
if (mCalloutContentBuilder.mPoiHide) {
mPoiTv.setVisibility(View.GONE);
} else {
mPoiTv.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mInfoImage != -1) {
mInfoIv.setImageDrawable(getResources().getDrawable(mCalloutContentBuilder.mInfoImage));
}
if (mCalloutContentBuilder.mInfoImageHide) {
mInfoIv.setVisibility(View.GONE);
} else {
mInfoIv.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mDelBackground != -1) {
mDelLayout.setBackground(getResources().getDrawable(mCalloutContentBuilder.mDelBackground));
}
if (mCalloutContentBuilder.mDelFontColor != -1) {
mDelTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mDelFontColor));
}
if (mCalloutContentBuilder.mDelFontSize != -1) {
mDelTv.setTextSize(mCalloutContentBuilder.mDelFontSize);
}
if (mCalloutContentBuilder.mDelHide) {
mDelLayout.setVisibility(View.GONE);
} else {
mDelLayout.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mDescLabelFontColor != -1) {
mDescLabelTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mDescLabelFontColor));
}
if (mCalloutContentBuilder.mDescLabelFontSize != -1) {
mDescLabelTv.setTextSize(mCalloutContentBuilder.mDescLabelFontSize);
}
if (mCalloutContentBuilder.mDescBackground != -1) {
mDescEt.setBackground(getResources().getDrawable(mCalloutContentBuilder.mDescBackground));
}
if (mCalloutContentBuilder.mDescFontColor != -1) {
mDescEt.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mDescFontColor));
}
if (mCalloutContentBuilder.mDescFontSize != -1) {
mDescEt.setTextSize(mCalloutContentBuilder.mDescFontSize);
}
if (mCalloutContentBuilder.mDescHide) {
mDescLabelTv.setVisibility(View.GONE);
mDescEt.setVisibility(View.GONE);
} else {
mDescLabelTv.setVisibility(View.VISIBLE);
mDescEt.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mCancelBackground != -1) {
mCancelTv.setBackground(getResources().getDrawable(mCalloutContentBuilder.mCancelBackground));
}
if (mCalloutContentBuilder.mCancelFontColor != -1) {
mCancelTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mCancelFontColor));
}
if (mCalloutContentBuilder.mCancelFontSize != -1) {
mCancelTv.setTextSize(mCalloutContentBuilder.mCancelFontSize);
}
if (mCalloutContentBuilder.mCancelHide) {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(0, 0, 0, 0);
mOkTv.setLayoutParams(layoutParams);//因为在xml布局中有40dip的Margin
mCancelTv.setVisibility(View.GONE);
} else {
mCancelTv.setVisibility(View.VISIBLE);
}
if (mCalloutContentBuilder.mOkBackground != -1) {
mOkTv.setBackground(getResources().getDrawable(mCalloutContentBuilder.mOkBackground));
}
if (mCalloutContentBuilder.mOkFontColor != -1) {
mOkTv.setTextColor(ContextCompat.getColor(mContext, mCalloutContentBuilder.mOkFontColor));
}
if (mCalloutContentBuilder.mOkFontSize != -1) {
mOkTv.setTextSize(mCalloutContentBuilder.mOkFontSize);
}
if (mCalloutContentBuilder.mOkHide) {
mOkTv.setVisibility(View.GONE);
} else {
mOkTv.setVisibility(View.VISIBLE);
}
mDescEt.setOnFocusChangeListener((view15, b) -> {
if (b) {
ToolUtil.showSoftInput(mContext, mDescEt);
} else {
ToolUtil.hideSoftInput(mContext, mDescEt);
}
});
mXPointTv.setText(mContext.getString(R.string.string_callout_point_x, String.valueOf(point.getX())));
mYPointTv.setText(mContext.getString(R.string.string_callout_point_y, String.valueOf(point.getY())));
mAddressTv.setText(mContext.getString(R.string.string_callout_point_address, TextUtils.isEmpty(address) ? "暂无" : address));
mPoiTv.setText(mContext.getString(R.string.string_callout_point_POI, TextUtils.isEmpty(poi) ? "暂无" : poi));
Map<String, Object> attrResultMap = graphic.getAttributes();
if (attrResultMap != null && attrResultMap.size() > 0) {
mDescEt.setText(attrResultMap.get("DESCRIPTION").toString());
}
mInfoIv.setOnClickListener(view1 -> {
if (mDelLayout.getVisibility() == View.GONE) {
mDelLayout.setVisibility(View.VISIBLE);
} else {
mDelLayout.setVisibility(View.GONE);
}
});
mDelLayout.setOnClickListener(view14 -> {
final List<Graphic> graphics = mLocationGraphicsOverlay.getGraphics();
for (int i = 0; i < graphics.size(); i++) {
Graphic g = graphics.get(i);
if (g.getGeometry().equals(graphic.getGeometry())) {
graphics.remove(i);
break;
}
}
mCallout.dismiss();
mDelLayout.setVisibility(View.GONE);
});
mCancelTv.setOnClickListener(view13 -> mCallout.dismiss());
mOkTv.setOnClickListener(view12 -> {
Map<String, Object> attrMap = graphic.getAttributes();
attrMap.put("DESCRIPTION", mDescEt.getText().toString());
if (mILocationChangeListener != null) {
mILocationChangeListener.locationCallBack(new LocationModel(point.getX(), point.getY(), address, poi, mDescEt.getText().toString(), Variable.LocationChangeType.CALLOUT_OK));
}
mCallout.dismiss();
});
Callout.Style mCalloutStyle = new Callout.Style(mContext);
mCalloutStyle.setMaxWidth(mCalloutStyleBuilder.mCalloutMaxWidth); //设置最大宽度
if (mCalloutStyleBuilder.mCalloutMaxHeight != -1) {
mCalloutStyle.setMaxHeight(mCalloutStyleBuilder.mCalloutMaxHeight); //设置最大高度
}
mCalloutStyle.setMinWidth(mCalloutStyleBuilder.mCalloutMinWidth); //设置最小宽度
if (mCalloutStyleBuilder.mCalloutMinHeight != -1) {
mCalloutStyle.setMinHeight(mCalloutStyleBuilder.mCalloutMinHeight); //设置最小高度
}
mCalloutStyle.setBackgroundColor(ContextCompat.getColor(mContext, mCalloutStyleBuilder.mCalloutBackgroundColor)); //设置背景颜色
mCalloutStyle.setBorderWidth(mCalloutStyleBuilder.mCalloutBorderWidth); //设置边框宽度
mCalloutStyle.setBorderColor(ContextCompat.getColor(mContext, mCalloutStyleBuilder.mCalloutBorderColor)); //设置边框颜色
mCalloutStyle.setCornerRadius(mCalloutStyleBuilder.mCalloutCornerRadius); //设置圆角半径
if (mCalloutStyleBuilder.mCalloutLeaderLength != -1) {
mCalloutStyle.setLeaderLength(mCalloutStyleBuilder.mCalloutLeaderLength); //设置指示性长度
}
if (mCalloutStyleBuilder.mCalloutLeaderWidth != -1) {
mCalloutStyle.setLeaderWidth(mCalloutStyleBuilder.mCalloutLeaderWidth); //设置指示性宽度
}
mCalloutStyle.setLeaderPosition(mCalloutStyleBuilder.mLeaderPosition); //设置指示性位置
mCallout.setStyle(mCalloutStyle);
mCallout.setLocation(point);
mCallout.setContent(view);
if (isShowCallout) {
mCallout.show();
}
mMapView.setViewpointCenterAsync(point);
}
/**
* @param motionEvent 设置mark
*/
private void setMarker(MotionEvent motionEvent) {
final android.graphics.Point screenPoint = new android.graphics.Point(
(int) motionEvent.getX(),
(int) motionEvent.getY());
//获取屏幕上的点,误差在10米以内
final ListenableFuture<IdentifyGraphicsOverlayResult> identifyGraphic = mMapView
.identifyGraphicsOverlayAsync(mLocationGraphicsOverlay, screenPoint, 10, false);
identifyGraphic.addDoneListener(() -> {
try {
clearCenteredSelected();
// get the list of graphics returned by identify
final IdentifyGraphicsOverlayResult graphic = identifyGraphic.get();
// get size of list in results
final int identifyResultSize = graphic.getGraphics().size();
boolean isExist = false;
if (identifyResultSize > 0) {
final Graphic foundGraphic = graphic.getGraphics().get(0);
final List<Graphic> graphics = mLocationGraphicsOverlay.getGraphics();
for (final Graphic g : graphics) {
if (g.getGeometry().equals(foundGraphic.getGeometry())) {
mCenteredGraphic = g;
// mCenteredGraphic.setZIndex(3);
// mCenteredGraphic.setSelected(true);
PictureMarkerSymbol destinationSymbolSelected = PictureMarkerSymbol.createAsync(getBitmapDrawable(mLabelLocationSelectedImage)).get();
mCenteredGraphic.setSymbol(destinationSymbolSelected);
isExist = true;
break;
}
}
}
if (isExist) {
Point centerPoint = (Point) mCenteredGraphic.getGeometry();
for (LocationModel locationModel : locationModelList) {
if (locationModel.getXPoint() == centerPoint.getX() && locationModel.getYPoint() == centerPoint.getY()) {
setCallout(mCenteredGraphic, locationModel.getAddress(), locationModel.getPoi(), true);
}
}
} else {
Point point = mMapView.screenToLocation(screenPoint);
createMarkerGraphic(point);
}
} catch (InterruptedException | ExecutionException ie) {
ie.printStackTrace();
}
});
}
/**
* @param point 增加mark
*/
private void createMarkerGraphic(Point point) {
try {
BitmapDrawable bitmapDrawableNormal = (BitmapDrawable) ContextCompat
.getDrawable(mContext, mLabelLocationNormalImage);
PictureMarkerSymbol destinationSymbolNormal = null;
destinationSymbolNormal = PictureMarkerSymbol.createAsync(bitmapDrawableNormal).get();
mLocationGraphicsOverlay.getGraphics().add(new Graphic(point, destinationSymbolNormal));
mCenteredGraphic = mLocationGraphicsOverlay.getGraphics().get(mLocationGraphicsOverlay.getGraphics().size() - 1);
// mCenteredGraphic.setZIndex(3);
// mCenteredGraphic.setSelected(true);
PictureMarkerSymbol destinationSymbolSelected = PictureMarkerSymbol.createAsync(getBitmapDrawable(mLabelLocationSelectedImage)).get();
mCenteredGraphic.setSymbol(destinationSymbolSelected);
if (mFollowMapGetCenterPoint) {
requestGeoCeoder(point, Variable.LocationChangeType.MOVE_MAP, FLAG_CREATE_MARKER);
} else {
requestGeoCeoder(point, Variable.LocationChangeType.CLICK_MAP, FLAG_CREATE_MARKER);
}
} catch (InterruptedException | ExecutionException ie) {
ie.printStackTrace();
}
}
/**
* 恢复默认的状态
*/
private void clearCenteredSelected() {
try {
if (mCenteredGraphic != null) {
// mCenteredGraphic.setZIndex(0);
// mCenteredGraphic.setSelected(false);
BitmapDrawable bitmapDrawableNormal = (BitmapDrawable) ContextCompat
.getDrawable(mContext, mLabelLocationNormalImage);
PictureMarkerSymbol destinationSymbolNormal = PictureMarkerSymbol.createAsync(bitmapDrawableNormal).get();
mCenteredGraphic.setSymbol(destinationSymbolNormal);
}
} catch (InterruptedException | ExecutionException ie) {
ie.printStackTrace();
}
}
/**
* @param imgResId 选中图片
* @return
*/
private BitmapDrawable getBitmapDrawable(int imgResId) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
options.inScaled = true;
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), imgResId, options);
return new BitmapDrawable(bitmap);
}
/**
* @param x 坐标x
* @param y 左边y
*/
protected void setSearchLocation(double x, double y, Variable.SearchType searchType) {
mMapView.setViewpointRotationAsync(0);
Point point = new Point(x, y, SpatialReference.create(4326));
currSearchType = searchType;
// 这种写法可以自定义search图标
switch (searchType) {
case SEARCH:
clearCenteredSelected();
try {
BitmapDrawable bitmapDrawableNormal = (BitmapDrawable) ContextCompat
.getDrawable(mContext, mLabelLocationNormalImage);
PictureMarkerSymbol destinationSymbolNormal = null;
destinationSymbolNormal = PictureMarkerSymbol.createAsync(bitmapDrawableNormal).get();
mLocationGraphicsOverlay.getGraphics().add(new Graphic(point, destinationSymbolNormal));
mCenteredGraphic = mLocationGraphicsOverlay.getGraphics().get(mLocationGraphicsOverlay.getGraphics().size() - 1);
PictureMarkerSymbol destinationSymbolSelected = PictureMarkerSymbol.createAsync(getBitmapDrawable(mLabelLocationNormalImage)).get();
mCenteredGraphic.setSymbol(destinationSymbolSelected);
// setCallout(mCenteredGraphic);
mMapView.setViewpointCenterAsync(point);
} catch (Exception ie) {
ie.printStackTrace();
}
break;
case START_ADDRESS_SEARCH:
mNaviStartImage = R.drawable.icon_navi_start;
try {
BitmapDrawable bitmapDrawableNormal = (BitmapDrawable) ContextCompat
.getDrawable(mContext, mNaviStartImage);
PictureMarkerSymbol destinationSymbolNormal = null;
destinationSymbolNormal = PictureMarkerSymbol.createAsync(bitmapDrawableNormal).get();
mNaviGraphicsOverlay.getGraphics().add(new Graphic(point, destinationSymbolNormal));
mCenteredGraphic = mNaviGraphicsOverlay.getGraphics().get(mNaviGraphicsOverlay.getGraphics().size() - 1);
PictureMarkerSymbol destinationSymbolSelected = PictureMarkerSymbol.createAsync(getBitmapDrawable(mNaviStartImage)).get();
mCenteredGraphic.setSymbol(destinationSymbolSelected);
// setCallout(mCenteredGraphic);
mMapView.setViewpointCenterAsync(point);
} catch (Exception ie) {
ie.printStackTrace();
}
break;
case END_ADDRESS_SEARCH:
mNaviEndImage = R.drawable.icon_navi_end;
try {
BitmapDrawable bitmapDrawableNormal = (BitmapDrawable) ContextCompat
.getDrawable(mContext, mNaviEndImage);
PictureMarkerSymbol destinationSymbolNormal = null;
destinationSymbolNormal = PictureMarkerSymbol.createAsync(bitmapDrawableNormal).get();
mNaviGraphicsOverlay.getGraphics().add(new Graphic(point, destinationSymbolNormal));
mCenteredGraphic = mNaviGraphicsOverlay.getGraphics().get(mNaviGraphicsOverlay.getGraphics().size() - 1);
PictureMarkerSymbol destinationSymbolSelected = PictureMarkerSymbol.createAsync(getBitmapDrawable(mNaviEndImage)).get();
mCenteredGraphic.setSymbol(destinationSymbolSelected);
// setCallout(mCenteredGraphic);
mMapView.setViewpointCenterAsync(point);
} catch (Exception ie) {
ie.printStackTrace();
}
break;
}
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.location_iv) {
mMapView.setViewpointRotationAsync(0);
if (mManualGraphicsOverlay != null) {
startLocation(mManualXPoint, mManualYPoint, mManualScale);
} else {
startLocation(mScale);
}
} else if (view.getId() == R.id.import_iv) {
initStoragePermission();
}
}
@Override
public void onUp(Variable.TouchUp touchUp, MotionEvent motionEvent) {
if (preventClick)
return;
if (touchUp == Variable.TouchUp.UP && mFollowMapGetCenterPoint) {
final android.graphics.Point screenPoint = new android.graphics.Point(
mScreenCenterXPoint,
mScreenCenterYPoint);
//获取屏幕上的点,误差在10米以内
final ListenableFuture<IdentifyGraphicsOverlayResult> identifyGraphic = mMapView
.identifyGraphicsOverlayAsync(mLocationGraphicsOverlay, screenPoint, 10, false);
identifyGraphic.addDoneListener(() -> {
try {
clearCenteredSelected();
// get the list of graphics returned by identify
final IdentifyGraphicsOverlayResult graphic = identifyGraphic.get();
// get size of list in results
final int identifyResultSize = graphic.getGraphics().size();
boolean isExist = false;
if (identifyResultSize > 0) {
final Graphic foundGraphic = graphic.getGraphics().get(0);
final List<Graphic> graphics = mLocationGraphicsOverlay.getGraphics();
for (final Graphic g : graphics) {
if (g.getGeometry().equals(foundGraphic.getGeometry())) {
mCenteredGraphic = g;
// mCenteredGraphic.setZIndex(3);
// mCenteredGraphic.setSelected(true);
PictureMarkerSymbol destinationSymbolSelected = PictureMarkerSymbol.createAsync(getBitmapDrawable(mLabelLocationSelectedImage)).get();
mCenteredGraphic.setSymbol(destinationSymbolSelected);
isExist = true;
break;
}
}
}
if (isExist) {
Point centerPoint = (Point) mCenteredGraphic.getGeometry();
for (LocationModel locationModel : locationModelList) {
if (locationModel.getXPoint() == centerPoint.getX() && locationModel.getYPoint() == centerPoint.getY()) {
setCallout(mCenteredGraphic, locationModel.getAddress(), locationModel.getPoi(), true);
}
}
} else {
Point point = mMapView.screenToLocation(screenPoint);
createMarkerGraphic(point);
}
} catch (InterruptedException | ExecutionException ie) {
ie.printStackTrace();
}
});
}
}
@Override
public void onSingleTap(MotionEvent motionEvent) {
if (preventClick)
return;
switch (currSearchType) {
case SEARCH:
case NONE:
setMarker(motionEvent);
break;
}
}
@Override
public void onLongPress(MotionEvent motionEvent) {
if (preventClick)
return;
switch (currSearchType) {
case SEARCH:
case NONE:
setMarker(motionEvent);
break;
}
}
public void setFollowMapViewPoint(boolean isFollow) {
this.mFollowMapGetCenterPoint = isFollow;
}
/**
* @param locationImage int(资源ID)-定位图片
*/
public void setLocationImage(int locationImage) {
mLocationIv.setImageDrawable(getResources().getDrawable(locationImage));
}
/**
* @param importImage int(资源ID)-导入图片
*/
public void setImportImage(int importImage) {
mImportIv.setImageDrawable(getResources().getDrawable(importImage));
}
/**
* @param centerLocationImage int(资源ID)-中心位置图片
*/
public void setCenterLocationImage(int centerLocationImage) {
mCenterLocationImage = centerLocationImage > 0 ? centerLocationImage : R.drawable.icon_local_location;
}
/**
* @param labelLocationNormalImage int(资源ID)-标记位置正常图片
*/
public void setLabelLocationNormalImage(int labelLocationNormalImage) {
mLabelLocationNormalImage = labelLocationNormalImage > 0 ? labelLocationNormalImage : R.drawable.icon_label_location_normal;
}
/**
* @param labelLocationSelectedImage int(资源ID)-标记位置选中图片
*/
public void setLabelLocationSelectedImage(int labelLocationSelectedImage) {
mLabelLocationSelectedImage = labelLocationSelectedImage > 0 ? labelLocationSelectedImage : R.drawable.icon_label_location_selected;
}
public CalloutStyleBuilder getCalloutStyleBuilder() {
return mCalloutStyleBuilder;
}
/**
* @param showMap 是否显示地图,默认显示
*/
public void setShowMap(boolean showMap) {
isShowMap = showMap;
}
/**
* @param showLoading 是否显示请求加载框,默认显示
*/
public void setShowLoading(boolean showLoading) {
isShowLoading = showLoading;
}
protected void showDialog() {
if (isShowLoading) {
try {
if (myDialog != null && myDialog.isShowing()) {
myDialog.dismiss();
}
myDialog = new ProgressDialog(mContext);
myDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
myDialog.setMessage("正在加载...");
myDialog.setIndeterminate(false);
myDialog.setCancelable(false);
myDialog.show();
} catch (Exception e) {
}
}
}
/**
* 关闭
*/
protected void disDialog() {
try {
if (myDialog != null && myDialog.isShowing()) {
myDialog.dismiss();
}
myDialog = null;
} catch (Exception e) {
}
}
/**
* @param distance 默认逆地理编码距离是0.1,单位是km;
* 需要在最上层调用
*/
public void setGeoDistance(double distance) {
this.distance = distance;
}
/**
* 正常点击显示加载狂,显示气泡组件
*
* @param point 坐标点
* @param what 标志位
*/
private void requestGeoCeoder(Point point, Variable.LocationChangeType locationChangeType, int what) {
requestGeoCeoder(point, locationChangeType, what, true, true);
}
/**
* 天地图逆地址编码
* 当导入数据得时候,不显示加载框,不显示气泡组件
*
* @param point 当前点位
* @param what 标志位
* @param isLoading 加载框
* @param showCallout 气泡
*/
private void requestGeoCeoder(Point point, Variable.LocationChangeType locationChangeType, int what, boolean isLoading, boolean showCallout) {
if (isLoading) {
showDialog();
}
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("lnglat",point.getX()+","+point.getY());
jsonObject.put("ak","93e478f664404c448b2bbe37ba35161c9");
} catch (JSONException e) {
e.printStackTrace();
}
// Log.e("GEOCeoder========",jsonObject.toString());
OkHttpUtil.doPost(Constants.BASE_GEO_URL, jsonObject.toString(), new Callback() {
@Override
public void onFailure(Call call, IOException e) {
disDialog();
Log.e("Fail", "e=" + e.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
disDialog();
String address = null;
String poi = null;
if (response.isSuccessful()) {
if (response.body() != null) {
String responseStr = response.body().string();
// Log.e("responseStr", responseStr);
JsonObject jsonObject = GsonUtil.gsonToBean(responseStr, JsonObject.class);
int status = jsonObject.get("status").getAsInt();
if (status == 200) {
JsonArray dataArray = jsonObject.get("data").getAsJsonArray();
if (dataArray != null && dataArray.size() > 0) {
JsonObject jsonObject1 = (JsonObject) dataArray.get(0);
address = jsonObject1.get("name").getAsString();
if(jsonObject1.get("pois").isJsonObject()){
poi = jsonObject1.get("pois").getAsJsonObject().get("name").getAsString();
}else{
poi = jsonObject1.get("name").getAsString();
}
}
}
}
}
Message message = Message.obtain();
message.obj = new LocationModel(point.getX(), point.getY(), address, poi, null, locationChangeType);
message.what = what;
message.arg1 = showCallout ? 0 : 1;
mHandler.sendMessage(message);
}
});
/**************天地图的逆地址编码**************************/
// String urlParams = Constants.BASE_TIANDITU_GEO_URL + "?postStr={'lon':" + point.getX() + ",'lat':" + point.getY() + ",'ver':1}&type=geocode&tk=" + Constants.BASE_TIANDITU_KEY;
// OkHttpUtil.doGet(urlParams, new Callback() {
// @Override
// public void onFailure(Call call, IOException e) {
// disDialog();
// }
//
// @Override
// public void onResponse(Call call, Response response) throws IOException {
// disDialog();
// String address = null;
// String poi = null;
// if (response.isSuccessful()) {
// if (response.body() != null) {
// String responseString = response.body().string();
// JsonObject jsonObject = GsonUtil.gsonToBean(responseString, JsonObject.class);
// String status = jsonObject.get("status").getAsString();
// if (status.equals("0")) {
// JsonObject resultObject = jsonObject.get("result").getAsJsonObject();
// address = resultObject.get("formatted_address").getAsString();
// JsonObject addressComponentObject = resultObject.get("addressComponent").getAsJsonObject();
//// address = addressComponentObject.get("address").getAsString();
// poi = addressComponentObject.get("poi").getAsString();
// }
// }
// }
//
// Message message = Message.obtain();
//// message.obj = new LocationModel(point.getX(), point.getY(), address, poi, null, locationChangeType);
// message.obj = new LocationModel(point.getX() + Math.random() * (1 - 9), point.getY() + Math.random() * (1 - 9), address, poi, null, locationChangeType);
// message.what = what;
// message.arg1 = showCallout ? 0 : 1;
// mHandler.sendMessage(message);
// }
// });
}
@SuppressLint("HandlerLeak")
Handler mHandler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
LocationModel locationModel = (LocationModel) msg.obj;
locationModel.setPoiData(true);
switch (msg.what) {
case FLAG_START_LOCATION:
if (mILocationChangeListener != null) {
mILocationChangeListener.locationCallBack(locationModel);
}
break;
case FLAG_CREATE_MARKER:
locationModelList.add(locationModel);
setCallout(mCenteredGraphic, locationModel.getAddress(), locationModel.getPoi(), msg.arg1 == 0);
if (mILocationChangeListener != null) {
mILocationChangeListener.locationCallBack(locationModel);
}
break;
}
}
};
public static class CalloutStyleBuilder {
/**
* {@link Context}
*/
private Context mContext;
/**
* callout最大宽度
*/
private int mCalloutMaxWidth;
/**
* callout最大高度
*/
private int mCalloutMaxHeight = -1;
/**
* callout最小宽度
*/
private int mCalloutMinWidth;
/**
* callout最小高度
*/
private int mCalloutMinHeight = -1;
/**
* callout背景色
*/
private int mCalloutBackgroundColor;
/**
* callout圆角半径
*/
private int mCalloutCornerRadius;
/**
* callout边框宽度
*/
private int mCalloutBorderWidth;
/**
* callout边框颜色
*/
private int mCalloutBorderColor;
/**
* callout指示器长度
*/
private int mCalloutLeaderLength = -1;
/**
* callout指示器宽度
*/
private int mCalloutLeaderWidth = -1;
/**
* callout指示器位置
*/
private Callout.Style.LeaderPosition mLeaderPosition;
CalloutStyleBuilder(Context context) {
this.mContext = context;
this.mCalloutMaxWidth = (int) (ToolUtil.getScreenWidth(mContext) * 0.9);
this.mCalloutMinWidth = (int) (ToolUtil.getScreenWidth(mContext) * 0.9);
this.mCalloutBackgroundColor = R.color.colorWhiteTras;
this.mCalloutCornerRadius = 5;
this.mCalloutBorderWidth = 1;
this.mCalloutBorderColor = R.color.color_13227A;
this.mLeaderPosition = Callout.Style.LeaderPosition.LOWER_MIDDLE;
}
/**
* @param width callout最大宽度
*/
public void setCalloutMaxWidth(int width) {
this.mCalloutMaxWidth = width;
}
/**
* @param height callout最大高度
*/
public void setCalloutMaxHeight(int height) {
this.mCalloutMaxHeight = height;
}
/**
* @param width callout最小宽度
*/
public void setCalloutMinWidth(int width) {
this.mCalloutMinWidth = width;
}
/**
* @param height callout最小高度
*/
public void setCalloutMinHeight(int height) {
this.mCalloutMinHeight = height;
}
/**
* @param colorResId callout背景色,资源ID
*/
public void setCalloutBackgroundColor(int colorResId) {
this.mCalloutBackgroundColor = colorResId;
}
/**
* @param cornerRadius callout圆角半径
*/
public void setCalloutCornerRadius(int cornerRadius) {
this.mCalloutCornerRadius = cornerRadius;
}
/**
* @param borderWidth callout边框宽度
*/
public void setCalloutBorderWidth(int borderWidth) {
this.mCalloutBorderWidth = borderWidth;
}
/**
* @param colorResId callout边框颜色,资源ID
*/
public void setCalloutBorderColor(int colorResId) {
this.mCalloutBorderColor = colorResId;
}
/**
* @param leaderLength callout指示器长度
*/
public void setCalloutLeaderLength(int leaderLength) {
this.mCalloutLeaderLength = leaderLength;
}
/**
* @param leaderWidth callout指示器宽度
*/
public void setCalloutLeaderWidth(int leaderWidth) {
this.mCalloutLeaderWidth = leaderWidth;
}
/**
* @param position callout指示器位置
*/
public void setCalloutLeaderPosition(Variable.CalloutLeaderPosition position) {
if (position == Variable.CalloutLeaderPosition.DEFAULT) {
this.mLeaderPosition = Callout.Style.LeaderPosition.LOWER_MIDDLE;
} else if (position == Variable.CalloutLeaderPosition.AUTO) {
this.mLeaderPosition = Callout.Style.LeaderPosition.AUTOMATIC;
}
}
}
public CalloutContentBuilder getCalloutContentBuilder() {
return mCalloutContentBuilder;
}
public static class CalloutContentBuilder {
/**
* x点字体颜色
*/
private int mXPointFontColor = -1;
/**
* x点字体大小
*/
private int mXPointFontSize = -1;
/**
* x点隐藏
*/
private boolean mXPointHide = false;
/**
* y点字体颜色
*/
private int mYPointFontColor = -1;
/**
* y点字体大小
*/
private int mYPointFontSize = -1;
/**
* y点隐藏
*/
private boolean mYPointHide = false;
/**
* 地址字体颜色
*/
private int mAddressFontColor = -1;
/**
* 地址字体大小
*/
private int mAddressFontSize = -1;
/**
* 地址隐藏
*/
private boolean mAddressHide = false;
/**
* poi字体颜色
*/
private int mPoiFontColor = -1;
/**
* poi字体大小
*/
private int mPoiFontSize = -1;
/**
* poi隐藏
*/
private boolean mPoiHide = false;
/**
* 右边信息图标
*/
private int mInfoImage = -1;
/**
* 右边信息图标隐藏
*/
private boolean mInfoImageHide = false;
/**
* 右边删除背景
*/
private int mDelBackground = -1;
/**
* 右边删除字体颜色
*/
private int mDelFontColor = -1;
/**
* 右边删除字体大小
*/
private int mDelFontSize = -1;
/**
* 右边删除隐藏
*/
private boolean mDelHide = true;
/**
* 补充信息label字体颜色
*/
private int mDescLabelFontColor = -1;
/**
* 补充信息label字体大小
*/
private int mDescLabelFontSize = -1;
/**
* 补充信息字体颜色
*/
private int mDescFontColor = -1;
/**
* 补充信息字体大小
*/
private int mDescFontSize = -1;
/**
* 补充信息背景
*/
private int mDescBackground = -1;
/**
* 补充信息隐藏
*/
private boolean mDescHide = false;
/**
* 取消字体颜色
*/
private int mCancelFontColor = -1;
/**
* 取消字体大小
*/
private int mCancelFontSize = -1;
/**
* 取消背景
*/
private int mCancelBackground = -1;
/**
* 取消隐藏
*/
private boolean mCancelHide = false;
/**
* 确定字体颜色
*/
private int mOkFontColor = -1;
/**
* 确定字体大小
*/
private int mOkFontSize = -1;
/**
* 确定背景
*/
private int mOkBackground = -1;
/**
* 确定隐藏
*/
private boolean mOkHide = false;
/**
* @param mXPointFontColor x点字体颜色
*/
public void setmXPointFontColor(int mXPointFontColor) {
this.mXPointFontColor = mXPointFontColor;
}
/**
* @param mXPointFontSize x点字体大小
*/
public void setmXPointFontSize(int mXPointFontSize) {
this.mXPointFontSize = mXPointFontSize;
}
/**
* @param mXPointHide x点隐藏
*/
public void setmXPointHide(boolean mXPointHide) {
this.mXPointHide = mXPointHide;
}
/**
* @param mYPointFontColor y点字体颜色
*/
public void setmYPointFontColor(int mYPointFontColor) {
this.mYPointFontColor = mYPointFontColor;
}
/**
* @param mYPointFontSize y点字体大小
*/
public void setmYPointFontSize(int mYPointFontSize) {
this.mYPointFontSize = mYPointFontSize;
}
/**
* @param mYPointHide y点隐藏
*/
public void setmYPointHide(boolean mYPointHide) {
this.mYPointHide = mYPointHide;
}
/**
* @param mAddressFontColor 地址字体颜色
*/
public void setmAddressFontColor(int mAddressFontColor) {
this.mAddressFontColor = mAddressFontColor;
}
/**
* @param mAddressFontSize 地址字体大小
*/
public void setmAddressFontSize(int mAddressFontSize) {
this.mAddressFontSize = mAddressFontSize;
}
/**
* @param mAddressHide 地址隐藏
*/
public void setmAddresstHide(boolean mAddressHide) {
this.mAddressHide = mAddressHide;
}
/**
* @param mPoiFontColor Poi字体颜色
*/
public void setmPoiFontColor(int mPoiFontColor) {
this.mPoiFontColor = mPoiFontColor;
}
/**
* @param mPoiFontSize Poi字体大小
*/
public void setmPoiFontSize(int mPoiFontSize) {
this.mPoiFontSize = mPoiFontSize;
}
/**
* @param mPoiHide Poi隐藏
*/
public void setmPoiHide(boolean mPoiHide) {
this.mPoiHide = mPoiHide;
}
/**
* @param mInfoImage 右边信息图标
*/
public void setmInfoImage(int mInfoImage) {
this.mInfoImage = mInfoImage;
}
/**
* @param mInfoImageHide 右边信息图标隐藏
*/
public void setmInfoImageHide(boolean mInfoImageHide) {
this.mInfoImageHide = mInfoImageHide;
}
/**
* @param mDelBackground 右边删除背景
*/
public void setmDelBackground(int mDelBackground) {
this.mDelBackground = mDelBackground;
}
/**
* @param mDelFontColor 右边删除字体颜色
*/
public void setmDelFontColor(int mDelFontColor) {
this.mDelFontColor = mDelFontColor;
}
/**
* @param mDelFontSize 右边删除字体大小
*/
public void setmDelFontSize(int mDelFontSize) {
this.mDelFontSize = mDelFontSize;
}
/**
* @param mDelHide 右边删除隐藏
*/
public void setmDelHide(boolean mDelHide) {
this.mDelHide = mDelHide;
}
/**
* @param mDescLabelFontColor 补充信息label字体颜色
*/
public void setmDescLabelFontColor(int mDescLabelFontColor) {
this.mDescLabelFontColor = mDescLabelFontColor;
}
/**
* @param mDescLabelFontSize 补充信息label字体大小
*/
public void setmDescLabelFontSize(int mDescLabelFontSize) {
this.mDescLabelFontSize = mDescLabelFontSize;
}
/**
* @param mDescFontColor 补充信息字体颜色
*/
public void setmDescFontColor(int mDescFontColor) {
this.mDescFontColor = mDescFontColor;
}
/**
* @param mDescFontSize 补充信息字体大小
*/
public void setmDescFontSize(int mDescFontSize) {
this.mDescFontSize = mDescFontSize;
}
/**
* @param mDescBackground 补充信息背景
*/
public void setmDescBackground(int mDescBackground) {
this.mDescBackground = mDescBackground;
}
/**
* @param mDescHide 补充信息隐藏
*/
public void setmDescHide(boolean mDescHide) {
this.mDescHide = mDescHide;
}
/**
* @param mCancelFontColor 取消按钮字体颜色
*/
public void setmCancelFontColor(int mCancelFontColor) {
this.mCancelFontColor = mCancelFontColor;
}
/**
* @param mCancelFontSize 取消按钮字体大小
*/
public void setmCancelFontSize(int mCancelFontSize) {
this.mCancelFontSize = mCancelFontSize;
}
/**
* @param mCancelBackground 取消按钮背景
*/
public void setmCancelBackground(int mCancelBackground) {
this.mCancelBackground = mCancelBackground;
}
/**
* @param mCancelHide 取消按钮隐藏
*/
public void setmCancelHide(boolean mCancelHide) {
this.mCancelHide = mCancelHide;
}
/**
* @param mOkFontColor 确定按钮字体颜色
*/
public void setmOkFontColor(int mOkFontColor) {
this.mOkFontColor = mOkFontColor;
}
/**
* @param mOkFontSize 确定按钮字体大小
*/
public void setmOkFontSize(int mOkFontSize) {
this.mOkFontSize = mOkFontSize;
}
/**
* @param mOkBackground 确定按钮背景
*/
public void setmOkBackground(int mOkBackground) {
this.mOkBackground = mOkBackground;
}
/**
* @param mOkHide 确定按钮隐藏
*/
public void setmOkHide(boolean mOkHide) {
this.mOkHide = mOkHide;
}
}
}
package cn.com.founder.arcgislib.nonavi.view;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import cn.com.founder.arcgislib.nonavi.R;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.compass.listener.IOnClickListener;
import cn.com.founder.arcgislib.nonavi.compass.listener.IRotationListener;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/8 10:17
* EMail:luo_shaopeng@founder.com.cn
* Description:罗盘
*/
public class ArcGisMapCompassView extends LinearLayout implements View.OnClickListener, ArcGisMapView.MyTouchCompassListener {
/**
* 罗盘根布局
*/
private LinearLayout mCompassTotalLayout;
/**
* 罗盘图片
*/
private ImageView mCompassIv;
/**
* {@link ArcGisMapView}
*/
private ArcGisMapView mArcGisMapView;
/**
* {@link IOnClickListener}
*/
private IOnClickListener mIOnClickListener;
/**
* 罗盘旋转监听
*/
private IRotationListener mIRotationListener;
/**
* 是否显示罗盘
*/
private boolean isShowCompass = true;
@SuppressLint("ClickableViewAccessibility")
public ArcGisMapCompassView(Context context, ArcGisMapView arcGisMapView) {
this(context);
this.mArcGisMapView = arcGisMapView;
mArcGisMapView.setMyTouchCompassListener(this);
}
private ArcGisMapCompassView(Context context) {
this(context, null, 0);
}
private ArcGisMapCompassView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
private ArcGisMapCompassView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inflate(context, R.layout.layout_compass, this);
mCompassTotalLayout = findViewById(R.id.compasss_layout);
mCompassIv = findViewById(R.id.compasss_iv);
mCompassIv.setOnClickListener(this);
}
/**
* @param isShow boolean-是否显示罗盘布局
* 默认显示
*/
public void setShowCompassLayout(boolean isShow) {
isShowCompass = isShow;
if (isShow) {
mCompassTotalLayout.setVisibility(VISIBLE);
} else {
mCompassTotalLayout.setVisibility(GONE);
}
}
/**
* @param location {@link Variable.ViewLocation } CompassView显示位置
*/
public void setCompassViewLocation(Variable.ViewLocation location) {
switch (location) {
case LEFT_TOP:
mCompassTotalLayout.setGravity(Gravity.LEFT | Gravity.TOP);
break;
case RIGHT_TOP:
mCompassTotalLayout.setGravity(Gravity.RIGHT | Gravity.TOP);
break;
case CENTER:
mCompassTotalLayout.setGravity(Gravity.CENTER);
break;
case LEFT_BOTTOM:
mCompassTotalLayout.setGravity(Gravity.LEFT | Gravity.BOTTOM);
break;
case RIGHT_BOTTOM:
mCompassTotalLayout.setGravity(Gravity.RIGHT | Gravity.BOTTOM);
break;
}
}
/**
* @param compassImage int(资源ID)-罗盘图片
*/
public void setCompassImage(int compassImage) {
mCompassIv.setImageDrawable(getResources().getDrawable(compassImage));
}
public void setIOnClik(IOnClickListener iOnClickListener){
this.mIOnClickListener = iOnClickListener;
}
/**
* @param iRotationListener 地图旋转监听
*/
public void setIRotationListener(IRotationListener iRotationListener) {
this.mIRotationListener = iRotationListener;
}
@Override
public void onClick(View view) {
this.setVisibility(View.GONE);
mArcGisMapView.getMapView().setViewpointRotationAsync(0);
if(mIOnClickListener != null){
mIOnClickListener.onClick(view);
}
}
@Override
public void onUp(Variable.TouchUp touchUp, MotionEvent motionEvent) {
if(touchUp == Variable.TouchUp.RORATE){
if(mIRotationListener != null){
mIRotationListener.iRotationAngleListener();
}
}
}
@Override
public void onRotate(double rotationAngle) {
if(isShowCompass){
if (rotationAngle != 0){
mCompassTotalLayout.setVisibility(View.VISIBLE);
mCompassIv.setRotation(-(float) rotationAngle);
postInvalidate();
}else{
mCompassTotalLayout.setVisibility(View.GONE);
}
}
}
}
\ No newline at end of file
package cn.com.founder.arcgislib.nonavi.view;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import com.esri.arcgisruntime.ArcGISRuntimeEnvironment;
import com.esri.arcgisruntime.geometry.Envelope;
import com.esri.arcgisruntime.geometry.SpatialReference;
import com.esri.arcgisruntime.layers.ArcGISTiledLayer;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.Viewpoint;
import com.esri.arcgisruntime.mapping.view.BackgroundGrid;
import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.mapping.view.WrapAroundMode;
import cn.com.founder.arcgislib.nonavi.R;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.constants.Constants;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 14:11
* EMail:luo_shaopeng@founder.com.cn
* Description:地图封装
*/
public class ArcGisMapView extends LinearLayout {
/**
* MapView
*/
private MapView mMapView;
/**
* 地图操作图层(点,线,面)
*/
private GraphicsOverlay mLocationGraphicsOverlay;
/**
* 搜索地图操作图层(点)
*/
private GraphicsOverlay mSearchGraphicsOverlay;
/**
* 导航地图操作图层(点,线)
*/
private GraphicsOverlay mNaviGraphicsOverlay;
/**
* 导航地图操作图层(点)
*/
private GraphicsOverlay mRouteMarkerGraphicsOverlay;
/**
* 聚合地图操作图层(点)
*/
private GraphicsOverlay mClusterGraphicsOverlay;
/**
* 长按事件拦截
*/
private MotionEvent mLongPressEvent;
/**
* 旋转事件拦截
*/
private MotionEvent mRotateEvent;
public ArcGisMapView(Context context) {
this(context, null);
}
public ArcGisMapView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public ArcGisMapView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//arcgis 开发者证书
ArcGISRuntimeEnvironment.setLicense(Constants.BASE_MAP_RUNTIME);
inflate(context, R.layout.layout_arc_gis_map, this);
mMapView = findViewById(R.id.founder_arc_gis_mapview);
createMap();
}
/**
* 创建地图
*/
@SuppressLint("ClickableViewAccessibility")
private void createMap() {
//网络图层地址
ArcGISTiledLayer arcGISTiledLayer = new ArcGISTiledLayer(Constants.BASE_MAP_SERVER_URL);
Basemap basemap = new Basemap(arcGISTiledLayer);
ArcGISMap arcGISMap = new ArcGISMap(basemap);
// //最大缩放级别
// arcGISMap.setMaxScale(8);
//去掉水印
mMapView.setAttributionTextVisible(false);
BackgroundGrid mainBackgroundGrid = new BackgroundGrid();
mMapView.setBackgroundGrid(mainBackgroundGrid);
Envelope envelope = new Envelope(67.8515625, 1.58203125, 139.306640625, 56.337890625, SpatialReference.create(4326));
mMapView.setViewpoint(new Viewpoint(envelope));
mMapView.setMap(arcGISMap);
//查看地图时,无缝延展地图
mMapView.setWrapAroundMode(WrapAroundMode.ENABLE_WHEN_SUPPORTED);
// 长按放大镜可用
mMapView.setMagnifierEnabled(true);
addLocationGraphicLayers();
addSearchGraphicLayers();
addRouteMarkerGraphicLayers();
addClusterGraphicLayers();
mLongPressEvent = null;
mMapView.setOnTouchListener(new ArcGisMapView.MapTouchListener(getContext().getApplicationContext(), mMapView));
mMapView.addViewpointChangedListener(visibleAreaChangedEvent -> {
if (myTouchCompassListener != null) {
myTouchCompassListener.onRotate(((MapView) visibleAreaChangedEvent.getSource()).getMapRotation());
}
});
}
private void addLocationGraphicLayers() {
// Add location layer
if (mLocationGraphicsOverlay == null) {
mLocationGraphicsOverlay = new GraphicsOverlay();
}
mLocationGraphicsOverlay.setOpacity(0.8f);
mMapView.getGraphicsOverlays().add(mLocationGraphicsOverlay);
}
private void addSearchGraphicLayers() {
// Add location layer
if (mSearchGraphicsOverlay == null) {
mSearchGraphicsOverlay = new GraphicsOverlay();
}
mSearchGraphicsOverlay.setOpacity(0.8f);
mMapView.getGraphicsOverlays().add(mSearchGraphicsOverlay);
}
private void addNaviGraphicLayers() {
// Add location layer
if (mNaviGraphicsOverlay == null) {
mNaviGraphicsOverlay = new GraphicsOverlay();
}
mNaviGraphicsOverlay.setOpacity(0.8f);
mMapView.getGraphicsOverlays().add(mNaviGraphicsOverlay);
}
private void addRouteMarkerGraphicLayers() {
// Add location layer
if (mRouteMarkerGraphicsOverlay == null) {
mRouteMarkerGraphicsOverlay = new GraphicsOverlay();
}
mRouteMarkerGraphicsOverlay.setOpacity(0.8f);
mMapView.getGraphicsOverlays().add(mRouteMarkerGraphicsOverlay);
}
private void addClusterGraphicLayers() {
// Add location layer
if (mClusterGraphicsOverlay == null) {
mClusterGraphicsOverlay = new GraphicsOverlay();
}
mClusterGraphicsOverlay.setOpacity(0.8f);
mMapView.getGraphicsOverlays().add(mClusterGraphicsOverlay);
}
protected MapView getMapView() {
return mMapView;
}
protected GraphicsOverlay getLocationGraphicsOverlay() {
return mLocationGraphicsOverlay;
}
protected GraphicsOverlay getSearchGraphicsOverlay() {
return mSearchGraphicsOverlay;
}
protected GraphicsOverlay getNaviGraphicsOverlay() {
return mSearchGraphicsOverlay;
}
protected GraphicsOverlay getRouteMarkerGraphicsOverlay() {
return mRouteMarkerGraphicsOverlay;
}
protected GraphicsOverlay getClusterGraphicsOverlay(){
return mClusterGraphicsOverlay;
}
private class MapTouchListener extends DefaultMapViewOnTouchListener {
/**
* Instantiates a new DrawingMapViewOnTouchListener with the specified
* context and MapView.
*
* @param context the application context from which to get the display
* metrics
* @param mapView the MapView on which to control touch events
*/
MapTouchListener(Context context, MapView mapView) {
super(context, mapView);
}
@Override
public boolean onUp(MotionEvent motionEvent) {
if (myTouchLocationListener != null) {
if (mLongPressEvent != null) {
mLongPressEvent = null;
myTouchLocationListener.onUp(Variable.TouchUp.LONG_PRESS, motionEvent);
} else {
myTouchLocationListener.onUp(Variable.TouchUp.UP, motionEvent);
}
}
if (myTouchClusterListener != null) {
myTouchLocationListener.onUp(Variable.TouchUp.UP, motionEvent);
}
if (mRotateEvent != null && myTouchCompassListener != null) {
mRotateEvent = null;
myTouchCompassListener.onUp(Variable.TouchUp.RORATE, motionEvent);
}
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent motionEvent) {
if (myTouchLocationListener != null) {
myTouchLocationListener.onSingleTap(motionEvent);
}
if (myTouchClusterListener != null) {
myTouchClusterListener.onSingleTap(motionEvent);
}
return super.onSingleTapConfirmed(motionEvent);
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
if (myTouchDrawListener != null) {
myTouchDrawListener.onMapSingleTapUp(e);
}
return super.onSingleTapUp(e);
}
@Override
public void onLongPress(MotionEvent motionEvent) {
super.onLongPress(motionEvent);
mLongPressEvent = motionEvent;
if (myTouchLocationListener != null) {
myTouchLocationListener.onLongPress(motionEvent);
}
}
@Override
public boolean onRotate(MotionEvent motionEvent, double rotationAngle) {
super.onRotate(motionEvent, rotationAngle);
mRotateEvent = motionEvent;
if (myTouchCompassListener != null) {
myTouchCompassListener.onRotate(mMapView.getMapRotation());
}
return true;
}
}
private MyTouchLocationListener myTouchLocationListener;
private MyTouchCompassListener myTouchCompassListener;
private MyTouchClusterListener myTouchClusterListener;
private MyTouchDrawListener myTouchDrawListener;
protected void setMyTouchLocationListener(MyTouchLocationListener touchListener) {
this.myTouchLocationListener = touchListener;
}
protected void setMyTouchCompassListener(MyTouchCompassListener touchListener) {
this.myTouchCompassListener = touchListener;
}
protected void setMyTouchClusterListener(MyTouchClusterListener touchListener) {
this.myTouchClusterListener = touchListener;
}
protected void setMyTouchDrawListener(MyTouchDrawListener touchListener) {
this.myTouchDrawListener = touchListener;
}
/**
* 位置触摸监听类
*/
interface MyTouchLocationListener {
/**
* 手指抬起时
*
* @param touchUp {@link Variable.TouchUp}
* @param motionEvent 移动事件
*/
void onUp(Variable.TouchUp touchUp, MotionEvent motionEvent);
/**
* 单击
*
* @param motionEvent 移动事件
*/
void onSingleTap(MotionEvent motionEvent);
/**
* 长按
*
* @param motionEvent 移动事件
*/
void onLongPress(MotionEvent motionEvent);
}
/**
* 罗盘触摸监听类
*/
interface MyTouchCompassListener {
/**
* 手指抬起时
*
* @param touchUp {@link Variable.TouchUp}
* @param motionEvent 移动事件
*/
void onUp(Variable.TouchUp touchUp, MotionEvent motionEvent);
/**
* 旋转
*
* @param rotationAngle 旋转角度
*/
void onRotate(double rotationAngle);
}
/**
* 聚合触摸监听类
*/
interface MyTouchClusterListener {
/**
* 手指抬起时
*
* @param touchUp {@link Variable.TouchUp}
* @param motionEvent 移动事件
*/
void onUp(Variable.TouchUp touchUp, MotionEvent motionEvent);
/**
* 单击
*
* @param motionEvent 移动事件
*/
void onSingleTap(MotionEvent motionEvent);
}
/**
* 绘制触摸监听类
*/
interface MyTouchDrawListener {
/**
* 单击并抬起
*
* @param motionEvent 移动事件
*/
void onMapSingleTapUp(MotionEvent motionEvent);
}
}
package cn.com.founder.arcgislib.nonavi.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.esri.arcgisruntime.mapping.view.MapView;
import cn.com.founder.arcgislib.nonavi.R;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.utils.ToolUtil;
import cn.com.founder.arcgislib.nonavi.zoom.listener.IZoomClickListener;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:55
* EMail:luo_shaopeng@founder.com.cn
* Description:自定义缩放view
*/
public class ArcGisMapZoomView extends LinearLayout implements View.OnClickListener {
/**
* 根布局
*/
private LinearLayout mZoomTotalLayout;
/**
* 父布局
*/
private LinearLayout mZoomContentLayout;
/**
* 放大布局
*/
private LinearLayout mZoomInLayout;
/**
* 放大图片
*/
private ImageView mZoomInImage;
/**
* 放大文字
*/
private TextView mZoomInTextView;
/**
* 水平分割线
*/
private TextView mSpliteLineHor;
/**
* 垂直分割线
*/
private TextView mSpliteLineVer;
/**
* 缩小布局
*/
private LinearLayout mZoomOutLayout;
/**
* 缩小图片
*/
private ImageView mZoomOutImage;
/**
* 缩小文字
*/
private TextView mZoomOutTextView;
/**
* 放大倍数
*/
private double zoomInNum = 2;
/**
* 缩小倍数
*/
private double zoomOutNum = 2;
/**
* 缩放控件点击事件监听
*/
private IZoomClickListener zoomClickListener;
/**
* MapView
*/
private MapView mMapView;
public ArcGisMapZoomView(Context context, MapView mapView) {
this(context);
this.mMapView = mapView;
}
private ArcGisMapZoomView(Context context) {
this(context, null, 0);
}
private ArcGisMapZoomView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
private ArcGisMapZoomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inflate(context, R.layout.layout_zoom, this);
initView();
}
/**
* 初始化view
*/
private void initView() {
mZoomTotalLayout = findViewById(R.id.zoom_total_layout);
mZoomContentLayout = findViewById(R.id.zoom_content_layout);
mZoomInLayout = findViewById(R.id.zoom_in_layout);
mZoomInImage = findViewById(R.id.zoom_in_iv);
mZoomInTextView = findViewById(R.id.zoom_in_tv);
mZoomOutLayout = findViewById(R.id.zoom_out_layout);
mZoomOutImage = findViewById(R.id.zoom_out_iv);
mZoomOutTextView = findViewById(R.id.zoom_out_tv);
mZoomInLayout.setOnClickListener(this);
mZoomOutLayout.setOnClickListener(this);
}
/**
* @param isShow boolean-是否显示缩放布局
* 默认显示
*/
public void setShowZoomLayout(boolean isShow) {
if (isShow) {
mZoomTotalLayout.setVisibility(VISIBLE);
mZoomContentLayout.setVisibility(VISIBLE);
} else {
mZoomTotalLayout.setVisibility(GONE);
mZoomContentLayout.setVisibility(GONE);
}
}
/**
* @param w int-缩放布局的宽度
* 默认wrap
*/
public void setZoomWidth(int w) {
mZoomInLayout.getLayoutParams().width = ToolUtil.valueToSp(getContext(), w);
mZoomOutLayout.getLayoutParams().width = ToolUtil.valueToSp(getContext(), w);
}
/**
* @param h int-缩放布局的高度
* 默认wrap
*/
public void setZoomHeight(int h) {
mZoomInLayout.getLayoutParams().height = ToolUtil.valueToSp(getContext(), h);
mZoomOutLayout.getLayoutParams().height = ToolUtil.valueToSp(getContext(), h);
}
/**
* @param bg int(资源ID)-缩放布局的背景
* 默认带阴影布局
*/
public void setZoomBackground(int bg) {
mZoomContentLayout.setBackground(getResources().getDrawable(bg));
}
/**
* @param horizontal boolean-缩放布局是否水平方向
* 默认垂直方向
*/
public void isHorizontal(boolean horizontal) {
if (horizontal) {
mZoomContentLayout.setOrientation(HORIZONTAL);
mSpliteLineVer.setVisibility(View.GONE);
mSpliteLineHor.setVisibility(View.VISIBLE);
} else {
mZoomContentLayout.setOrientation(VERTICAL);
mSpliteLineVer.setVisibility(View.VISIBLE);
mSpliteLineHor.setVisibility(View.GONE);
}
}
/**
* @param zoomInImage int(资源ID)-放大布局图片
*/
public void setZoomInImage(int zoomInImage) {
mZoomInImage.setImageDrawable(getResources().getDrawable(zoomInImage));
}
/**
* @param zoomOutImage int(资源ID)-缩小布局图片
*/
public void setZoomOutImage(int zoomOutImage) {
mZoomOutImage.setImageDrawable(getResources().getDrawable(zoomOutImage));
}
/**
* @param showText boolean-是否显示文字
* 默认显示
*/
public void setShowText(boolean showText) {
if (showText) {
mZoomInTextView.setVisibility(View.VISIBLE);
mZoomOutTextView.setVisibility(View.VISIBLE);
} else {
mZoomInTextView.setVisibility(View.GONE);
mZoomOutTextView.setVisibility(View.GONE);
}
}
/**
* @param zoomInText String-放大布局的文字
* 默认“放大”
*/
public void setZoomInText(String zoomInText) {
if (zoomInText == null) return;
mZoomInTextView.setText(zoomInText);
}
/**
* @param zoomOutText String-缩小布局的文字
* 默认“缩小”
*/
public void setZoomOutText(String zoomOutText) {
if (zoomOutText == null) return;
mZoomOutTextView.setText(zoomOutText);
}
/**
* @param fontSize int-缩放布局的文字大小
* 默认14sp
*/
public void setFontSize(int fontSize) {
mZoomInTextView.setTextSize(fontSize);
mZoomOutTextView.setTextSize(fontSize);
}
/**
* @param fontColor int-缩放布局的文字颜色
* 默认#333333
*/
public void setFontColor(int fontColor) {
int color = getResources().getColor(fontColor);
mZoomInTextView.setTextColor(color);
mZoomOutTextView.setTextColor(color);
}
/**
* @param num int-放大倍数
* 默认2
*/
public void setZoomInNum(int num) {
zoomInNum = num;
}
/**
* @param num int-缩小倍数
* 默认2
*/
public void setZoomOutNum(int num) {
zoomOutNum = num;
}
/**
* @param zoomClickListener 缩放事件监听
*/
public void setZoomClickListener(IZoomClickListener zoomClickListener) {
this.zoomClickListener = zoomClickListener;
}
/**
* @param location {@link Variable.ViewLocation }ZoomView显示位置
*/
public void setZoomViewLocation(Variable.ViewLocation location) {
switch (location) {
case LEFT_TOP:
mZoomTotalLayout.setGravity(Gravity.LEFT | Gravity.TOP);
break;
case RIGHT_TOP:
mZoomTotalLayout.setGravity(Gravity.RIGHT | Gravity.TOP);
break;
case CENTER:
mZoomTotalLayout.setGravity(Gravity.CENTER);
break;
case LEFT_BOTTOM:
default:
mZoomTotalLayout.setGravity(Gravity.LEFT | Gravity.BOTTOM);
}
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.zoom_in_layout) {
double scale = mMapView.getMapScale();
double currScale = scale * (1.0 / zoomInNum);
mMapView.setViewpointScaleAsync(currScale);
if (zoomClickListener != null) {
zoomClickListener.zoomInClick(view, currScale);
}
} else if (view.getId() == R.id.zoom_out_layout) {
double scale = mMapView.getMapScale();
double currScale = scale * zoomInNum;
mMapView.setViewpointScaleAsync(currScale);
if (zoomClickListener != null) {
zoomClickListener.zoomInClick(view, currScale);
}
}
}
}
package cn.com.founder.arcgislib.nonavi.view;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.view.ActionMode;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import cn.com.founder.arcgislib.nonavi.R;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.constants.Constants;
import cn.com.founder.arcgislib.nonavi.location.ArcGisLocation;
import cn.com.founder.arcgislib.nonavi.model.SearchModel;
import cn.com.founder.arcgislib.nonavi.search.listener.ISearchSelectedListener;
import cn.com.founder.arcgislib.nonavi.utils.GsonUtil;
import cn.com.founder.arcgislib.nonavi.utils.KeyboardUtil;
import cn.com.founder.arcgislib.nonavi.utils.OkHttpUtil;
import cn.com.founder.arcgislib.nonavi.utils.ToolUtil;
import cn.com.founder.arcgislib.nonavi.widget.popup.PopupLayout;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/1/18 09:47
* EMail:luo_shaopeng@founder.com.cn
* Description:搜索相关类
*/
public class ArcGisSearchView extends LinearLayout {
private static final String TAG = "ArcGisSearchView";
private final int HANDLE_MSG_NO_DATA = 0;
private final int HANDLE_MSG_HAS_DATA = 1;
protected static ArcGisSearchView instance;
/**
* {@link Context}
*/
private Context mContext;
/**
* {@link ArcGisLocation}
*/
private ArcGisLocationView arcGisLocationView;
/**
* 底部布局
*/
protected LinearLayout mBottomLayout;
private TextView mSearchResultTv;
/**
* popup
*/
protected PopupLayout searchPopupLayout;
/**
* 下拉框
*/
private LinearLayout mTypeLayout;
private TextView mTypeResultTv;
/**
* 搜索框
*/
protected EditText mSearchEt;
/**
* 搜索取消
*/
protected TextView mCancelTv;
/**
* 列表
*/
protected RecyclerView mRecyclerView;
/**
* 空布局
*/
protected LinearLayout mEmptyLayout;
/**
* 适配器
*/
private SearchAdapter mAdapter;
/**
* 适配器数据
*/
private List<SearchModel> resultList = new LinkedList<>();
/**
* 加载框
*/
protected ProgressDialog myDialog;
/**
* {@link ISearchSelectedListener}
*/
private ISearchSelectedListener searchSelectedListener;
protected Variable.SearchType currSearchType = Variable.SearchType.SEARCH;
/**
* 搜索类型,默认poi
*/
private int currentSpinnerType = 0;
private LinearLayout mSearchTypeLayout;
private TextView mPoiTv;
private TextView mDwTv;
private TextView mFwTv;
private TextView mDzTv;
public ArcGisSearchView(Context context, ArcGisLocationView locationView) {
this(context);
this.mContext = context;
this.arcGisLocationView = locationView;
setSearchPopupLayout();
}
private ArcGisSearchView(Context context) {
this(context, null, 0);
}
private ArcGisSearchView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
private ArcGisSearchView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inflate(context, R.layout.layout_search_new, this);
instance = this;
mBottomLayout = findViewById(R.id.search_total_ll);
mSearchResultTv = findViewById(R.id.search_result_tv);
initView();
}
private void initView() {
mBottomLayout.setOnClickListener(view -> {
searchPopupLayout.show(PopupLayout.POSITION_BOTTOM);
mSearchEt.requestFocus();
mSearchEt.setFocusableInTouchMode(true);
mSearchEt.setFocusable(true);
KeyboardUtil.showKeyboard(mSearchEt, true);
});
}
private void setSearchPopupLayout() {
View searchParentView = View.inflate(mContext, R.layout.layout_item_search, null);
initSearchView(searchParentView);
searchPopupLayout = new PopupLayout(mContext, searchParentView);
searchPopupLayout.setUseRadius(true);
searchPopupLayout.setHeight((int) (ToolUtil.getScreenHeight(mContext) * 0.7), false);
searchPopupLayout.setDismissListener(() -> {
mSearchEt.setFocusable(false);
mSearchEt.setFocusableInTouchMode(false);
KeyboardUtil.hideKeyboard(mSearchEt);
});
}
private void initSearchView(View searchParentView) {
mTypeLayout = searchParentView.findViewById(R.id.search_scroll_content_type_ll);
mTypeResultTv = searchParentView.findViewById(R.id.search_scroll_content_type_tv);
mSearchEt = searchParentView.findViewById(R.id.search_scroll_content_search_et);
mCancelTv = searchParentView.findViewById(R.id.search_scroll_content_search_cancel_search_tv);
mRecyclerView = searchParentView.findViewById(R.id.search_swipeRecyclerView);
mEmptyLayout = searchParentView.findViewById(R.id.search_empty);
mSearchTypeLayout = searchParentView.findViewById(R.id.search_type_ll);
mPoiTv = searchParentView.findViewById(R.id.search_type_poi_tv);
mDwTv = searchParentView.findViewById(R.id.search_type_dw_tv);
mFwTv = searchParentView.findViewById(R.id.search_type_fw_tv);
mDzTv = searchParentView.findViewById(R.id.search_type_dz_tv);
mCancelTv.setOnClickListener(view -> {
if (mCancelTv.getText().toString().equals("取消")) {
KeyboardUtil.hideKeyboard(mSearchEt);
searchPopupLayout.dismiss();
} else {
doSearchByKeyWord(mSearchEt.getText().toString().trim());
}
});
mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
mAdapter = new SearchAdapter(resultList);
mRecyclerView.setAdapter(mAdapter);
mTypeLayout.setOnClickListener(view ->{
if(mSearchTypeLayout.getVisibility() == View.VISIBLE){
mSearchTypeLayout.setVisibility(View.GONE);
}else{
mSearchTypeLayout.setVisibility(View.VISIBLE);
}
} );
disableCopyAndPaste(mSearchEt);
mSearchEt.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
return false;
}
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode actionMode) {
}
});
mSearchEt.setOnClickListener(view -> {
mSearchEt.requestFocus();
mSearchEt.setFocusableInTouchMode(true);
mSearchEt.setFocusable(true);
KeyboardUtil.showKeyboard(mSearchEt, true);
if (!searchPopupLayout.isShowing()) {
searchPopupLayout.show(PopupLayout.POSITION_BOTTOM);
}
});
mSearchEt.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_SEND || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN)) {
doSearchByKeyWord(mSearchEt.getText().toString().trim());
return true;
}
return false;
});
mSearchEt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
mSearchResultTv.setText(editable.toString().trim());
if (TextUtils.isEmpty(editable.toString().trim())) {
mCancelTv.setText("取消");
} else {
mCancelTv.setText("搜索");
}
}
});
iniTypeView();
}
private void iniTypeView() {
mPoiTv.setOnClickListener(view -> {
currentSpinnerType = 0;
mTypeResultTv.setText("POI");
mSearchTypeLayout.setVisibility(View.GONE);
});
mDwTv.setOnClickListener(view -> {
currentSpinnerType = 1;
mTypeResultTv.setText("实有单位");
mSearchTypeLayout.setVisibility(View.GONE);
});
mFwTv.setOnClickListener(view -> {
currentSpinnerType = 2;
mTypeResultTv.setText("实有房屋");
mSearchTypeLayout.setVisibility(View.GONE);
});
mDzTv.setOnClickListener(view -> {
currentSpinnerType = 3;
mTypeResultTv.setText("标准地址");
mSearchTypeLayout.setVisibility(View.GONE);
});
}
public void setSearchSelectedListener(ISearchSelectedListener listener) {
this.searchSelectedListener = listener;
}
protected void showDialog() {
try {
if (myDialog != null && myDialog.isShowing()) {
myDialog.dismiss();
}
myDialog = new ProgressDialog(mContext);
myDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
myDialog.setMessage("正在加载...");
myDialog.setIndeterminate(false);
myDialog.setCancelable(false);
myDialog.show();
} catch (Exception e) {
}
}
/**
* 关闭
*/
protected void disDialog() {
try {
if (myDialog != null && myDialog.isShowing()) {
myDialog.dismiss();
}
myDialog = null;
} catch (Exception e) {
}
}
/**
* @param type 搜索类型:0:poi,1:实有单位,2:实有房屋,3:标准地址
* @param keyWord 关键字
*/
public void setSearchData(int type, String keyWord) {
if (type > 3 || type < 0) {
Toast.makeText(mContext, "搜索类型错误,请检查类型设置", Toast.LENGTH_LONG).show();
return;
}
if (TextUtils.isEmpty(keyWord)) {
Toast.makeText(mContext, "请设置搜索关键字", Toast.LENGTH_LONG).show();
return;
}
currentSpinnerType = type;
mCancelTv.setVisibility(VISIBLE);
mCancelTv.setText("搜索");
mSearchEt.setText(keyWord);
mSearchEt.setSelection(keyWord.length());
searchPopupLayout.show(PopupLayout.POSITION_BOTTOM);
doSearchByKeyWord(keyWord);
}
@SuppressLint("HandlerLeak")
Handler mHandler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case HANDLE_MSG_NO_DATA:
resultList.clear();
mEmptyLayout.setVisibility(View.VISIBLE);
mRecyclerView.setVisibility(View.GONE);
mAdapter.notifyDataSetChanged();
break;
case HANDLE_MSG_HAS_DATA:
resultList.clear();
mEmptyLayout.setVisibility(View.GONE);
mRecyclerView.setVisibility(View.VISIBLE);
resultList.addAll((List<SearchModel>) msg.obj);
mAdapter.notifyDataSetChanged();
break;
default:
break;
}
}
};
private void doSearchByKeyWord(String keyWord) {
if (!ToolUtil.isNetWorkAvailable(mContext)) {
Toast.makeText(mContext, mContext.getString(R.string.string_net), Toast.LENGTH_LONG).show();
return;
}
if (TextUtils.isEmpty(keyWord)) {
mHandler.sendEmptyMessage(HANDLE_MSG_NO_DATA);
return;
}
KeyboardUtil.hideKeyboard(mSearchEt);
showDialog();
switch (currentSpinnerType) {
case 0://poi
requestPOIData(keyWord);
break;
case 1://实有单位
requestDwData(keyWord);
break;
case 2://实有房屋
requestFwData(keyWord);
break;
case 3://标准地址
requestDzData(keyWord);
break;
}
}
/**
* @param keyWord poi
*/
private void requestPOIData(String keyWord) {
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("poiname", keyWord);
} catch (JSONException e) {
e.printStackTrace();
}
String jsonParams = jsonObject.toString();
OkHttpUtil.doPost(Constants.BASE_SEARCH_URL, jsonParams, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
disDialog();
// Toast.makeText(mContext, "请求失败,请重试", Toast.LENGTH_LONG).show();
Log.e(TAG, "e=" + e.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
disDialog();
if (response.isSuccessful()) {
if (response.body() != null) {
String responseStr = response.body().string();
JsonObject jsonObject = GsonUtil.gsonToBean(responseStr, JsonObject.class);
int status = jsonObject.get("status").getAsInt();
if (status == 200) {
JsonArray dataArray = jsonObject.get("data").getAsJsonArray();
if (dataArray != null && dataArray.size() > 0) {
List<SearchModel> searchModelList = new LinkedList<>();
for (int i = 0; i < dataArray.size(); i++) {
JsonObject jsonObject1 = (JsonObject) dataArray.get(i);
SearchModel searchModel = new SearchModel();
searchModel.setX(jsonObject1.get("x").getAsDouble());
searchModel.setY(jsonObject1.get("y").getAsDouble());
searchModel.setPoiaddress(jsonObject1.get("poiaddress").getAsString());
searchModel.setPoiname(jsonObject1.get("poiname").getAsString());
searchModel.setPoiData(true);
searchModelList.add(searchModel);
}
if (searchModelList.size() > 0) {
Message message = new Message();
message.what = HANDLE_MSG_HAS_DATA;
message.obj = searchModelList;
mHandler.sendMessage(message);
} else {
mHandler.sendEmptyMessage(HANDLE_MSG_NO_DATA);
}
} else {
mHandler.sendEmptyMessage(HANDLE_MSG_NO_DATA);
}
} else {
mHandler.sendEmptyMessage(HANDLE_MSG_NO_DATA);
}
} else {
mHandler.sendEmptyMessage(HANDLE_MSG_NO_DATA);
}
} else {
mHandler.sendEmptyMessage(HANDLE_MSG_NO_DATA);
}
}
});
}
/**
* @param keyWord 单位
*/
private void requestDwData(String keyWord) {
OkHttpUtil.doPost(Constants.BASE_DW_URL, Objects.requireNonNull(ToolUtil.dongGuanSearchParams(keyWord)), new Callback() {
@Override
public void onFailure(Call call, IOException e) {
disDialog();
// Toast.makeText(mContext, "请求失败,请重试", Toast.LENGTH_LONG).show();
Log.e("Fail", "e=" + e.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
disDialog();
if (response.isSuccessful()) {
if (response.body() != null) {
String responseStr = response.body().string();
Log.e("responseStr", responseStr);
JsonObject jsonObject = GsonUtil.gsonToBean(responseStr, JsonObject.class);
int status = jsonObject.get("status").getAsInt();
if (status == 200) {
JsonArray dataArray = jsonObject.get("data").getAsJsonArray();
if (dataArray != null && dataArray.size() > 0) {
List<SearchModel> searchModelList = new ArrayList<>();
for (int i = 0; i < dataArray.size(); i++) {
JsonObject jsonObject1 = (JsonObject) dataArray.get(i);
SearchModel searchModel = new SearchModel();
searchModel.setX(jsonObject1.get("x").getAsDouble());
searchModel.setY(jsonObject1.get("y").getAsDouble());
searchModel.setPoiaddress(jsonObject1.get("dzqc").getAsString());
searchModel.setPoiname(jsonObject1.get("dwcszpmc").getAsString());
searchModel.setPoiData(false);
searchModelList.add(searchModel);
}
if (searchModelList.size() > 0) {
Message message = new Message();
message.what = HANDLE_MSG_HAS_DATA;
message.obj = searchModelList;
mHandler.sendMessage(message);
} else {
mHandler.sendEmptyMessage(HANDLE_MSG_NO_DATA);
}
} else {
mHandler.sendEmptyMessage(HANDLE_MSG_NO_DATA);
}
}
}
}
}
});
}
/**
* @param keyWord 房屋
*/
private void requestFwData(String keyWord) {
OkHttpUtil.doPost(Constants.BASE_FW_URL, Objects.requireNonNull(ToolUtil.dongGuanSearchParams(keyWord)), new Callback() {
@Override
public void onFailure(Call call, IOException e) {
disDialog();
// Toast.makeText(mContext, "请求失败,请重试", Toast.LENGTH_LONG).show();
Log.e("Fail", "e=" + e.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
disDialog();
if (response.isSuccessful()) {
if (response.body() != null) {
String responseStr = response.body().string();
Log.e("responseStr", responseStr);
JsonObject jsonObject = GsonUtil.gsonToBean(responseStr, JsonObject.class);
int status = jsonObject.get("status").getAsInt();
if (status == 200) {
JsonArray dataArray = jsonObject.get("data").getAsJsonArray();
if (dataArray != null && dataArray.size() > 0) {
List<SearchModel> searchModelList = new ArrayList<>();
for (int i = 0; i < dataArray.size(); i++) {
JsonObject jsonObject1 = (JsonObject) dataArray.get(i);
SearchModel searchModel = new SearchModel();
searchModel.setX(jsonObject1.get("x").getAsDouble());
searchModel.setY(jsonObject1.get("y").getAsDouble());
searchModel.setPoiaddress(jsonObject1.get("dzqc").getAsString());
searchModel.setPoiname(jsonObject1.get("fwmc").getAsString());
searchModel.setPoiData(false);
searchModelList.add(searchModel);
}
if (searchModelList.size() > 0) {
Message message = new Message();
message.what = HANDLE_MSG_HAS_DATA;
message.obj = searchModelList;
mHandler.sendMessage(message);
} else {
mHandler.sendEmptyMessage(HANDLE_MSG_NO_DATA);
}
} else {
mHandler.sendEmptyMessage(HANDLE_MSG_NO_DATA);
}
}
}
}
}
});
}
/**
* @param keyWord 地址
*/
private void requestDzData(String keyWord) {
OkHttpUtil.doPost(Constants.BASE_DZ_URL, Objects.requireNonNull(ToolUtil.dongGuanSearchParams(keyWord)), new Callback() {
@Override
public void onFailure(Call call, IOException e) {
disDialog();
// Toast.makeText(mContext, "请求失败,请重试", Toast.LENGTH_LONG).show();
Log.e("Fail", "e=" + e.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
disDialog();
if (response.isSuccessful()) {
if (response.body() != null) {
String responseStr = response.body().string();
Log.e("responseStr", responseStr);
JsonObject jsonObject = GsonUtil.gsonToBean(responseStr, JsonObject.class);
int status = jsonObject.get("status").getAsInt();
if (status == 200) {
JsonArray dataArray = jsonObject.get("data").getAsJsonArray();
if (dataArray != null && dataArray.size() > 0) {
List<SearchModel> searchModelList = new ArrayList<>();
for (int i = 0; i < dataArray.size(); i++) {
JsonObject jsonObject1 = (JsonObject) dataArray.get(i);
SearchModel searchModel = new SearchModel();
searchModel.setX(jsonObject1.get("x").getAsDouble());
searchModel.setY(jsonObject1.get("y").getAsDouble());
searchModel.setPoiaddress(jsonObject1.get("dzqc").getAsString());
searchModel.setPoiname(jsonObject1.get("dzxz").getAsString());
searchModel.setPoiData(false);
searchModelList.add(searchModel);
}
if (searchModelList.size() > 0) {
Message message = new Message();
message.what = HANDLE_MSG_HAS_DATA;
message.obj = searchModelList;
mHandler.sendMessage(message);
} else {
mHandler.sendEmptyMessage(HANDLE_MSG_NO_DATA);
}
} else {
mHandler.sendEmptyMessage(HANDLE_MSG_NO_DATA);
}
}
}
}
}
});
}
private void showAllView() {
if (ArcGisHotPotsView.instance != null) {
ArcGisHotPotsView.instance.mHotPotsIv.setVisibility(View.VISIBLE);
}
if (ArcGisClusterView.instance != null) {
ArcGisClusterView.instance.mClusterIv.setVisibility(View.VISIBLE);
}
}
private void hideAllView() {
if (ArcGisHotPotsView.instance != null) {
ArcGisHotPotsView.instance.mHotPotsIv.setVisibility(View.GONE);
}
if (ArcGisClusterView.instance != null) {
ArcGisClusterView.instance.mClusterIv.setVisibility(View.GONE);
}
}
/**
* 禁止输入框复制粘贴菜单
*/
@SuppressLint("ClickableViewAccessibility")
private void disableCopyAndPaste(final EditText editText) {
try {
if (editText == null) {
return;
}
editText.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return true;
}
});
editText.setLongClickable(false);
editText.setOnTouchListener((v, event) -> {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// setInsertionDisabled when user touches the view
setInsertionDisabled(editText);
editText.requestFocus();
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);
}
return false;
});
editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
private void setInsertionDisabled(EditText editText) {
try {
Field editorField = TextView.class.getDeclaredField("mEditor");
editorField.setAccessible(true);
Object editorObject = editorField.get(editText);
// if this view supports insertion handles
Class editorClass = Class.forName("android.widget.Editor");
Field mInsertionControllerEnabledField = editorClass.getDeclaredField("mInsertionControllerEnabled");
mInsertionControllerEnabledField.setAccessible(true);
mInsertionControllerEnabledField.set(editorObject, false);
// if this view supports selection handles
Field mSelectionControllerEnabledField = editorClass.getDeclaredField("mSelectionControllerEnabled");
mSelectionControllerEnabledField.setAccessible(true);
mSelectionControllerEnabledField.set(editorObject, false);
} catch (Exception e) {
e.printStackTrace();
}
}
class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.VH> {
private List<SearchModel> mDatas;
public SearchAdapter(List<SearchModel> data) {
this.mDatas = data;
}
//③ 在Adapter中实现3个方法
@Override
public void onBindViewHolder(VH holder, int position) {
holder.title.setText(mDatas.get(position).getPoiname());
holder.desc.setText(mDatas.get(position).getPoiaddress());
holder.itemView.setOnClickListener(v -> {
//item 点击事件
searchPopupLayout.dismiss();
if(TextUtils.isEmpty(mSearchEt.getText().toString())){
mSearchResultTv.setText("");
}else{
mSearchResultTv.setText(mDatas.get(position).getPoiname());
}
switch (currSearchType) {
case SEARCH:
arcGisLocationView.setSearchLocation(mDatas.get(position).getX(), mDatas.get(position).getY(), currSearchType);
if (searchSelectedListener != null) {
searchSelectedListener.selectedResult(mDatas.get(position));
}
break;
case START_ADDRESS_SEARCH:
case END_ADDRESS_SEARCH:
if (searchSelectedListener != null) {
searchSelectedListener.selectedResult(mDatas.get(position));
}
break;
}
});
}
@Override
public int getItemCount() {
return mDatas.size();
}
@NonNull
@Override
public VH onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_search, parent, false);
return new VH(v);
}
class VH extends RecyclerView.ViewHolder {
TextView title;
TextView desc;
VH(View v) {
super(v);
title = v.findViewById(R.id.item_search_title_tv);
desc = v.findViewById(R.id.item_search_address_tv);
}
}
}
}
package cn.com.founder.arcgislib.nonavi.widget.cluster;
import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import com.esri.arcgisruntime.concurrent.ListenableFuture;
import com.esri.arcgisruntime.data.Feature;
import com.esri.arcgisruntime.data.FeatureQueryResult;
import com.esri.arcgisruntime.data.QueryParameters;
import com.esri.arcgisruntime.geometry.Envelope;
import com.esri.arcgisruntime.geometry.Geometry;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.geometry.Polygon;
import com.esri.arcgisruntime.layers.FeatureLayer;
import com.esri.arcgisruntime.mapping.view.Graphic;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import com.esri.arcgisruntime.mapping.view.MapScaleChangedEvent;
import com.esri.arcgisruntime.mapping.view.MapScaleChangedListener;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.symbology.CompositeSymbol;
import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol;
import com.esri.arcgisruntime.symbology.Symbol;
import com.esri.arcgisruntime.symbology.TextSymbol;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* 模拟聚合
*/
public class ClusterFeatureLayer {
private int _clusterTolerance = 150;
private double _clusterResolution;
private MapView _mapView;
private FeatureLayer _featureLayer;
private GraphicsOverlay _GraphicsOverlay;
private GraphicsOverlay _clusterGraphicsOverlay;
private List<Map<String, Object>> _clusterData;
private Context _context;
private int clusterID = 0;
ArrayList<Graphic> _clusterGraphics = new ArrayList<Graphic>();
public ClusterFeatureLayer(final MapView mapView, FeatureLayer featureLayer, Context context
, int clusterTolerance) {
if (mapView == null || featureLayer == null) {
return;
}
this._clusterTolerance = clusterTolerance;
this._clusterResolution = _getExtent(mapView.getVisibleArea()).getWidth()
/ mapView.getWidth();
this._mapView = mapView;
this._featureLayer = featureLayer;
this._clusterData = new ArrayList<>();
this._GraphicsOverlay = new GraphicsOverlay();
this._clusterGraphicsOverlay = new GraphicsOverlay();
this._mapView.getGraphicsOverlays().add(this._clusterGraphicsOverlay);
this._context = context;
this._clusterFeatures();
mapView.addMapScaleChangedListener(new MapScaleChangedListener() {
@Override
public void mapScaleChanged(MapScaleChangedEvent mapScaleChangedEvent) {
if (!mapView.isNavigating()) {
_clusterResolution = _getExtent(_mapView.getVisibleArea())
.getWidth() / _mapView.getWidth();
_clusterData.clear();
_clusterGraphics.clear();
_GraphicsOverlay.getGraphics().clear();
_clusterGraphicsOverlay.getGraphics().clear();
_clusterFeatures();
}
}
});
}
public GraphicsOverlay getGraphicLayer() {
return this._clusterGraphicsOverlay;
}
public void setGraphicVisible(boolean visible) {
if (_clusterGraphicsOverlay != null) {
_clusterGraphicsOverlay.setVisible(visible);
}
}
public void removeGraphiclayer() {
if (_mapView != null && _clusterGraphicsOverlay != null) {
try {
this._mapView.getGraphicsOverlays().remove(_clusterGraphicsOverlay);
_clusterGraphicsOverlay.getGraphics().clear();
} catch (Exception e) {
}
}
}
public void clear() {
if (_clusterGraphicsOverlay != null) {
_clusterGraphicsOverlay.getGraphics().clear();
}
}
public ArrayList<Graphic> getGraphicsByClusterID(int id) {
ArrayList<Graphic> graphics = new ArrayList<>();
for (Graphic gra : this._clusterGraphics
) {
if (Integer.valueOf(gra.getAttributes().get("clusterID").toString()) == id) {
graphics.add(gra);
}
}
return graphics;
}
private void _clusterFeatures() {
QueryParameters queryParameters = new QueryParameters();
queryParameters.setGeometry(_mapView.getVisibleArea());
queryParameters.setReturnGeometry(true);
final ListenableFuture<FeatureQueryResult> futures =
_featureLayer.getFeatureTable().queryFeaturesAsync(queryParameters);
// add done loading listener to fire when the selection returns
futures.addDoneListener(new Runnable() {
@Override
public void run() {
try {
//call get on the future to get the result
FeatureQueryResult result = futures.get();
// create an Iterator
Iterator<Feature> iterator = result.iterator();
Feature feature;
// cycle through selections
int counter = 0;
while (iterator.hasNext()) {
feature = iterator.next();
_GraphicsOverlay.getGraphics().add(new Graphic(feature.getGeometry()));
counter++;
}
_clusterGraphics();
} catch (Exception e) {
Log.d("cluster", e.getLocalizedMessage());
}
}
});
}
private void _clusterGraphics() {
// 遍历所有的point,判断添加到哪一个cluster中
clusterID = 0;
for (int j = 0, jl = _GraphicsOverlay.getGraphics().size(); j < jl; j++) {
Graphic graphic = this._GraphicsOverlay.getGraphics().get(j);
Point point = (Point) graphic.getGeometry();
boolean clustered = false;
for (int i = 0, il = this._clusterData.size(); i < il; i++) {
Map<String, Object> cluster = this._clusterData.get(i);
Point pointCluster = new Point((Double) cluster.get("x"),
(Double) cluster.get("y"), _mapView.getSpatialReference());
if (this._clusterTest(point, pointCluster)) {
this._clusterAddGraphic(graphic, cluster);
clustered = true;
break;
}
}
if (!clustered) {
this._clusterCreate(graphic);
}
}
this._showAllClusters();
}
private void _clusterAddGraphic(Graphic graphic, Map<String, Object> cluster) {
int count = (Integer) cluster.get("count");
Point point = (Point) graphic.getGeometry();
double xCluster = (Double) cluster.get("x");
double yCluster = (Double) cluster.get("y");
double x = (point.getX() + (xCluster * count)) / (count + 1);
double y = (point.getY() + (yCluster * count)) / (count + 1);
cluster.remove("x");
cluster.remove("y");
cluster.put("x", x);
cluster.put("y", y);
Envelope envelope = (Envelope) Geometry.fromJson(cluster.get("extent").toString());
double xMin, yMin, xMax, yMax;
xMin = envelope.getXMin();
yMin = envelope.getYMin();
xMax = envelope.getXMax();
yMax = envelope.getYMax();
// 建立extent,把所有的point都包含在cluster中
if (point.getX() < xMin) {
xMin = point.getX();
}
if (point.getX() > xMax) {
xMax = point.getX();
}
if (point.getY() < yMin) {
yMin = point.getY();
}
if (point.getY() > yMax) {
yMax = point.getY();
}
Envelope envelopeNew = new Envelope(xMin, yMin, xMax, yMax, _mapView.getSpatialReference());
cluster.remove("extent");
cluster.put("extent", envelopeNew.toJson());
count++;
cluster.remove("count");
cluster.put("count", count);
if (_clusterGraphics != null) {
_clusterGraphics.add(graphic);
}
}
private void _clusterCreate(Graphic graphic) {
_clusterGraphics.add(graphic);
Map<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put("count", 1);
Point point = (Point) graphic.getGeometry();
hashMap.put("extent", new Envelope((Point) graphic.getGeometry(), 0, 0).toJson());
// hashMap.put("graphics", graphics);
hashMap.put("x", point.getX());
hashMap.put("y", point.getY());
hashMap.put("clusterID", clusterID);
graphic.getAttributes().put("clusterID", clusterID);
clusterID++;
this._clusterData.add(hashMap);
}
private boolean _clusterTest(Point point, Point pointCluster) {
double distance = (Math.sqrt(Math.pow(
(pointCluster.getX() - point.getX()), 2)
+ Math.pow((pointCluster.getY() - point.getY()), 2)) / this._clusterResolution);
return (distance <= this._clusterTolerance);
}
private void _showAllClusters() {
this._clusterGraphicsOverlay.getGraphics().clear();
for (int i = 0, il = this._clusterData.size(); i < il; i++) {
Map<String, Object> cluster = this._clusterData.get(i);
Point pointCluster = new Point((Double) cluster.get("x"),
(Double) cluster.get("y"), _mapView.getSpatialReference());
Graphic graphic = new Graphic(pointCluster, cluster, createClusterSymbol(cluster));
this._clusterGraphicsOverlay.getGraphics().add(graphic);
}
}
private Symbol createClusterSymbol(Map<String, Object> cluster) {
int count = (Integer) cluster.get("count");
if (count == 1) {
return markerSymbol;
} else if (count > 1) {
List<Symbol> symbols = new ArrayList<>();
if (count <= 10) {
symbols.add(markerSymbolS);
} else if (count > 10 && count <= 20) {
symbols.add(markerSymbolM);
} else if (count > 20) {
symbols.add(markerSymbolL);
}
TextSymbol textSymbol = new TextSymbol(18, count + "", Color.WHITE,
TextSymbol.HorizontalAlignment.CENTER,
TextSymbol.VerticalAlignment.MIDDLE);
symbols.add(textSymbol);
CompositeSymbol compositeSymbol = new CompositeSymbol(symbols);
return compositeSymbol;
}
return null;
}
SimpleMarkerSymbol markerSymbolL = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE,
Color.RED, 36);
SimpleMarkerSymbol markerSymbolM = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE,
Color.BLUE, 30);
SimpleMarkerSymbol markerSymbolS = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE,
Color.GREEN, 24);
SimpleMarkerSymbol markerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE,
Color.YELLOW, 18);
private Envelope _getExtent(Polygon polygon) {
return polygon.getExtent();
}
}
package cn.com.founder.arcgislib.nonavi.widget.cluster;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import androidx.core.content.ContextCompat;
import com.esri.arcgisruntime.geometry.Envelope;
import com.esri.arcgisruntime.geometry.Geometry;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.geometry.Polygon;
import com.esri.arcgisruntime.mapping.view.Graphic;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.symbology.CompositeSymbol;
import com.esri.arcgisruntime.symbology.PictureMarkerSymbol;
import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol;
import com.esri.arcgisruntime.symbology.Symbol;
import com.esri.arcgisruntime.symbology.TextSymbol;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import cn.com.founder.arcgislib.nonavi.view.ArcGisClusterView;
/**
* 模拟聚合
*/
public class ClusterLayer {
final private int _clusterTolerance = 300;
private double _clusterResolution;
private MapView _mapView;
private GraphicsOverlay _GraphicsOverlay;
private GraphicsOverlay _clusterGraphicsOverlay;
private List<Map<String, Object>> _clusterData;
private Context _context;
private int clusterID = 0;
ArrayList<Graphic> _clusterGraphics = new ArrayList<Graphic>();
private PictureMarkerSymbol defaultPointImageSymbol;
private SimpleMarkerSymbol defaultClusterCircleSymbol;
private ArcGisClusterView.ClusterStyleBuilder clusterStyleBuilder;
public ClusterLayer(final MapView mapView, GraphicsOverlay GraphicsOverlay,
Context context, ArcGisClusterView.ClusterStyleBuilder clusterStyleBuilder) {
if (mapView == null || GraphicsOverlay == null) {
return;
}
this._clusterResolution = _getExtent(mapView.getVisibleArea()).getWidth()
/ mapView.getWidth();
this._mapView = mapView;
this._GraphicsOverlay = GraphicsOverlay;
this._clusterData = new ArrayList<Map<String, Object>>();
this._clusterGraphicsOverlay = new GraphicsOverlay();
this._mapView.getGraphicsOverlays().add(this._clusterGraphicsOverlay);
this._context = context;
this.clusterStyleBuilder = clusterStyleBuilder;
defaultClusterCircleSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE,
clusterStyleBuilder.getmClusterCircleBg(), clusterStyleBuilder.getmClusterCircleSize());
BitmapDrawable bitmapDrawableNormal = (BitmapDrawable) ContextCompat
.getDrawable(_context, clusterStyleBuilder.getmDefaultExpandImage());
try {
defaultPointImageSymbol = PictureMarkerSymbol.createAsync(bitmapDrawableNormal).get();
} catch (Exception e) {
e.printStackTrace();
}
this._clusterGraphics();
mapView.addMapScaleChangedListener(mapScaleChangedEvent -> {
if (!mapView.isNavigating()) {
_clusterResolution = _getExtent(_mapView.getVisibleArea())
.getWidth() / _mapView.getWidth();
_clusterData.clear();
_clusterGraphics.clear();
_clusterGraphicsOverlay.getGraphics().clear();
_clusterGraphics();
}
});
}
public GraphicsOverlay getGraphicLayer() {
return this._clusterGraphicsOverlay;
}
public void setGraphicVisible(boolean visible) {
if (_clusterGraphicsOverlay != null) {
_clusterGraphicsOverlay.setVisible(visible);
}
}
public void removeGraphiclayer() {
if (_mapView != null && _clusterGraphicsOverlay != null) {
try {
this._mapView.getGraphicsOverlays().remove(_clusterGraphicsOverlay);
_clusterGraphicsOverlay.getGraphics().clear();
} catch (Exception e) {
}
}
}
public void clear() {
if (_clusterGraphicsOverlay != null) {
_clusterGraphicsOverlay.getGraphics().clear();
}
}
public ArrayList<Graphic> getGraphicsByClusterID(int id) {
ArrayList<Graphic> graphics = new ArrayList<>();
for (Graphic gra : this._clusterGraphics) {
if (Integer.valueOf(gra.getAttributes().get("clusterID").toString()) == id) {
graphics.add(gra);
}
}
return graphics;
}
private void _clusterGraphics() {
// 遍历所有的point,判断添加到哪一个cluster中
clusterID = 0;
for (int j = 0, jl = _GraphicsOverlay.getGraphics().size(); j < jl; j++) {
Graphic graphic = this._GraphicsOverlay.getGraphics().get(j);
Point point = (Point) graphic.getGeometry();
boolean clustered = false;
for (int i = 0, il = this._clusterData.size(); i < il; i++) {
Map<String, Object> cluster = this._clusterData.get(i);
Point pointCluster = new Point((Double) cluster.get("x"),
(Double) cluster.get("y"), _mapView.getSpatialReference());
if (this._clusterTest(point, pointCluster)) {
this._clusterAddGraphic(graphic, cluster);
clustered = true;
break;
}
}
if (!clustered) {
this._clusterCreate(graphic);
}
}
this._showAllClusters();
}
private void _clusterAddGraphic(Graphic graphic, Map<String, Object> cluster) {
int count = (Integer) cluster.get("count");
Point point = (Point) graphic.getGeometry();
double xCluster = (Double) cluster.get("x");
double yCluster = (Double) cluster.get("y");
double x = (point.getX() + (xCluster * count)) / (count + 1);
double y = (point.getY() + (yCluster * count)) / (count + 1);
cluster.remove("x");
cluster.remove("y");
cluster.put("x", x);
cluster.put("y", y);
Envelope envelope = (Envelope) Geometry.fromJson(cluster.get("extent").toString());
double xMin, yMin, xMax, yMax;
xMin = envelope.getXMin();
yMin = envelope.getYMin();
xMax = envelope.getXMax();
yMax = envelope.getYMax();
// 建立extent,把所有的point都包含在cluster中
if (point.getX() < xMin) {
xMin = point.getX();
}
if (point.getX() > xMax) {
xMax = point.getX();
}
if (point.getY() < yMin) {
yMin = point.getY();
}
if (point.getY() > yMax) {
yMax = point.getY();
}
Envelope envelopeNew = new Envelope(xMin, yMin, xMax, yMax, _mapView.getSpatialReference());
cluster.remove("extent");
cluster.put("extent", envelopeNew.toJson());
count++;
cluster.remove("count");
cluster.put("count", count);
if (_clusterGraphics != null) {
_clusterGraphics.add(graphic);
}
}
private void _clusterCreate(Graphic graphic) {
_clusterGraphics.add(graphic);
Map<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put("count", 1);
Point point = (Point) graphic.getGeometry();
hashMap.put("extent", new Envelope((Point) graphic.getGeometry(), 0, 0).toJson());
// hashMap.put("graphics", graphics);
hashMap.put("x", point.getX());
hashMap.put("y", point.getY());
hashMap.put("clusterID", clusterID);
graphic.getAttributes().put("clusterID", clusterID);
clusterID++;
this._clusterData.add(hashMap);
}
private boolean _clusterTest(Point point, Point pointCluster) {
double distance = (Math.sqrt(Math.pow(
(pointCluster.getX() - point.getX()), 2)
+ Math.pow((pointCluster.getY() - point.getY()), 2)) / this._clusterResolution);
return (distance <= this._clusterTolerance);
}
private void _showAllClusters() {
this._clusterGraphicsOverlay.getGraphics().clear();
for (int i = 0, il = this._clusterData.size(); i < il; i++) {
Map<String, Object> cluster = this._clusterData.get(i);
Point pointCluster = new Point((Double) cluster.get("x"),
(Double) cluster.get("y"),_mapView.getSpatialReference());
Graphic graphic = new Graphic(pointCluster, cluster, createClusterSymbol(cluster));
this._clusterGraphicsOverlay.getGraphics().add(graphic);
}
}
private Symbol createClusterSymbol(Map<String, Object> cluster) {
int count = (Integer) cluster.get("count");
if (count == 1) {
return defaultPointImageSymbol != null ? defaultPointImageSymbol : markerSymbol;
} else if (count > 1) {
List<Symbol> symbols = new ArrayList<>();
symbols.add(defaultClusterCircleSymbol);
// if (count <= 10) {
// symbols.add(markerSymbolS);
// } else if (count > 10 && count <= 20) {
// symbols.add(markerSymbolM);
// } else if (count > 20) {
// symbols.add(markerSymbolL);
// }
TextSymbol textSymbol = new TextSymbol(clusterStyleBuilder.getmClusterTextSize(), count + "", clusterStyleBuilder.getmClusterTextColor(),
TextSymbol.HorizontalAlignment.CENTER,
TextSymbol.VerticalAlignment.MIDDLE);
symbols.add(textSymbol);
CompositeSymbol compositeSymbol = new CompositeSymbol(symbols);
return compositeSymbol;
}
return null;
}
SimpleMarkerSymbol markerSymbolL = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE,
Color.RED, 36);
SimpleMarkerSymbol markerSymbolM = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE,
Color.BLUE, 30);
SimpleMarkerSymbol markerSymbolS = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE,
Color.GREEN, 24);
SimpleMarkerSymbol markerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE,
Color.YELLOW, 18);
private Envelope _getExtent(Polygon polygon) {
return polygon.getExtent();
}
}
package cn.com.founder.arcgislib.nonavi.widget.draw;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import java.util.List;
public class DrawEntity {
private List<GraphicsOverlay> textGraphic=null;//文字集合
private List<GraphicsOverlay> polygonGraphic=null;//面集合
private List<GraphicsOverlay> lineGraphic=null;//线集合
private List<GraphicsOverlay> pointGraphic=null;//点集合
private List<List<Point>> pointGroup=null;//绘制点的集合的集合
public DrawEntity(List<GraphicsOverlay> textGraphic, List<GraphicsOverlay> polygonGraphic, List<GraphicsOverlay> lineGraphic, List<GraphicsOverlay> pointGraphic, List<List<Point>> pointGroup) {
this.textGraphic = textGraphic;
this.polygonGraphic = polygonGraphic;
this.lineGraphic = lineGraphic;
this.pointGraphic = pointGraphic;
this.pointGroup = pointGroup;
}
public DrawEntity(){
}
public List<GraphicsOverlay> getTextGraphic() {
return textGraphic;
}
public void setTextGraphic(List<GraphicsOverlay> textGraphic) {
this.textGraphic = textGraphic;
}
public List<GraphicsOverlay> getPolygonGraphic() {
return polygonGraphic;
}
public void setPolygonGraphic(List<GraphicsOverlay> polygonGraphic) {
this.polygonGraphic = polygonGraphic;
}
public List<GraphicsOverlay> getLineGraphic() {
return lineGraphic;
}
public void setLineGraphic(List<GraphicsOverlay> lineGraphic) {
this.lineGraphic = lineGraphic;
}
public List<GraphicsOverlay> getPointGraphic() {
return pointGraphic;
}
public void setPointGraphic(List<GraphicsOverlay> pointGraphic) {
this.pointGraphic = pointGraphic;
}
public List<List<Point>> getPointGroup() {
return pointGroup;
}
public void setPointGroup(List<List<Point>> pointGroup) {
this.pointGroup = pointGroup;
}
}
package cn.com.founder.arcgislib.nonavi.widget.draw;
import android.content.Context;
import android.graphics.Color;
import androidx.core.content.ContextCompat;
import com.esri.arcgisruntime.geometry.GeodeticCurveType;
import com.esri.arcgisruntime.geometry.GeometryEngine;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.geometry.Polygon;
import com.esri.arcgisruntime.geometry.PolygonBuilder;
import com.esri.arcgisruntime.geometry.PolylineBuilder;
import com.esri.arcgisruntime.geometry.SpatialReference;
import com.esri.arcgisruntime.mapping.view.Graphic;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.symbology.SimpleFillSymbol;
import com.esri.arcgisruntime.symbology.SimpleLineSymbol;
import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol;
import com.esri.arcgisruntime.symbology.TextSymbol;
import java.util.ArrayList;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.R;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.utils.ToolUtil;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/7/3 10:33
* EMail:luo_shaopeng@founder.com.cn
* Description:绘制图层
*/
public class DrawLayer {
private Context context;
private MapView mapView;
private SpatialReference spatialReference;
private GraphicsOverlay drawTextGraphicOverlay=null;//绘制面板
private GraphicsOverlay drawPointGraphicOverlay=null;
private GraphicsOverlay drawLineGraphicOverlay=null;
private GraphicsOverlay drawPolygonGraphicOverlay=null;
private GraphicsOverlay drawOrthogonGraphicOverlay=null;
private List<GraphicsOverlay> textGraphic=null;//文字集合
private List<GraphicsOverlay> polygonGraphic=null;//面集合
private List<GraphicsOverlay> lineGraphic=null;//线集合
private List<GraphicsOverlay> pointGraphic=null;//点集合
private List<Graphic> circleGraphicList=null;
private List<Graphic> orthogonGraphicList=null;
private List<Graphic> pointGraphicList=null;
private TextSymbol textSymbol=null;//标注样式
private SimpleMarkerSymbol pointSymbol=null;//点样式
private SimpleLineSymbol lineSymbol=null;//线样式
private SimpleFillSymbol polygonSymbol =null;//面样式
private List<List<Point>> pointGroup=null;//绘制点的集合的集合
private List<Point> circlePointList;
private List<Point> pointList=null;//每次绘制点的集合
private List<Point> tmpPointList=null;//撤销、恢复临时点集合
private List<TextSymbol> textList=null;//每次绘制文字的集合
private List<TextSymbol> tmpTextList=null;//撤销、恢复临时文字集合
private List<Graphic> textPointList=null;//每次绘制文字的集合
private List<Graphic> tmpTextPointList=null;//撤销、恢复临时文字集合
private Variable.DrawType drawType=null;//绘制类型
private boolean isNext=false,isPrev=false;//是否在恢复或者撤销
private Variable.Measure measureAreaType=Variable.Measure.M2;
public DrawLayer(Context context, MapView mapView){
this.context=context;
this.mapView=mapView;
init();
}
private void init(){
pointList=new ArrayList<>();
tmpPointList=new ArrayList<>();
textList=new ArrayList<>();
tmpTextList=new ArrayList<>();
textPointList=new ArrayList<>();
tmpTextPointList=new ArrayList<>();
textGraphic=new ArrayList<>();
polygonGraphic=new ArrayList<>();
lineGraphic=new ArrayList<>();
pointGraphic=new ArrayList<>();
pointGroup=new ArrayList<>();
circleGraphicList = new ArrayList<>();
orthogonGraphicList = new ArrayList<>();
pointGraphicList = new ArrayList<>();
circlePointList = new ArrayList<>();
pointSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.GRAY, 8);
lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.RED, 2);
//lineSymbol.setMarkerStyle(SimpleLineSymbol.MarkerStyle.ARROW);
polygonSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.argb(40,0,0,0), null);
textSymbol = new TextSymbol(12,"", R.color.color_F05B48, TextSymbol.HorizontalAlignment.LEFT,TextSymbol.VerticalAlignment.BOTTOM);
}
protected void startPoint(){
drawType=Variable.DrawType.POINT;
}
protected void startLine(){
drawType=Variable.DrawType.LINE;
}
protected void startPolygon(){
drawType=Variable.DrawType.POLYGON;
}
protected void setSpatialReference(SpatialReference spatialReference) {
this.spatialReference = spatialReference;
}
private SpatialReference getSpatialReference() {
// if(spatialReference==null){
// return mapView.getSpatialReference();
// }
return SpatialReference.create(4326);
}
protected Object drawByScreenPoint(android.graphics.Point point){
if(drawType==Variable.DrawType.POINT){
return drawPointByScreenPoint(point);
}else if(drawType==Variable.DrawType.LINE){
return drawLineByScreenPoint(point);
}else if(drawType==Variable.DrawType.POLYGON){
return drawPolygonByScreenPoint(point);
}
return null;
}
protected Object drawByGisPoint(Point point){
if(drawType==Variable.DrawType.POINT){
return drawPointByGisPoint(point);
}else if(drawType==Variable.DrawType.LINE){
return drawLineByGisPoint(point);
}else if(drawType==Variable.DrawType.POLYGON){
return drawPolygonByGisPoint(point);
}
return null;
}
protected Object drawByScreenXY(float x,float y){
if(drawType==Variable.DrawType.POINT){
return drawPointByScreenXY(x,y);
}else if(drawType==Variable.DrawType.LINE){
return drawLineByScreenXY(x,y);
}else if(drawType==Variable.DrawType.POLYGON){
return drawPolygonByScreenXY(x, y);
}
return null;
}
protected void drawPointByGisXY(float x,float y){
if(drawType==Variable.DrawType.POINT){
drawPointByGisXY(x,y);
}else if(drawType==Variable.DrawType.LINE){
drawLineByGisXY(x,y);
}else if(drawType==Variable.DrawType.POLYGON){
drawPolygonByGisXY(x, y);
}
}
private void drawText(Point point){
if(drawTextGraphicOverlay==null){
drawTextGraphicOverlay = new GraphicsOverlay();
mapView.getGraphicsOverlays().add(drawTextGraphicOverlay);
textGraphic.add(drawTextGraphicOverlay);
}
Graphic pointGraphic = new Graphic(point,textSymbol);
drawTextGraphicOverlay.getGraphics().add(pointGraphic);
if(!isPrev) {
textList.add(textSymbol);
}
if(!isNext && !isPrev) {
tmpTextList.clear();
tmpTextList.addAll(textList);
}
}
private void drawPoint(Point point){
if(drawOrthogonGraphicOverlay==null){
drawOrthogonGraphicOverlay = new GraphicsOverlay();
mapView.getGraphicsOverlays().add(drawOrthogonGraphicOverlay);
pointGraphic.add(drawOrthogonGraphicOverlay);
}
Graphic pointGraphic = new Graphic(point,pointSymbol);
drawOrthogonGraphicOverlay.getGraphics().add(pointGraphic);
pointList.add(point);
if(!isNext) {
tmpPointList.clear();
tmpPointList.addAll(pointList);
}
}
public void drawBox(float x,float y) {
Point point=screenXYtoPpoint(x,y);
circlePointList.add(point);
drawPoint(point);
if(circlePointList.size()==2){
drawBox(circlePointList.get(0),circlePointList.get(1));
circlePointList.clear();
removeGraphics(pointGraphicList);
}
}
public void drawBox( Point point) {
circlePointList.add(point);
drawPoint(point);
if(circlePointList.size()==2){
drawBox(circlePointList.get(0),circlePointList.get(1));
circlePointList.clear();
removeGraphics(pointGraphicList);
}
}
public void drawBox(Point point1,Point point2) {
PolygonBuilder polygonGeometry = new PolygonBuilder(getSpatialReference());
polygonGeometry.addPoint(point1);
polygonGeometry.addPoint(new Point(point1.getX(),point2.getY()));
polygonGeometry.addPoint(point2);
polygonGeometry.addPoint(new Point(point2.getX(),point1.getY()));
orthogonGraphicList.add(drawPolygon(polygonGeometry));
}
public void drawCircle(float x,float y) {
Point point=screenXYtoPpoint(x,y);
circlePointList.add(point);
drawPoint(point);
if(circlePointList.size()==2){
drawCircle(circlePointList.get(0),circlePointList.get(1));
circlePointList.clear();
removeGraphics(pointGraphicList);
}
}
public void drawCircle(Point point) {
circlePointList.add(point);
drawPoint(point);
if(circlePointList.size()==2){
drawCircle(circlePointList.get(0),circlePointList.get(1));
circlePointList.clear();
removeGraphics(pointGraphicList);
}
}
public void drawCircle(Point point1,Point point2) {
double radius = 0;
double x = (point2.getX() - point1.getX());
double y = (point2.getY() - point1.getY());
radius = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
drawCircle(point1, radius);
}
public void drawCircle(Point point, double radius) {
Point[] points = getCirclePoints(point, radius);
PolygonBuilder polygonGeometry = new PolygonBuilder(getSpatialReference());
for (Point p : points) {
polygonGeometry.addPoint(p);
}
circleGraphicList.add(drawPolygon(polygonGeometry));
}
public Graphic drawPolygon(PolygonBuilder polygonGeometry){
Polygon polygon = polygonGeometry.toGeometry();
SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.RED, 2.0f);
// SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.parseColor("#FC8145"), 2.0f);
// SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.argb(40,0,0,0), 1.0f);
// SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.parseColor("#33e97676"), lineSymbol);
SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.argb(40,0,0,0), lineSymbol);
Graphic graphic = new Graphic(polygon, simpleFillSymbol);
drawOrthogonGraphicOverlay.getGraphics().add(graphic);
double area = GeometryEngine.areaGeodetic(polygonGeometry.toGeometry(),null, GeodeticCurveType.SHAPE_PRESERVING);
String s= ToolUtil.forMatDouble(Math.abs(ToolUtil.areaChange(area,measureAreaType)));
drawText(polygonGeometry.toGeometry().getExtent().getCenter(),s+ToolUtil.lengthEnameToCname(measureAreaType),true);
return graphic;
}
private static Point[] getCirclePoints(Point center, double radius) {
Point[] points = new Point[50];
double sin;
double cos;
double x;
double y;
for (double i = 0; i < 50; i++) {
sin = Math.sin(Math.PI * 2 * i / 50);
cos = Math.cos(Math.PI * 2 * i / 50);
x = center.getX() + radius * sin;
y = center.getY() + radius * cos;
points[(int) i] = new Point(x, y);
}
return points;
}
private PolylineBuilder drawLine(Point point1, Point point2){
//绘制面板为空,说明重新绘制一个line,在地图和线集合里添加一个新line
if(drawLineGraphicOverlay==null){
drawLineGraphicOverlay = new GraphicsOverlay();
mapView.getGraphicsOverlays().add(drawLineGraphicOverlay);
lineGraphic.add(drawLineGraphicOverlay);
}
PolylineBuilder lineGeometry = new PolylineBuilder(getSpatialReference());
lineGeometry.addPoint(point1);
lineGeometry.addPoint(point2);
Graphic lineGraphic = new Graphic(lineGeometry.toGeometry(),lineSymbol);
drawLineGraphicOverlay.getGraphics().add(lineGraphic);
return lineGeometry;
}
private PolygonBuilder drawPolygon(){
//绘制面板为空,说明重新绘制一个Polyline,在地图和面集合里添加一个新Polyline
if(drawPolygonGraphicOverlay==null){
drawPolygonGraphicOverlay = new GraphicsOverlay();
mapView.getGraphicsOverlays().add(drawPolygonGraphicOverlay);
polygonGraphic.add(drawPolygonGraphicOverlay);
}
PolygonBuilder polygonGeometry = new PolygonBuilder(getSpatialReference());
for(Point point:pointList){
polygonGeometry.addPoint(point);
}
drawPolygonGraphicOverlay.getGraphics().clear();
Graphic polygonGraphic = new Graphic(polygonGeometry.toGeometry(),polygonSymbol);
drawPolygonGraphicOverlay.getGraphics().add(polygonGraphic);
return polygonGeometry;
}
private Point drawPointByScreenPoint(android.graphics.Point point){
Point center = mapView.screenToLocation(point);
this.drawPoint(center);
return center;
}
private Point drawPointByGisPoint(Point point){
this.drawPoint(point);
return point;
}
private Point drawPointByScreenXY(float x,float y){
android.graphics.Point point=new android.graphics.Point(Math.round(x),Math.round(y));
Point center = mapView.screenToLocation(point);
this.drawPoint(center);
return center;
}
private Point drawPointByGisXY(double x,double y){
Point center = new Point(x, y);
this.drawPoint(center);
return center;
}
private PolylineBuilder drawLineByScreenPoint(android.graphics.Point point){
Point nextPoint=this.drawPointByScreenPoint(point);
if(getPointSize()>1) {
Point prvPoint=getLastPoint();
return this.drawLine(prvPoint,nextPoint);
}
return null;
}
private PolylineBuilder drawLineByGisPoint(Point point){
Point nextPoint=this.drawPointByGisPoint(point);
if(getPointSize()>1) {
Point prvPoint=getLastPoint();
return this.drawLine(prvPoint,nextPoint);
}
return null;
}
private PolylineBuilder drawLineByGisPoint(Point point1,Point point2){
return this.drawLine(point1,point2);
}
private PolylineBuilder drawLineByScreenXY(float x,float y){
Point nextPoint=this.drawPointByScreenXY(x,y);
if(getPointSize()>1) {
Point prvPoint=getLastPoint();
return this.drawLine(prvPoint,nextPoint);
}
return null;
}
private PolylineBuilder drawLineByGisXY(double x,double y){
Point nextPoint=this.drawPointByGisXY(x,y);
if(getPointSize()>1) {
Point prvPoint=getLastPoint();
return this.drawLine(prvPoint,nextPoint);
}
return null;
}
private PolygonBuilder drawPolygonByScreenXY(float x, float y){
drawLineByScreenXY(x,y);
if(getPointSize()>=3) {
return drawPolygon();
}
return null;
}
private PolygonBuilder drawPolygonByScreenPoint(android.graphics.Point point){
drawLineByScreenPoint(point);
if(getPointSize()>=3) {
return drawPolygon();
}
return null;
}
private PolygonBuilder drawPolygonByGisXY(double x, double y){
drawLineByGisXY(x,y);
if(getPointSize()>=3) {
return drawPolygon();
}
return null;
}
private PolygonBuilder drawPolygonByGisPoint(Point point){
drawLineByGisPoint(point);
if(getPointSize()>=3) {
return drawPolygon();
}
return null;
}
protected Point screenXYtoPpoint(float x, float y){
android.graphics.Point point=new android.graphics.Point(Math.round(x),Math.round(y));
return mapView.screenToLocation(point);
}
protected void drawText(Point point,String text,boolean replaceOld){
textSymbol = getTextSymbol();
if(replaceOld) {
textSymbol.setHorizontalAlignment(TextSymbol.HorizontalAlignment.CENTER);
if(drawTextGraphicOverlay!=null)
drawTextGraphicOverlay.getGraphics().clear();
}
textSymbol.setText(text);
drawText(point);
}
protected boolean prevDraw(){
if(pointList.size()>1){
pointList.remove(pointList.size()-1);
if(textList.size()>0) {
textList.remove(textList.size() - 1);
}
removePrevGraphics(drawPointGraphicOverlay);
removePrevGraphics(drawLineGraphicOverlay);
if(drawType==Variable.DrawType.LINE){
removePrevGraphics(drawTextGraphicOverlay);
}else if(drawType==Variable.DrawType.POLYGON){
if(textList.size()>1) {
textSymbol = tmpTextList.get(textList.size() - 1);
}
PolygonBuilder pb=drawPolygon();
isPrev=true;
if(drawTextGraphicOverlay!=null)
drawTextGraphicOverlay.getGraphics().clear();
if(pointList.size()>2) {
drawText(pb.toGeometry().getExtent().getCenter());
}
isPrev=false;
}
}
return pointList.size()>1?true:false;
}
protected boolean nextDraw(){
isNext=true;
if(pointList.size()>0 && pointList.size()<tmpPointList.size()){
int index=pointList.size();
// textSymbol=tmpTextList.get(textList.size());
if(drawType==Variable.DrawType.LINE) {
drawLineByGisPoint(tmpPointList.get(index));
drawText(tmpPointList.get(index));
}else if(drawType==Variable.DrawType.POLYGON){
PolygonBuilder pb=drawPolygonByGisPoint(tmpPointList.get(index));
if(drawTextGraphicOverlay!=null)
drawTextGraphicOverlay.getGraphics().clear();
if(pointList.size()>2) {
drawText(pb.toGeometry().getExtent().getCenter());
}
}
}
isNext=false;
return (pointList.size()>0 && pointList.size()<tmpPointList.size())?true:false;
}
protected DrawEntity endDraw(){
if(drawType==Variable.DrawType.POLYGON) {
if (getPointSize() >= 3) {
this.drawLineByGisPoint(getEndPoint(), getFristPoint());
}
}
if(pointList.size()>0) {
pointGroup.add(pointList);
}
DrawEntity de=allDraw();
drawType=null;
drawPolygonGraphicOverlay=null;
drawLineGraphicOverlay=null;
drawPointGraphicOverlay=null;
drawTextGraphicOverlay=null;
pointList=new ArrayList<>();
return de;
}
protected DrawEntity clear(){
DrawEntity de=allDraw();
removeAllGraphics(lineGraphic);
removeAllGraphics(polygonGraphic);
removeAllGraphics(pointGraphic);
removeAllGraphics(textGraphic);
removeGraphics(circleGraphicList);
removeGraphics(pointGraphicList);
removeGraphics(orthogonGraphicList);
drawPolygonGraphicOverlay=null;
drawLineGraphicOverlay=null;
drawPointGraphicOverlay=null;
drawTextGraphicOverlay=null;
drawOrthogonGraphicOverlay=null;
drawType=null;
pointGroup.clear();
pointList.clear();
lineGraphic.clear();
pointGraphic.clear();
textGraphic.clear();
pointGroup=new ArrayList<>();
pointList=new ArrayList<>();
lineGraphic=new ArrayList<>();
textGraphic=new ArrayList<>();
pointGraphic=new ArrayList<>();
return de;
}
private DrawEntity allDraw(){
DrawEntity de=new DrawEntity();
de.setLineGraphic(lineGraphic);
de.setPointGraphic(pointGraphic);
de.setTextGraphic(textGraphic);
de.setPolygonGraphic(polygonGraphic);
de.setPointGroup(pointGroup);
return de;
}
private void removeGraphics(List<Graphic> go){
drawOrthogonGraphicOverlay.getGraphics().removeAll(go);
}
private void removeAllGraphics(List<GraphicsOverlay> go){
if(go.size()>0){
for(GraphicsOverlay graphics:go){
mapView.getGraphicsOverlays().remove(graphics);
}
}
}
private void removePrevGraphics(GraphicsOverlay gho){
if(gho != null){
boolean isEmpty = gho.getGraphics() == null || gho.getGraphics().isEmpty();
if(!isEmpty){
gho.getGraphics().remove(gho.getGraphics().size()-1);
}
}
}
/*protected void prevDraw(){
if(pointGraphic.size()==0 && textGraphic.size()==0 && lineGraphic.size()==0){
endDraw();
return;
}
removePrevGraphics(pointGraphic,Variable.DrawType.POINT);
removePrevGraphics(textGraphic,Variable.DrawType.TEXT);
removePrevGraphics(lineGraphic,Variable.DrawType.LINE);
if(pointList.size()>0){
if (pointList.size() > 0) {
pointList.remove(pointList.size() - 1);
}
}else if(pointGroup.size()>0) {
pointList=pointGroup.get(pointGroup.size()-1);
pointGroup.remove(pointGroup.size()-1);
}
if(drawType==Variable.DrawType.POLYGON){
drawPolygon();
}
}
private void removePrevGraphics(List<GraphicsOverlay> gos, Variable.DrawType type){
if(gos.size()>0) {
GraphicsOverlay go=gos.get(gos.size()-1);
List<Graphic> tg=go.getGraphics();
if (tg.size() > 0) {
tg.remove(tg.size() - 1);
}
if (tg.size() == 0){
mapView.getGraphicsOverlays().remove(gos.get(gos.size()-1));
gos.remove(gos.size()-1);
if(drawType==Variable.DrawType.LINE && type==Variable.DrawType.LINE){
removePrevGraphics(pointGraphic,Variable.DrawType.POINT);
}
if(drawType==Variable.DrawType.LINE && type==Variable.DrawType.POINT){
pointList.clear();
}
if(gos.size()>0) {
if (type == Variable.DrawType.LINE) {
drawLineGraphicOverlay = gos.get(gos.size() - 1);
} else if (type == Variable.DrawType.POINT) {
drawPointGraphicOverlay = gos.get(gos.size() - 1);
} else if (type == Variable.DrawType.TEXT) {
drawTextGraphicOverlay = gos.get(gos.size() - 1);
}
}else{
if (type == Variable.DrawType.LINE) {
drawLineGraphicOverlay = null;
} else if (type == Variable.DrawType.POINT) {
drawPointGraphicOverlay = null;
} else if (type == Variable.DrawType.TEXT) {
drawTextGraphicOverlay = null;
}
}
}
}
}*/
private TextSymbol getTextSymbol(){
TextSymbol textSymbol = new TextSymbol(12,"", Color.BLACK, TextSymbol.HorizontalAlignment.LEFT,TextSymbol.VerticalAlignment.BOTTOM);
textSymbol.setColor(Color.WHITE);
textSymbol.setHaloColor(Color.WHITE);
textSymbol.setHaloWidth(1);
textSymbol.setOutlineColor(ContextCompat.getColor(context,R.color.color_444444));
textSymbol.setOutlineWidth(1);
return textSymbol;
}
private int getPointSize(){
return pointList.size();
}
public Point getEndPoint(){
int index=getPointSize()>1?getPointSize()-1:0;
Point point=pointList.get(index);
return point;
}
private Point getLastPoint(){
int index=getPointSize()>1?getPointSize()-2:0;
Point point=pointList.get(index);
return point;
}
private Point getFristPoint(){
if(getPointSize()==0) return null;
Point point=pointList.get(0);
return point;
}
}
package cn.com.founder.arcgislib.nonavi.widget.draw;
import android.content.Context;
import com.esri.arcgisruntime.geometry.GeodeticCurveType;
import com.esri.arcgisruntime.geometry.GeometryEngine;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.geometry.PolygonBuilder;
import com.esri.arcgisruntime.geometry.PolylineBuilder;
import com.esri.arcgisruntime.geometry.SpatialReference;
import com.esri.arcgisruntime.mapping.view.MapView;
import java.util.ArrayList;
import java.util.List;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.utils.ToolUtil;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2020/7/3 17:33
* EMail:luo_shaopeng@founder.com.cn
* Description:绘制
*/
public class DrawView extends DrawLayer{
private Context context;
private MapView mapView;
private Variable.DrawType drawType=null;
private Variable.Measure measureLengthType=Variable.Measure.M;
private Variable.Measure measureAreaType=Variable.Measure.M2;
private double lineLength=0;
private List<Double> lengthList;
private List<Double> tmpLengthList;
public DrawView(Context context, MapView mapView) {
super(context, mapView);
this.context=context;
this.mapView=mapView;
lengthList=new ArrayList<>();
tmpLengthList=new ArrayList<>();
}
public void startMeasuredLength(float screenX,float screenY){
if(drawType==null) {
super.startLine();
drawType=Variable.DrawType.LINE;
}
drawScreenXY(screenX,screenY);
}
public void startMeasuredLength(android.graphics.Point screenPoint){
if(drawType==null) {
super.startLine();
drawType=Variable.DrawType.LINE;
}
drawScreenPoint(screenPoint);
}
public void startMeasuredArea(float screenX,float screenY){
if(drawType==null) {
super.startPolygon();
drawType=Variable.DrawType.POLYGON;
}
drawScreenXY(screenX,screenY);
}
public void startMeasuredArea(android.graphics.Point screenPoint){
if(drawType==null) {
super.startPolygon();
drawType=Variable.DrawType.POLYGON;
}
drawScreenPoint(screenPoint);
}
public boolean prevDraw(){
if(lengthList.size()>1) {
lengthList.remove(lengthList.size() - 1);
lineLength=lengthList.get(lengthList.size()-1);
}else{
lengthList.clear();
lineLength=0;
}
return super.prevDraw();
}
public boolean nextDraw(){
if(lengthList.size()>0 && lengthList.size()<tmpLengthList.size()) {
lengthList.add(tmpLengthList.get(lengthList.size()));
lineLength=lengthList.get(lengthList.size()-1);
}
return super.nextDraw();
}
public DrawEntity endMeasure(){
drawType=null;
lineLength=0;
tmpLengthList.clear();
lengthList.clear();
return super.endDraw();
}
public DrawEntity clearMeasure(){
drawType=null;
lineLength=0;
tmpLengthList.clear();
lengthList.clear();
return super.clear();
}
public void setSpatialReference(SpatialReference spatialReference) {
super.setSpatialReference(spatialReference);
}
public void setLengthType(Variable.Measure type){
this.measureLengthType=type;
}
public void setAreaType(Variable.Measure type){
this.measureAreaType=type;
}
private void drawScreenXY(float x, float y){
Point point=super.screenXYtoPpoint(x,y);
if( drawType==Variable.DrawType.LINE){
PolylineBuilder line=(PolylineBuilder)super.drawByGisPoint(point);
showLength(line,point);
}else if(drawType==Variable.DrawType.POLYGON){
PolygonBuilder polygon=(PolygonBuilder)super.drawByGisPoint(point);
showArea(polygon);
}
}
public void drawPointLine(Point point){
if(drawType==null) {
super.startLine();
drawType=Variable.DrawType.LINE;
}
PolylineBuilder line=(PolylineBuilder)super.drawByGisPoint(point);
showLength(line,point);
}
public void drawPointPolygon(Point point){
if(drawType==null) {
super.startPolygon();
drawType=Variable.DrawType.POLYGON;
}
PolygonBuilder polygon=(PolygonBuilder)super.drawByGisPoint(point);
showArea(polygon);
}
private void drawScreenPoint(android.graphics.Point screenPoint){
Point point=super.screenXYtoPpoint(screenPoint.x,screenPoint.y);
if( drawType==Variable.DrawType.LINE){
PolylineBuilder line=(PolylineBuilder)super.drawByScreenPoint(screenPoint);
showLength(line,point);
}else if(drawType==Variable.DrawType.POLYGON){
PolygonBuilder polygon=(PolygonBuilder)super.drawByScreenPoint(screenPoint);
showArea(polygon);
}
}
private void showLength(PolylineBuilder line,Point point){
if(line!=null) {
//double length = GeometryEngine.length(line.toGeometry());
double length = GeometryEngine.lengthGeodetic(line.toGeometry(),null, GeodeticCurveType.SHAPE_PRESERVING);
lineLength+=length;
lengthList.add(lineLength);
tmpLengthList.clear();
tmpLengthList.addAll(lengthList);
String s= ToolUtil.forMatDouble(Math.abs(ToolUtil.lengthChange(lineLength,measureLengthType)));
super.drawText(point,s+ToolUtil.lengthEnameToCname(measureLengthType),false);
}
}
private void showArea(PolygonBuilder polygon){
if(polygon!=null) {
//double area = GeometryEngine.area(polygon.toGeometry());
double area = GeometryEngine.areaGeodetic(polygon.toGeometry(),null, GeodeticCurveType.SHAPE_PRESERVING);
String s=ToolUtil.forMatDouble(Math.abs(ToolUtil.areaChange(area,measureAreaType)));
super.drawText(polygon.toGeometry().getExtent().getCenter(),s+ToolUtil.lengthEnameToCname(measureAreaType),true);
}
}
}
package cn.com.founder.arcgislib.nonavi.widget.popup;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import cn.com.founder.arcgislib.nonavi.R;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/4/2 10:27
* EMail:luo_shaopeng@founder.com.cn
* Description:类似popup的dialog--入口
*/
public class PopupDialog extends Dialog {
private static final int DEFAULT_CONTENT_LAYOUT= R.layout.layout_popup_default;
private int mContentLayoutId=-1;//弹出窗体的内容layout
private View mContentLayout;//弹出窗体的内容布局
private int mGravity= Gravity.BOTTOM;//窗体的弹出位置
private boolean mUseRadius =true;//是否使用圆角效果
private int mWindowWidth=-1;//窗体宽度(px),-1代表外界并未设置,直接使用默认设置
private int mWindowHeight=-1;//窗体高度(px)
public PopupDialog(@NonNull Context context) {
super(context);
}
public PopupDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
}
protected PopupDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
}
private int getContentLayoutId(){
if(mContentLayoutId<=0){
return DEFAULT_CONTENT_LAYOUT;
}
return mContentLayoutId;
}
//设置内容布局的layout
protected void setContentLayout(@LayoutRes int contentLayoutId){
mContentLayoutId=contentLayoutId;
}
//设置内容布局的layout
protected void setContentLayout(View contentLayout){
this.mContentLayout=contentLayout;
}
//设置窗体的弹出位置
protected void setWindowGravity(int gravity){
this.mGravity=gravity;
}
//是否使用圆角特性
protected void setUseRadius(boolean useRadius){
this.mUseRadius=useRadius;
}
//设置窗体宽度(px)
protected void setWindowWidth(int width){
this.mWindowWidth=width;
}
//设置窗体高度(px)
protected void setWindowHeight(int height){
this.mWindowHeight=height;
}
/**
* 生成窗体配置
*/
private void configWindow(){
Window window=getWindow();
if(window!=null){
WindowManager.LayoutParams params=window.getAttributes();
params.gravity= mGravity;
configWindowBackground(window);//配置窗体背景
configWindowLayoutParams(window,params);//设置窗体布局参数
configWindowAnimations(window);//配置动画效果
}
}
//配置窗体布局参数
private void configWindowLayoutParams(Window window, WindowManager.LayoutParams params){
params.gravity= mGravity;
if(mGravity== Gravity.LEFT||mGravity== Gravity.RIGHT){
params.width= getWidthParams(WindowManager.LayoutParams.WRAP_CONTENT);
params.height=getHeightParams(WindowManager.LayoutParams.MATCH_PARENT);
}else if(mGravity== Gravity.TOP||mGravity== Gravity.BOTTOM){
params.width= getWidthParams(WindowManager.LayoutParams.MATCH_PARENT);
params.height=getHeightParams(WindowManager.LayoutParams.WRAP_CONTENT);
}else{
params.width= getWidthParams(WindowManager.LayoutParams.WRAP_CONTENT);
params.height=getHeightParams(WindowManager.LayoutParams.WRAP_CONTENT);
}
window.setAttributes(params);
}
//获取宽度布局参数(取决于外界是否设置了宽度)
private int getWidthParams(int defaultParams){
if(mWindowWidth>=0){//此时宽度已被赋值
return mWindowWidth;
}
return defaultParams;
}
//获取高度布局参数(取决于外界是否设置了高度)
private int getHeightParams(int defaultParams){
if(mWindowHeight>=0){//此时高度已被赋值
return mWindowHeight;
}
return defaultParams;
}
//配置动画效果
private void configWindowAnimations(Window window){
switch(mGravity){
case Gravity.LEFT:
window.setWindowAnimations(R.style.LeftDialogAnimation);
break;
case Gravity.RIGHT:
window.setWindowAnimations(R.style.RightDialogAnimation);
break;
case Gravity.CENTER:
//从中心弹出使用默认动画,不作额外处理
break;
case Gravity.TOP:
window.setWindowAnimations(R.style.TopDialogAnimation);
break;
case Gravity.BOTTOM:
default:
window.setWindowAnimations(R.style.BottomDialogAnimation);
break;
}
}
//配置窗体背景
private void configWindowBackground(Window window){
if(!mUseRadius){
window.setBackgroundDrawableResource(R.drawable.bg_popup_dialog_normal);
return;
}
switch(mGravity){
case Gravity.LEFT:
window.setBackgroundDrawableResource(R.drawable.bg_popup_dialog_left);
break;
case Gravity.RIGHT:
window.setBackgroundDrawableResource(R.drawable.bg_popup_dialog_right);
break;
case Gravity.CENTER:
window.setBackgroundDrawableResource(R.drawable.bg_popup_dialog_center);
break;
case Gravity.TOP:
window.setBackgroundDrawableResource(R.drawable.bg_popup_dialog_top);
break;
case Gravity.BOTTOM:
default:
window.setBackgroundDrawableResource(R.drawable.bg_popup_dialog_bottom);
break;
}
}
//配置主内容布局
private void configContentView(){
if(mContentLayout!=null){//优先使用View作为内容布局
setContentView(mContentLayout);
}else{
setContentView(getContentLayoutId());
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
configContentView();
configWindow();
}
}
package cn.com.founder.arcgislib.nonavi.widget.popup;
import android.content.Context;
import android.content.DialogInterface;
import android.view.Gravity;
import android.view.View;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/4/2 10:27
* EMail:luo_shaopeng@founder.com.cn
* Description:类似popup的dialog--辅助类
*/
public class PopupLayout {
private PopupDialog mPopupDialog;//内部使用的Dialog
private static DismissListener mDismissListener;//监听弹出窗口的消失事件
public static int POSITION_LEFT= Gravity.LEFT;//从最左侧弹出
public static int POSITION_RIGHT= Gravity.RIGHT;//右侧
public static int POSITION_CENTER= Gravity.CENTER;//从中间浮现
public static int POSITION_TOP= Gravity.TOP;//从顶部弹出
public static int POSITION_BOTTOM= Gravity.BOTTOM;//从底部弹出
public PopupLayout(Context context, View contentView){
mPopupDialog=new PopupDialog(context);
mPopupDialog.setContentLayout(contentView);
initListener();
}
// /**
// * 初始化PopLayout
// * @param context
// * @param contentLayoutId 内容布局Id
// */
// public PopupLayout init(Context context, @LayoutRes int contentLayoutId){
// PopupLayout popupLayout=new PopupLayout();
// mPopupDialog=new PopupDialog(context);
// mPopupDialog.setContentLayout(contentLayoutId);
// popupLayout.initListener();
// return popupLayout;
// }
//
// /**
// * 初始化PopLayout
// * @param context
// * @param contentView 内容布局
// */
// public PopupLayout init(Context context, View contentView){
// PopupLayout popupLayout=new PopupLayout();
// mPopupDialog=new PopupDialog(context);
// mPopupDialog.setContentLayout(contentView);
// initListener();
// return popupLayout;
// }
//初始化Dialog监听器
private void initListener(){
mPopupDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if(mDismissListener!=null){
mDismissListener.onDismiss();
}
}
});
}
/**
* 设置是否使用圆角特性
*/
public void setUseRadius(boolean useRadius){
if(mPopupDialog!=null){
mPopupDialog.setUseRadius(useRadius);
}
}
/**
* 默认从底部弹出
*/
public void show(){
show(POSITION_BOTTOM);
}
/**
* 从指定位置弹出/显示
* @param position 指定位置
*/
public void show(int position){
if(mPopupDialog==null){
return;
}
mPopupDialog.setWindowGravity(position);
mPopupDialog.show();
}
public boolean isShowing(){
if(mPopupDialog==null){
return false;
}
return mPopupDialog.isShowing();
}
/**
* @param isCancel 是否取消
*/
public void setCanceledOnTouchOutside(boolean isCancel){
mPopupDialog.setCanceledOnTouchOutside(isCancel);
}
/**
* @param isCancel 是否取消
*/
public void setCancelable(boolean isCancel){
mPopupDialog.setCancelable(isCancel);
}
/**
* 设置弹出布局的高度
* @param height 高度
* @param dpMode 是否以dp为单位
*/
public void setHeight(int height,boolean dpMode){
if(dpMode){
mPopupDialog.setWindowHeight(dp2Px(mPopupDialog.getContext(),height));
}else{
mPopupDialog.setWindowHeight(height);
}
}
/**
* 设置弹出布局的宽度
* @param width 宽度
* @param dpMode 是否以dp为单位
*/
public void setWidth(int width,boolean dpMode){
if(dpMode){
mPopupDialog.setWindowWidth(dp2Px(mPopupDialog.getContext(),width));
}else{
mPopupDialog.setWindowWidth(width);
}
}
/**
* 隐藏弹出布局(不会销毁弹出布局),不会触发DismissListener
* 建议使用dismiss()方法
*/
public void hide(){
if(mPopupDialog!=null){
mPopupDialog.hide();
}
}
/**
* 隐藏弹出布局(同时会销毁弹出布局,释放资源),建议使用
* 注意,在Activity退出时必须使用该方法销毁弹出布局,释放资源
*/
public void dismiss(){
if(mPopupDialog!=null){
mPopupDialog.dismiss();
}
}
/**
* 设置弹出布局消失的监听器
* @param dismissListener 监听器
*/
public void setDismissListener(DismissListener dismissListener){
mDismissListener=dismissListener;
}
//监听弹出窗口消失事件的监听器
public interface DismissListener{
void onDismiss();
}
/**
* dp转px
*/
private static int dp2Px(Context context, int dp) {
if (context == null) {
return 0;
}
return (int)(dp * context.getResources().getDisplayMetrics().density);
}
}
package cn.com.founder.arcgislib.nonavi.zoom;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.view.ArcGisMapZoomView;
import cn.com.founder.arcgislib.nonavi.zoom.listener.IZoomClickListener;
import cn.com.founder.arcgislib.nonavi.zoom.option.IArcGisZoomOption;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:49
* EMail:luo_shaopeng@founder.com.cn
* Description:缩放
*/
public class ArcGisZoom implements IArcGisZoomOption {
/**
* {@link ArcGisMapZoomView}
*/
private ArcGisMapZoomView mArcGisZoomView;
public ArcGisZoom(ArcGisMapZoomView arcGisZoomView) {
this.mArcGisZoomView = arcGisZoomView;
}
/**
* @param width int-缩放布局的宽度
*/
@Override
public IArcGisZoomOption setZoomWidth(int width) {
mArcGisZoomView.setZoomWidth(width);
return this;
}
/**
* @param height int-缩放布局的高度
*/
@Override
public IArcGisZoomOption setZoomHeight(int height) {
mArcGisZoomView.setZoomHeight(height);
return this;
}
/**
* @param bg int(资源ID)-缩放布局的背景
*/
@Override
public IArcGisZoomOption setZoomBackground(int bg) {
mArcGisZoomView.setZoomBackground(bg);
return this;
}
/**
* @param horizontal boolean-缩放布局是否水平方向
*/
@Override
public IArcGisZoomOption isHorizontal(boolean horizontal) {
mArcGisZoomView.isHorizontal(horizontal);
return this;
}
/**
* @param num int-放大倍数
*/
@Override
public IArcGisZoomOption setZoomInNum(int num) {
mArcGisZoomView.setZoomInNum(num);
return this;
}
/**
* @param num int-缩小倍数
*/
@Override
public IArcGisZoomOption setZoomOutNum(int num) {
mArcGisZoomView.setZoomOutNum(num);
return this;
}
/**
* @param zoomInImage int(资源ID)-放大布局图片
*/
@Override
public IArcGisZoomOption setZoomInImage(int zoomInImage) {
mArcGisZoomView.setZoomInImage(zoomInImage);
return this;
}
/**
* @param zoomOutImage int(资源ID)-缩小布局图片
*/
@Override
public IArcGisZoomOption setZoomOutImage(int zoomOutImage) {
mArcGisZoomView.setZoomOutImage(zoomOutImage);
return this;
}
/**
* @param showText boolean-是否显示文字
*/
@Override
public IArcGisZoomOption setShowText(boolean showText) {
mArcGisZoomView.setShowText(showText);
return this;
}
/**
* @param zoomInText String-放大布局的文字
*/
@Override
public IArcGisZoomOption setZoomInText(String zoomInText) {
mArcGisZoomView.setZoomInText(zoomInText);
return this;
}
/**
* @param zoomOutText String-缩小布局的文字
*/
@Override
public IArcGisZoomOption setZoomOutText(String zoomOutText) {
mArcGisZoomView.setZoomOutText(zoomOutText);
return this;
}
/**
* @param fontSize int-缩放布局的文字大小
*/
@Override
public IArcGisZoomOption setFontSize(int fontSize) {
mArcGisZoomView.setFontSize(fontSize);
return this;
}
/**
* @param fontColor int-缩放布局的文字颜色
*/
@Override
public IArcGisZoomOption setFontColor(int fontColor) {
mArcGisZoomView.setFontColor(fontColor);
return this;
}
/**
* @param zoomClickListener 缩放事件监听
*/
@Override
public IArcGisZoomOption setZoomClickListener(IZoomClickListener zoomClickListener) {
mArcGisZoomView.setZoomClickListener(zoomClickListener);
return this;
}
/**
* @param location {@link Variable.ViewLocation }zoom显示位置
*/
@Override
public IArcGisZoomOption setZoomViewLocation(Variable.ViewLocation location) {
mArcGisZoomView.setZoomViewLocation(location);
return this;
}
}
package cn.com.founder.arcgislib.nonavi.zoom.listener;
import android.view.View;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/5 11:27
* EMail:luo_shaopeng@founder.com.cn
* Description:缩放控件监听事件
*/
public interface IZoomClickListener {
/**
* @param view 放大布局
* @param scale 当前放大的级别
*/
void zoomInClick(View view,double scale);
/**
* @param view 缩小布局
* @param scale 当前缩小的级别
*/
void zoomOutClick(View view,double scale);
}
package cn.com.founder.arcgislib.nonavi.zoom.option;
import cn.com.founder.arcgislib.nonavi.common.Variable;
import cn.com.founder.arcgislib.nonavi.zoom.listener.IZoomClickListener;
/**
* Copyright: 方正国际软件有限公司
* Author:luo_shaopeng
* Date:2019/11/4 16:21
* EMail:luo_shaopeng@founder.com.cn
* Description:地图缩放控件
*/
public interface IArcGisZoomOption {
/**
* @param width 缩放控件宽度
*/
IArcGisZoomOption setZoomWidth(int width);
/**
* @param height 缩放控件高度
*/
IArcGisZoomOption setZoomHeight(int height);
/**
* @param bg 缩放控件背景色
*/
IArcGisZoomOption setZoomBackground(int bg);
/**
* @param horizontal 缩放控件是否水平方向
*/
IArcGisZoomOption isHorizontal(boolean horizontal);
/**
* @param num 放大倍数
*/
IArcGisZoomOption setZoomInNum(int num);
/**
* @param num 缩小倍数
*/
IArcGisZoomOption setZoomOutNum(int num);
/**
* @param zoomInImage 缩放控件-放大图片
*/
IArcGisZoomOption setZoomInImage(int zoomInImage);
/**
* @param zoomOutImage 缩放控件-缩小图片
*/
IArcGisZoomOption setZoomOutImage(int zoomOutImage);
/**
* @param showText 缩放控件是否显示文字
*/
IArcGisZoomOption setShowText(boolean showText);
/**
* @param zoomInText 缩放控件-放大文字
*/
IArcGisZoomOption setZoomInText(String zoomInText);
/**
* @param zoomOutText 缩放控件-缩小文字
*/
IArcGisZoomOption setZoomOutText(String zoomOutText);
/**
* @param fontSize 缩放控件-文字大小
*/
IArcGisZoomOption setFontSize(int fontSize);
/**
* @param fontColor 缩放控件-文字颜色
*/
IArcGisZoomOption setFontColor(int fontColor);
/**
* @param zoomClickListener 缩放控件放大/缩小点击事件
*/
IArcGisZoomOption setZoomClickListener(IZoomClickListener zoomClickListener);
/**
* @param location {@link Variable.ViewLocation }zoom显示位置
*/
IArcGisZoomOption setZoomViewLocation(Variable.ViewLocation location);
}
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="100%"
android:toYDelta="0%"
android:duration="350"/>
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="-100%"
android:toXDelta="0%"
android:duration="400"/>
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="100%"
android:toXDelta="0%"
android:duration="400"/>
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="-100%"
android:toYDelta="0%"
android:duration="350"/>
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="0%"
android:toYDelta="100%"
android:duration="300"/>
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0%"
android:toXDelta="-100%"
android:duration="300"/>
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0%"
android:toXDelta="100%"
android:duration="300"/>
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="0%"
android:toYDelta="-100%"
android:duration="300"/>
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="120"
android:fromXDelta="0"
android:interpolator="@android:anim/cycle_interpolator"
android:repeatCount="2"
android:repeatMode="restart"
android:toXDelta="10" />
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<layer-list>
<item android:left="1.5dip" android:top="1.0dip">
<shape>
<solid android:color="#1A000000"/>
<corners android:radius="5.0dip"/>
</shape>
</item>
<item android:bottom="1.50dip" android:right="1.0dip">
<shape>
<solid android:color="#fff"/>
<corners android:radius="5.0dip"/>
</shape>
</item>
</layer-list>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true">
<shape
android:shape="rectangle">
<corners
android:radius="5dp" />
<solid android:color="#1A000000"/>
</shape>
</item>
<item android:state_pressed="false">
<shape
android:shape="rectangle">
<solid android:color="#00000000"/>
<corners android:radius="5dp"/>
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke android:color="@color/colorBg"
android:width="@dimen/dimen_block_1"
/>
<solid android:color="@color/colorWhite"/>
<corners android:radius="@dimen/dimen_block_2"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<stroke android:width="@dimen/dimen_block_1"
android:color="@color/color_BFBFBF"/>
<solid android:color="@color/colorBg" />
<corners android:radius="100dip"/>
</shape>
</item>
<item android:state_pressed="false">
<shape android:shape="rectangle">
<stroke android:width="@dimen/dimen_block_1"
android:color="@color/color_BFBFBF"/>
<solid android:color="@color/colorWhite" />
<corners android:radius="100dip"/>
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="@color/color_666666" />
<size android:width="2dp"/>
<corners android:radius="100dip"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="@dimen/corner_radius"/>
<stroke android:width="@dimen/dimen_block_1"
android:color="@color/color_BFBFBF"/>
<solid android:color="@color/colorWhite"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:topLeftRadius="@dimen/corner_radius"
android:topRightRadius="@dimen/corner_radius"/>
<solid android:color="@android:color/white"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="@dimen/corner_radius"/>
<solid android:color="@android:color/white"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:bottomRightRadius="@dimen/corner_radius"
android:topRightRadius="@dimen/corner_radius"/>
<solid android:color="@android:color/white"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@android:color/white"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:topLeftRadius="@dimen/corner_radius"
android:bottomLeftRadius="@dimen/corner_radius"/>
<solid android:color="@android:color/white"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:bottomLeftRadius="@dimen/corner_radius"
android:bottomRightRadius="@dimen/corner_radius"/>
<solid android:color="@android:color/white"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape
android:shape="rectangle"
>
<solid
android:color="@color/colorBg"/>
</shape>
</item>
<item android:state_pressed="false">
<shape
android:shape="rectangle"
>
<solid
android:color="@color/colorWhite"/>
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<stroke android:width="1dp" android:color="@color/color_BFBFBF" />
<solid android:color="@color/colorBg" />
<corners android:radius="5dp" />
</shape>
</item>
<item>
<shape>
<stroke android:width="1dp" android:color="@color/color_BFBFBF" />
<solid android:color="@color/colorWhite" />
<corners android:radius="5dp" />
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 填充的颜色 -->
<solid android:color="@color/white" />
<!-- 设置按钮的四个角为弧形 -->
<!-- android:radius 弧形的半径 -->
<corners android:radius="10dp" />
<!-- padding:Button里面的文字与Button边界的间隔 -->
<padding
android:top="3dp"
android:bottom="3dp"
/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<corners android:radius="@dimen/dimen_block_5"/>
<solid android:color="@color/color_CCCCCC"/>
<stroke android:color="@color/color_CCCCCC"
android:width="@dimen/dimen_block_1"
/>
</shape>
</item>
<item android:state_pressed="false">
<shape>
<corners android:radius="@dimen/dimen_block_5"/>
<solid android:color="@color/colorWhite"/>
<stroke android:color="@color/color_CCCCCC"
android:width="@dimen/dimen_block_1"
/>
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape >
<corners android:radius="@dimen/dimen_block_5"/>
<solid android:color="@color/color_CCCCCC"/>
</shape>
</item>
<item android:state_pressed="false">
<shape >
<corners android:radius="@dimen/dimen_block_5"/>
<solid android:color="@color/color_E6E6E6"/>
</shape>
</item>
</selector>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke android:color="@color/color_CCCCCC"
android:width="@dimen/dimen_block_1"/>
<corners android:radius="@dimen/dimen_block_5"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<corners android:radius="@dimen/dimen_block_5"/>
<solid android:color="@color/color_1A34BC"/>
<stroke android:color="@color/color_1A34BC"
android:width="@dimen/dimen_block_1"
/>
</shape>
</item>
<item android:state_pressed="false">
<shape>
<corners android:radius="@dimen/dimen_block_5"/>
<solid android:color="@color/colorWhite"/>
<stroke android:color="@color/color_13227A"
android:width="@dimen/dimen_block_1"
/>
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<rotate
android:fromDegrees="45"
android:pivotX="-40%"
android:pivotY="90%">
<shape android:shape="rectangle">
<solid android:color="@color/color_E6E6E6" />
<size android:width="16dip"
android:height="16dip"/>
<stroke android:color="@color/color_999999" />
</shape>
</rotate>
</item>
</layer-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path android:pathData="M512 1024C229.243871 1024 0 794.756129 0 512 0 229.243871 229.243871 0 512 0 794.756129 0 1024 229.243871 1024 512 1024 794.756129 794.756129 1024 512 1024z m0-33.032258C776.522323 990.967742 990.967742 776.522323 990.967742 512S776.522323 33.032258 512 33.032258 33.032258 247.477677 33.032258 512 247.477677 990.967742 512 990.967742z" android:fillColor="#515151"></path>
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillColor="#515151"
android:pathData="M895.592468 324.921207l-277.489942 0L618.102526
149.797701c0-43.784202-36.72339-79.605036-81.618902-79.605036l-48.960085
0c-44.898583 0-81.625042 35.820833-81.625042 79.605036l0 175.123506L128.411625
324.921207c-17.958 0-32.649608 14.334473-32.649608 31.846312l0 159.198815c0
17.521049 14.691607 31.853475 32.649608 31.853475l16.320711 0 0 245.972111c0
70.053496-16.320711 128.169101-16.320711 128.169101 0 17.510816 14.687514
31.844266 32.641421 31.844266l701.890838 0c17.962094 0 32.647561-14.338566
32.647561-31.844266 0 0-16.324804-60.506049-16.324804-131.354654L879.266641
547.820833l16.324804 0c17.958 0 32.645514-14.334473
32.645514-31.846312L928.236959 356.768543C928.237983 339.250564 913.554562
324.921207 895.592468 324.921207zM885.113813 489.832118c0 8.756431-7.343245
15.920598-16.324804 15.920598L155.213038 505.752716c-8.982582
0-16.324804-7.164167-16.324804-15.920598L138.888234 382.907876c0-8.760524
7.343245-15.922644 16.324804-15.922644l293.810652 0L449.02369
157.753907c0-31.045063 25.305339-45.49517 57.133232-45.49517l11.689227
0c31.827893 0 57.127092 14.450107 57.127092 45.49517l0 209.231325 293.814746
0c8.982582 0 16.324804 7.161097 16.324804 15.922644L885.11279
489.832118zM687.47143 699.067536l-8.16496 0c-6.523577 0-12.239765
5.570879-12.239765 11.941983l0 200.726627L536.483624 911.736147 536.483624
711.00952c0-6.371104-5.708002-11.941983-12.245905-11.941983l-8.157797 0c-6.52153
0-12.235672 5.570879-12.235672 11.941983l0 200.726627L365.097232 911.736147
365.097232 711.00952c0-6.371104-5.714142-11.941983-12.249999-11.941983l-8.15575
0c-6.525624 0-12.243859 5.570879-12.243859 11.941983l0 200.726627L171.529655
911.736147c0 0 16.322757-47.092551 16.322757-117.943203l0-245.972111 648.294153
0 0 245.972111c0 70.850651 16.320711 117.943203 16.320711 117.943203L699.712219
911.736147 699.712219 711.00952C699.712219 704.638415 694.003194 699.067536
687.47143 699.067536z" />
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillColor="#515151"
android:pathData="M512.26337 1023.998035C230.325313 1023.998035 0.98076 794.31739 0.98076
511.998035 0.98076 229.680645 230.325313 0.001965 512.26337 0.001965 560.582019
0.001965 612.556407 8.044591 670.210948 24.528829L622.839647
71.945336C587.023232 62.927846 551.485912 58.682472 512.26337 58.682472
262.637328 58.682472 59.58658 262.037866 59.58658 511.998035 59.58658 761.962134
262.637328 965.313597 512.26337 965.313597 753.734756 965.313597 951.669436
775.006833 964.324975 536.289044L1023.017274 536.289044C1010.324392 807.385674
786.095908 1023.998035 512.26337 1023.998035ZM251.978687 485.197144 292.673351
444.447447 458.728415 610.69709 919.31418 149.507931 959.961674 190.212422
458.728415 692.155209 251.978687 485.197144Z" />
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path android:pathData="M613.18144 997.376c9.1136 31.3856 55.7568 36.352 72.6016 7.68l333.568-567.9616c10.24-17.408 3.072-39.0656-16.0768-48.384-19.1488-9.3184-42.9056-2.7648-53.1456 14.6432l-286.464 487.7824L413.80864 26.624C404.79744-4.1984 359.33184-9.7792 341.82144 17.8176L5.28384 546.816c-10.8544 17.0496-4.4544 38.912 14.336 48.8448 18.7392 9.9328 42.752 4.096 53.6064-13.0048l288.8704-453.9904 251.0848 868.6592z" android:fillColor="#616161"></path>
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillColor="#515151"
android:pathData="M572.261479 238.303454l378.358257 272.04186L572.261479 782.425036 572.261479
655.323243l0-41.434691-40.812521 0c-147.622152 0.040932-325.443094
0.125867-479.67785 181.236737 41.178865-256.896928 199.330838-383.66717
480.084103-386.42191l40.405245-0.414439 0-41.020252L572.260455 238.303454
572.261479 238.303454zM531.448958 158.145833 531.448958 158.145833l0
209.122855c-502.675634 4.929266-531.428491 399.703401-531.428491 576.401776
153.680125-278.234909 335.421352-288.262286 531.428491-288.347221l0 207.215412
489.756393-352.194364L531.448958 158.145833" />
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path android:pathData="M25.6 998.4h977.92V20.48H25.6v977.92zM0 0h1024v1024H0V0z" android:fillColor="#515151"></path>
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path android:pathData="M899.234286 30.114286L610 496.114286l-12.994286 20.925714 17.931429 16.88L959.44 858.285714 198.857143 989.577143 33.325714 337.988571l297.257143-307.874285h568.651429M953.382857 0H317.794286L0 329.142857l176.548571 694.857143L1024 877.714286 635.588571 512 953.382857 0z" android:fillColor="#515151"></path>
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillColor="#515151"
android:pathData="M999.919 914.938a24.039 24.039 0 0
1-23.559-19.28c-0.312-1.506-16.066-73.449-83.253-144.106-85.55-89.974-217.921-139.479-383.897-143.812v195.482c0
9.034-5.068 17.334-13.111 21.411-8.062 4.113-17.72 3.379-25.046-1.946L9.945
488.423C3.72 483.906 0.01 476.671 0.01 468.978s3.673-14.928 9.878-19.463L471
113.708a24.104 24.104 0 0 1 25.082-2.001 24.068 24.068 0 0 1 13.129
21.447v207.564c29.71 1.083 81.527 5.49 141.608 21.447 95.63 25.377 175.01 69.666
235.972 131.62 93.812 95.372 139.975 229.122 137.183 397.502-0.184 12.302-9.622
22.438-21.87 23.54-0.733 0.074-1.468 0.111-2.184 0.111z m-514.744-355.6c106.591
0 201.083 16.783 280.903 49.87 64.69 26.81 119.867 64.342 164.029 111.495a419.81
419.81 0 0 1 37.348 45.905c-16.012-97.502-54.462-177.598-114.947-239.074C722.321
395.18 529.573 388.478 492.261 388.478c-3.984 0-6.17 0.091-6.206 0.091a24.176
24.176 0 0 1-17.572-6.72 24.13 24.13 0 0 1-7.364-17.334V180.417L64.975 468.905
461.12 756.069V583.392c0-13.294 10.76-24.055 24.055-24.055z" />
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<corners android:bottomLeftRadius="@dimen/dimen_block_5"
android:bottomRightRadius="@dimen/dimen_block_5"
/>
<solid android:color="@color/colorBg" />
</shape>
</item>
<item android:state_pressed="false">
<shape android:shape="rectangle">
<corners android:bottomLeftRadius="@dimen/dimen_block_5"
android:bottomRightRadius="@dimen/dimen_block_5" />
<solid android:color="@color/colorWhite" />
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<corners android:topLeftRadius="@dimen/dimen_block_5"
android:topRightRadius="@dimen/dimen_block_5"
/>
<solid android:color="@color/colorBg" />
</shape>
</item>
<item android:state_pressed="false">
<shape android:shape="rectangle">
<corners android:topLeftRadius="@dimen/dimen_block_5"
android:topRightRadius="@dimen/dimen_block_5" />
<solid android:color="@color/colorWhite" />
</shape>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<layer-list>
<item android:left="@dimen/dimen_block_1_half" android:top="@dimen/dimen_block_1">
<shape>
<solid android:color="#1A000000"/>
<corners android:radius="@dimen/dimen_block_5"/>
</shape>
</item>
<item android:left="@dimen/dimen_block_1_half" android:top="@dimen/dimen_block_1">
<shape>
<solid android:color="@color/colorWhite"/>
<corners android:radius="@dimen/dimen_block_5"/>
</shape>
</item>
</layer-list>
</item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/WrapContent.WidthMatchParent"
android:background="@drawable/bg_white_click_selector"
android:padding="@dimen/dimen_block_10">
<ImageView
android:id="@+id/item_search_selected_iv"
style="@style/WrapContent"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:src="@drawable/icon_right_arrow"
/>
<LinearLayout
style="@style/WrapContent.WidthMatchParent"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/item_search_selected_iv"
android:orientation="vertical"
android:paddingRight="@dimen/dimen_block_10"
android:gravity="center_vertical|left"
>
<TextView
android:id="@+id/item_search_title_tv"
style="@style/WrapContent.main_text_style"
android:layout_gravity="center_vertical"
/>
<TextView
android:id="@+id/item_search_address_tv"
style="@style/WrapContent.main_text_style"
android:textColor="@color/color_999999"
android:layout_marginTop="@dimen/dimen_block_3"
/>
</LinearLayout>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<com.esri.arcgisruntime.mapping.view.MapView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/founder_arc_gis_mapview"
style="@style/MatchParent" />
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/WrapContent.WidthMatchParent"
android:orientation="vertical"
>
<TextView
style="@style/WrapContent.WidthMatchParent"
android:visibility="invisible"
android:text="为了解决铺满一行的情况,暂时这样处理,后期看源码,看哪里除了问题,主要是EditText不能沾满一行,很难理解,也理解不了,这要是上天的节奏么,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊" />
<LinearLayout
android:id="@+id/callout_xy_ll"
style="@style/WrapContent.WidthMatchParent"
android:paddingTop="@dimen/dimen_block_10"
android:paddingLeft="@dimen/dimen_block_10"
android:paddingRight="@dimen/dimen_block_10"
android:orientation="vertical"
android:layout_toLeftOf="@+id/callout_info_iv">
<TextView
android:id="@+id/callout_x_tv"
style="@style/WrapContent.main_text_style"
/>
<TextView
android:id="@+id/callout_y_tv"
style="@style/WrapContent.main_text_style"
android:layout_marginTop="@dimen/dimen_block_5"
/>
<TextView
android:id="@+id/callout_address_tv"
style="@style/WrapContent.main_text_style"
android:layout_marginTop="@dimen/dimen_block_5"/>
<TextView
android:id="@+id/callout_poi_tv"
style="@style/WrapContent.main_text_style"
android:layout_marginTop="@dimen/dimen_block_5"/>
<TextView
android:id="@+id/callout_label_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_callout_desc_label"
android:textColor="@color/color_999999"
android:paddingTop="@dimen/dimen_block_10"
android:paddingBottom="@dimen/dimen_block_5" />
</LinearLayout>
<LinearLayout
android:id="@+id/callout_del_ll"
style="@style/WrapContent"
android:orientation="vertical"
android:layout_below="@+id/callout_info_iv"
android:layout_alignParentRight="true"
android:background="@color/colorWhite"
android:layout_marginRight="@dimen/dimen_block_10"
android:layout_marginTop="-17dip"
android:visibility="gone"
>
<ImageView
style="@style/WrapContent"
android:src="@drawable/callout_triangle_bg"
android:layout_alignParentRight="true"
android:layout_gravity="right"
android:layout_marginRight="@dimen/dimen_block_5"
/>
<TextView
android:id="@+id/callout_del_tv"
style="@style/WrapContent.main_text_style"
android:text="删除当前点"
android:background="@drawable/callout_info_bg"
android:padding="@dimen/dimen_block_10"
android:layout_marginTop="-2dip"
android:textColor="@color/color_999999"
/>
</LinearLayout>
<ImageView
android:id="@+id/callout_info_iv"
style="@style/WrapContent"
android:src="@drawable/icon_info"
android:layout_alignParentRight="true"
android:padding="@dimen/dimen_block_10" />
<EditText
android:id="@+id/callout_desc_et"
style="@style/WrapContent.WidthMatchParent"
android:minHeight="120dp"
android:padding="@dimen/dimen_block_10"
android:background="@drawable/callout_label_bg"
android:textColor="@color/color_333333"
android:textSize="@dimen/dimen_font_16sp"
android:hint="@string/string_callout_desc_hint"
android:gravity="top|left"
android:layout_below="@+id/callout_xy_ll"
android:layout_marginTop="@dimen/dimen_block_2"
android:layout_marginLeft="@dimen/dimen_block_10"
android:layout_marginRight="@dimen/dimen_block_10"
android:layout_marginBottom="@dimen/dimen_block_10"
android:textCursorDrawable="@null"
/>
<LinearLayout
style="@style/WrapContent.WidthMatchParent"
android:orientation="horizontal"
android:layout_below="@+id/callout_desc_et"
android:layout_marginTop="@dimen/dimen_block_15"
android:layout_marginBottom="@dimen/dimen_block_10"
android:gravity="center">
<TextView
android:id="@+id/callout_cancel_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_common_cancel"
android:background="@drawable/callout_cancle_bt_bg"
android:textColor="@color/color_999999"
android:paddingTop="@dimen/dimen_block_8"
android:paddingBottom="@dimen/dimen_block_8"
android:paddingLeft="@dimen/dimen_block_20"
android:paddingRight="@dimen/dimen_block_20"
android:gravity="center"
android:layout_gravity="center" />
<TextView
android:id="@+id/callout_ok_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_common_ok"
android:background="@drawable/callout_ok_bt_bg"
android:textColor="@color/color_13227A"
android:paddingTop="@dimen/dimen_block_8"
android:paddingBottom="@dimen/dimen_block_8"
android:paddingLeft="@dimen/dimen_block_20"
android:paddingRight="@dimen/dimen_block_20"
android:gravity="center"
android:layout_gravity="center"
android:layout_marginLeft="40dip"
/>
</LinearLayout>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/cluster_layout"
style="@style/MatchParent"
android:orientation="vertical"
android:layout_marginTop="120dip"
android:layout_marginLeft="@dimen/dimen_block_10"
android:layout_marginRight="@dimen/dimen_block_10"
android:layout_marginBottom="120dip"
android:gravity="right|top"
>
<ImageView
android:id="@+id/cluster_iv"
style="@style/WrapContent"
android:src="@drawable/icon_cluster"
/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/compasss_layout"
style="@style/MatchParent"
android:orientation="vertical"
android:layout_margin="@dimen/dimen_block_20"
>
<ImageView
android:id="@+id/compasss_iv"
style="@style/WrapContent"
android:src="@drawable/icon_compass_half"
/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
style="@style/WrapContent.WidthMatchParent"
android:background="@color/white">
<TextView
style="@style/WrapContent.WidthMatchParent"
android:gravity="left"
android:text="提示"
android:textSize="@dimen/dimen_font_18sp"
android:textColor="@color/black"
android:padding="@dimen/dimen_block_10" />
<TextView
android:id="@+id/dialog_text_msg_tv"
style="@style/WrapContent.WidthMatchParent"
android:text="djclkdajnfclkdsmcl;kdsamc"
android:textSize="@dimen/dimen_font_16sp"
android:textColor="@color/color_333333"
android:padding="@dimen/dimen_block_20" />
<View
android:layout_width="match_parent"
android:layout_height="0.5dip"
android:background="@color/color_CCCCCC" />
<Button
android:id="@+id/dialog_text_ok_bt"
style="@style/WrapContent.WidthMatchParent"
android:textColor="@color/color_13227A"
android:text="确定"
android:textSize="@dimen/dimen_font_16sp"
android:background="@color/white" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/draw_layout"
style="@style/MatchParent"
android:orientation="vertical"
android:layout_marginTop="@dimen/dimen_block_20"
android:layout_marginLeft="@dimen/dimen_block_10"
android:layout_marginRight="@dimen/dimen_block_10"
android:layout_marginBottom="120dip">
<LinearLayout
android:id="@+id/draw_content_layout"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="1dp"
android:paddingRight="1dp"
android:gravity="center"
android:background="@drawable/bg_draw_shadow_bg"
android:visibility="gone"
>
<LinearLayout
android:id="@+id/draw_line_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:background="@drawable/bg_draw_topcorner">
<ImageView
android:id="@+id/draw_line_iv"
android:layout_width="@dimen/dimen_block_35"
android:layout_height="@dimen/dimen_block_35"
android:padding="@dimen/dimen_block_10"
android:src="@drawable/draw_line" />
<TextView
android:id="@+id/draw_line_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_draw_line"
android:textColor="@color/color_515151"
android:paddingBottom="@dimen/dimen_block_5" />
</LinearLayout>
<TextView
android:id="@+id/spilt_line0"
android:layout_width="25dp"
android:layout_height="0.5dp"
android:background="#c5c5c5" />
<LinearLayout
android:id="@+id/draw_circle_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:background="@drawable/bg_draw_topcorner">
<ImageView
android:id="@+id/draw_circle_iv"
android:layout_width="@dimen/dimen_block_35"
android:layout_height="@dimen/dimen_block_35"
android:padding="@dimen/dimen_block_10"
android:src="@drawable/draw_circle" />
<TextView
android:id="@+id/draw_circle_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_draw_circle"
android:textColor="@color/color_515151"
android:paddingBottom="@dimen/dimen_block_5" />
</LinearLayout>
<TextView
android:id="@+id/spilt_line1"
android:layout_width="25dp"
android:layout_height="0.5dp"
android:background="#c5c5c5" />
<LinearLayout
android:id="@+id/draw_orthogon_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:background="@drawable/bg_draw_topcorner">
<ImageView
android:id="@+id/draw_orthogon_iv"
android:layout_width="@dimen/dimen_block_35"
android:layout_height="@dimen/dimen_block_35"
android:padding="@dimen/dimen_block_10"
android:src="@drawable/draw_orthogon" />
<TextView
android:id="@+id/draw_orthogon_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_draw_orthogon"
android:textColor="@color/color_515151"
android:paddingBottom="@dimen/dimen_block_5" />
</LinearLayout>
<TextView
android:id="@+id/spilt_line2"
android:layout_width="25dp"
android:layout_height="0.5dp"
android:background="#c5c5c5" />
<LinearLayout
android:id="@+id/draw_polygon_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:background="@drawable/bg_draw_topcorner">
<ImageView
android:id="@+id/draw_polygon_iv"
android:layout_width="@dimen/dimen_block_35"
android:layout_height="@dimen/dimen_block_35"
android:padding="@dimen/dimen_block_10"
android:src="@drawable/draw_polygon" />
<TextView
android:id="@+id/draw_polygon_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_draw_polygon"
android:textColor="@color/color_515151"
android:paddingBottom="@dimen/dimen_block_5" />
</LinearLayout>
<TextView
android:id="@+id/spilt_line3"
android:layout_width="25dp"
android:layout_height="0.5dp"
android:background="#c5c5c5" />
<LinearLayout
android:id="@+id/draw_prev_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:background="@drawable/bg_draw_topcorner">
<ImageView
android:id="@+id/draw_prev_iv"
android:layout_width="@dimen/dimen_block_35"
android:layout_height="@dimen/dimen_block_35"
android:padding="@dimen/dimen_block_10"
android:src="@drawable/draw_prev" />
<TextView
android:id="@+id/draw_prev_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_draw_prev"
android:textColor="@color/color_515151"
android:paddingBottom="@dimen/dimen_block_5" />
</LinearLayout>
<TextView
android:id="@+id/spilt_line4"
android:layout_width="25dp"
android:layout_height="0.5dp"
android:background="#c5c5c5" />
<LinearLayout
android:id="@+id/draw_next_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:background="@drawable/bg_draw_topcorner">
<ImageView
android:id="@+id/draw_next_iv"
android:layout_width="@dimen/dimen_block_35"
android:layout_height="@dimen/dimen_block_35"
android:padding="@dimen/dimen_block_10"
android:src="@drawable/draw_next" />
<TextView
android:id="@+id/draw_next_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_draw_next"
android:textColor="@color/color_515151"
android:paddingBottom="@dimen/dimen_block_5" />
</LinearLayout>
<TextView
android:id="@+id/spilt_line5"
android:layout_width="25dp"
android:layout_height="0.5dp"
android:background="#c5c5c5" />
<LinearLayout
android:id="@+id/draw_clear_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:background="@drawable/bg_draw_topcorner">
<ImageView
android:id="@+id/draw_clear_iv"
android:layout_width="@dimen/dimen_block_35"
android:layout_height="@dimen/dimen_block_35"
android:padding="@dimen/dimen_block_10"
android:src="@drawable/draw_clear" />
<TextView
android:id="@+id/draw_clear_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_draw_clear"
android:textColor="@color/color_515151"
android:paddingBottom="@dimen/dimen_block_5" />
</LinearLayout>
<TextView
android:id="@+id/spilt_line6"
android:layout_width="25dp"
android:layout_height="0.5dp"
android:background="#c5c5c5" />
<LinearLayout
android:id="@+id/draw_end_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:background="@drawable/bg_draw_topcorner">
<ImageView
android:id="@+id/draw_end_iv"
android:layout_width="@dimen/dimen_block_35"
android:layout_height="@dimen/dimen_block_35"
android:padding="@dimen/dimen_block_10"
android:src="@drawable/draw_end" />
<TextView
android:id="@+id/draw_end_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_draw_end"
android:textColor="@color/color_515151"
android:paddingBottom="@dimen/dimen_block_5" />
</LinearLayout>
</LinearLayout>
<RelativeLayout
android:id="@+id/draw_iv_layout"
style="@style/MatchParent"
android:gravity="right|top"
android:orientation="horizontal">
<ImageView
android:id="@+id/draw_iv"
style="@style/WrapContent"
android:src="@drawable/icon_draw"
android:layout_marginTop="140dip" />
</RelativeLayout>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/hot_pots_layout"
style="@style/MatchParent"
android:orientation="vertical"
android:layout_marginTop="70dip"
android:layout_marginLeft="@dimen/dimen_block_10"
android:layout_marginRight="@dimen/dimen_block_10"
android:layout_marginBottom="70dip"
android:gravity="right|top"
>
<ImageView
android:id="@+id/hot_pots_iv"
style="@style/WrapContent"
android:src="@drawable/icon_hot_pots"
/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
style="@style/WrapContent.WidthMatchParent"
android:padding="@dimen/dimen_block_10"
android:background="@color/colorWhite">
<RelativeLayout style="@style/WrapContent.WidthMatchParent">
<ImageView
android:id="@+id/hotpots_close_iv"
style="@style/WrapContent"
android:src="@drawable/icon_gray_close"
android:layout_alignParentRight="true"
android:paddingTop="@dimen/dimen_block_10"
android:paddingBottom="@dimen/dimen_block_10"
android:paddingLeft="@dimen/dimen_block_10" />
<TextView
style="@style/WrapContent.main_text_style"
android:text="@string/string_hotpots_title"
android:layout_centerInParent="true" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/hotpots_start_rl"
style="@style/WrapContent.WidthMatchParent"
android:background="@drawable/bg_navi_input"
android:layout_marginTop="@dimen/dimen_block_10">
<TextView
android:id="@+id/hotpots_start_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_hotpots_start_time"
android:textColor="@color/color_666666"
android:layout_centerVertical="true"
android:padding="@dimen/dimen_block_10" />
<View
android:id="@+id/hotpots_start_v"
android:layout_width="1dip"
android:layout_height="match_parent"
android:background="@color/color_BFBFBF"
android:layout_toRightOf="@+id/hotpots_start_tv"
android:layout_alignTop="@+id/hotpots_start_tv"
android:layout_alignBottom="@+id/hotpots_start_tv"
android:layout_centerVertical="true"
android:layout_marginTop="@dimen/dimen_block_10"
android:layout_marginBottom="@dimen/dimen_block_10" />
<TextView
android:id="@+id/hotpots_start_time_tv"
style="@style/WrapContent.WidthMatchParent"
android:background="@null"
android:textColor="@color/color_333333"
android:textSize="@dimen/dimen_font_16sp"
android:hint="@string/string_hotpots_input_hint"
android:layout_toRightOf="@+id/hotpots_start_v"
android:layout_centerVertical="true"
android:paddingTop="@dimen/dimen_block_15"
android:paddingBottom="@dimen/dimen_block_15"
android:paddingLeft="@dimen/dimen_block_10"
android:paddingRight="@dimen/dimen_block_10"
android:singleLine="true"
android:ellipsize="end"
/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/hotpots_end_rl"
style="@style/WrapContent.WidthMatchParent"
android:background="@drawable/bg_navi_input"
android:layout_marginTop="@dimen/dimen_block_15">
<TextView
android:id="@+id/hotpots_end_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_hotpots_end_time"
android:textColor="@color/color_666666"
android:layout_centerVertical="true"
android:padding="@dimen/dimen_block_10" />
<View
android:id="@+id/hotpots_end_v"
android:layout_width="1dip"
android:layout_height="match_parent"
android:background="@color/color_BFBFBF"
android:layout_toRightOf="@+id/hotpots_end_tv"
android:layout_alignTop="@+id/hotpots_end_tv"
android:layout_alignBottom="@+id/hotpots_end_tv"
android:layout_centerVertical="true"
android:layout_marginTop="@dimen/dimen_block_10"
android:layout_marginBottom="@dimen/dimen_block_10" />
<TextView
android:id="@+id/hotpots_end_time_tv"
style="@style/WrapContent.WidthMatchParent"
android:background="@null"
android:textColor="@color/color_333333"
android:textSize="@dimen/dimen_font_16sp"
android:layout_toRightOf="@+id/hotpots_end_v"
android:hint="@string/string_hotpots_input_hint"
android:layout_centerVertical="true"
android:paddingTop="@dimen/dimen_block_15"
android:paddingBottom="@dimen/dimen_block_15"
android:paddingLeft="@dimen/dimen_block_10"
android:paddingRight="@dimen/dimen_block_10"
android:singleLine="true"
android:ellipsize="end"
/>
</RelativeLayout>
<TextView
android:id="@+id/hotpots_finish_tv"
style="@style/WrapContent"
android:background="@drawable/bg_navi_bt"
android:text="@string/string_hotpots_finish"
android:textColor="@color/color_333333"
android:textSize="@dimen/dimen_font_16sp"
android:gravity="center"
android:layout_gravity="center"
android:layout_marginTop="@dimen/dimen_block_20"
android:layout_marginBottom="@dimen/dimen_block_10"
android:paddingLeft="40dip"
android:paddingRight="40dip"
android:paddingTop="@dimen/dimen_block_10"
android:paddingBottom="@dimen/dimen_block_10"
android:focusable="true"
android:clickable="true" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
style="@style/MatchParent">
<RelativeLayout
android:id="@+id/search_total_rl"
style="@style/WrapContent.WidthMatchParent">
<LinearLayout
android:id="@+id/search_ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen_block_20"
android:layout_marginLeft="@dimen/dimen_block_10"
android:layout_marginRight="@dimen/dimen_block_10"
android:layout_marginTop="@dimen/dimen_block_20"
android:background="@drawable/bg_white_stroke_gray_selector"
android:descendantFocusability="beforeDescendants"
android:gravity="center_vertical"
android:orientation="horizontal"
android:layout_toLeftOf="@+id/search_scroll_content_search_cancel_search_tv">
<LinearLayout
android:id="@+id/search_scroll_content_type_ll"
style="@style/WrapContent"
android:padding="@dimen/dimen_block_10"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/search_scroll_content_type_tv"
style="@style/WrapContent.main_text_style"
android:text="POI" />
<ImageView
android:layout_width="15dip"
android:layout_height="15dip"
android:src="@drawable/icon_down_arrow"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/dimen_block_5" />
</LinearLayout>
<ImageView
android:layout_width="20dip"
android:layout_height="20dip"
android:layout_marginLeft="@dimen/dimen_block_10"
android:layout_marginTop="2dip"
android:src="@drawable/icon_search"
android:visibility="gone" />
<EditText
android:id="@+id/search_scroll_content_search_et"
style="@style/WrapContent.WidthMatchParent"
android:textColor="@color/color_333333"
android:textSize="@dimen/dimen_font_16sp"
android:background="@null"
android:hint="@string/string_search_hint"
android:paddingLeft="@dimen/dimen_block_5"
android:paddingTop="@dimen/dimen_block_10"
android:paddingRight="@dimen/dimen_block_10"
android:paddingBottom="@dimen/dimen_block_10"
android:textColorHint="@color/color_CCCCCC"
android:imeOptions="actionSearch"
android:inputType="text"
android:textCursorDrawable="@drawable/bg_navi_et_cursor" />
</LinearLayout>
<TextView
android:id="@+id/search_scroll_content_search_cancel_search_tv"
style="@style/WrapContent.main_text_style"
android:layout_alignParentRight="true"
android:text="@string/string_common_cancel"
android:padding="@dimen/dimen_block_10"
android:layout_marginTop="@dimen/dimen_block_20"
android:layout_marginRight="@dimen/dimen_block_10" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/search_ll"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/search_swipeRecyclerView"
style="@style/WrapContent.WidthMatchParent"
android:paddingBottom="10dip"
android:visibility="gone" />
<LinearLayout
android:id="@+id/search_empty"
style="@style/MatchParent"
android:gravity="center"
android:orientation="vertical">
<TextView
style="@style/WrapContent.main_text_style"
android:text="@string/string_common_nodata" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/search_type_ll"
style="@style/WrapContent"
android:layout_below="@+id/search_ll"
android:background="@drawable/bg_gray_stock"
android:layout_marginLeft="@dimen/dimen_block_10"
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/search_type_poi_tv"
style="@style/WrapContent.main_text_style"
android:text="POI"
android:padding="@dimen/dimen_block_10" />
<View
android:layout_width="match_parent"
android:layout_height="1dip"
android:background="@color/colorBg" />
<TextView
android:id="@+id/search_type_dw_tv"
style="@style/WrapContent.main_text_style"
android:text="实有单位"
android:padding="@dimen/dimen_block_10" />
<View
android:layout_width="match_parent"
android:layout_height="1dip"
android:background="@color/colorBg" />
<TextView
android:id="@+id/search_type_fw_tv"
style="@style/WrapContent.main_text_style"
android:text="实有房屋"
android:padding="@dimen/dimen_block_10" />
<View
android:layout_width="match_parent"
android:layout_height="1dip"
android:background="@color/colorBg" />
<TextView
android:id="@+id/search_type_dz_tv"
style="@style/WrapContent.main_text_style"
android:text="标准地址"
android:padding="@dimen/dimen_block_10" />
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/location_layout"
style="@style/MatchParent"
android:orientation="vertical"
android:layout_marginTop="@dimen/dimen_block_20"
android:layout_marginLeft="@dimen/dimen_block_10"
android:layout_marginRight="@dimen/dimen_block_10"
android:layout_marginBottom="120dip"
android:gravity="bottom|right"
>
<ImageView
android:id="@+id/import_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dip"
android:visibility="gone"
android:src="@drawable/icon_import"/>
<ImageView
android:id="@+id/location_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_location"
/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/net_layout"
android:orientation="vertical"
style="@style/MatchParent"
android:gravity="center"
>
<TextView
style="@style/WrapContent.main_text_style"
android:text="请检查网络连接"
android:padding="@dimen/dimen_block_10"
android:layout_marginTop="-2dip"
android:textColor="@color/color_999999"
android:layout_gravity="center"
/>
<TextView
android:id="@+id/net_tv"
style="@style/WrapContent.main_text_style"
android:text="点击重试"
android:background="@drawable/callout_info_bg"
android:padding="@dimen/dimen_block_10"
android:textColor="@color/color_333333"
android:layout_gravity="center"
/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/MatchParent">
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/MatchParent">
<LinearLayout
android:id="@+id/search_total_ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen_block_20"
android:layout_marginLeft="@dimen/dimen_block_10"
android:layout_marginRight="@dimen/dimen_block_10"
android:layout_marginTop="@dimen/dimen_block_20"
android:background="@drawable/bg_white_stroke_gray_selector"
android:gravity="center_vertical"
android:layout_alignParentBottom="true"
android:orientation="horizontal">
<ImageView
android:layout_width="20dip"
android:layout_height="20dip"
android:layout_marginLeft="@dimen/dimen_block_10"
android:layout_marginTop="2dip"
android:src="@drawable/icon_search" />
<TextView
android:id="@+id/search_result_tv"
style="@style/WrapContent.WidthMatchParent"
android:textColor="@color/color_333333"
android:textSize="@dimen/dimen_font_16sp"
android:background="@null"
android:hint="@string/string_search_hint"
android:paddingLeft="@dimen/dimen_block_5"
android:paddingTop="@dimen/dimen_block_10"
android:paddingRight="@dimen/dimen_block_10"
android:paddingBottom="@dimen/dimen_block_10"
android:textColorHint="@color/color_CCCCCC"
/>
</LinearLayout>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/zoom_total_layout"
style="@style/MatchParent"
android:orientation="vertical"
android:gravity="bottom">
<LinearLayout
android:id="@+id/zoom_content_layout"
style="@style/WrapContent"
android:background="@drawable/zoom_shadow_bg"
android:layout_marginLeft="@dimen/dimen_block_10"
android:layout_marginRight="@dimen/dimen_block_10"
android:layout_marginTop="@dimen/dimen_block_20"
android:layout_marginBottom="120dip"
android:gravity="center"
android:orientation="vertical">
<LinearLayout
android:id="@+id/zoom_in_layout"
style="@style/WrapContent"
android:gravity="center"
android:orientation="vertical"
android:padding="@dimen/dimen_block_10"
android:background="@drawable/zoom_bt_top_corner">
<ImageView
android:id="@+id/zoom_in_iv"
android:layout_width="@dimen/dimen_zoom_btn_size"
android:layout_height="@dimen/dimen_zoom_btn_size"
android:padding="@dimen/dimen_block_5"
android:src="@drawable/icon_zoom_add" />
<TextView
android:id="@+id/zoom_in_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_zoom_in"
android:textSize="@dimen/dimen_font_14sp"
/>
</LinearLayout>
<TextView
android:id="@+id/spilt_line_hor"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/color_CCCCCC" />
<TextView
android:id="@+id/spilt_line_ver"
android:layout_width="1dip"
android:layout_height="match_parent"
android:background="@color/color_CCCCCC"
android:visibility="gone"
/>
<LinearLayout
android:id="@+id/zoom_out_layout"
style="@style/WrapContent"
android:gravity="center"
android:orientation="vertical"
android:padding="@dimen/dimen_block_10"
android:background="@drawable/zoom_bt_bottom_corner">
<ImageView
android:id="@+id/zoom_out_iv"
android:layout_width="@dimen/dimen_zoom_btn_size"
android:layout_height="@dimen/dimen_zoom_btn_size"
android:padding="@dimen/dimen_block_5"
android:src="@drawable/icon_zoom_minus" />
<TextView
android:id="@+id/zoom_out_tv"
style="@style/WrapContent.main_text_style"
android:text="@string/string_zoom_out"
android:textSize="@dimen/dimen_font_14sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ScrollLayout">
<attr name="minOffset" format="dimension" />
<attr name="maxOffset" format="dimension" />
<attr name="exitOffset" format="dimension" />
<attr name="mode">
<flag name="open" value="0x0" />
<flag name="close" value="0x1" />
<flag name="exit" value="0x2" />
</attr>
<attr name="allowHorizontalScroll" format="boolean"/>
<attr name="isSupportExit" format="boolean"/>
</declare-styleable>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorBg">#F4F4F4</color>
<color name="colorWhite">#FFFFFF</color>
<color name="colorWhiteTras">#E6FFFFFF</color>
<color name="colorBlank">#000000</color>
<color name="colorBlankTras">#80000000</color>
<color name="color_333333">#333333</color>
<color name="color_666666">#666666</color>
<color name="color_999999">#999999</color>
<color name="color_CCCCCC">#CCCCCC</color>
<color name="color_E6E6E6">#E6E6E6</color>
<color name="color_BFBFBF">#BFBFBF</color>
<color name="color_444444">#444444</color>
<color name="color_13227A">#13227A</color>
<color name="color_1A34BC">#1A34BC</color>
<color name="color_F05B48">#F05B48</color>
<color name="color_515151">#515151</color>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="divide_line_color">#eaeaea</color><!-- 分割线色 -->
<color name="divide_view_color">#f0f0f0</color><!-- 分割块色 -->
<color name="white">#ffffff</color><!--主题颜色-->
<color name="black_06">#0f000000</color><!-- 黑色透明6%push色 -->
<color name="black">#000000</color>
<color name="red">#ffff0000</color>
<color name="blue">#008ef2</color>
<color name="gray">#B8B8B8</color> <!-- 灰色 -->
<color name="grey_text_color">#a3a3a3</color><!-- 灰色字 -->
<color name="gps_accuracy_big">#5bd636</color><!-- GPS强色 -->
<color name="gps_accuracy_small">#f93e3c</color><!-- GPS弱色 -->
<color name="sa_color">#008B87</color>
<color name="bar_pass_color">#9aabc4</color>
<color name="bar_mask_tmc_1">#45cc6a</color>
<color name="bar_mask_tmc_2">#ffae00</color>
<color name="bar_mask_tmc_3">#ff5453</color>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="dimen_block_35">35dp</dimen>
<dimen name="dimen_block_30">30dp</dimen>
<dimen name="dimen_block_25">25dp</dimen>
<dimen name="dimen_block_20">20dp</dimen>
<dimen name="dimen_block_15">15dp</dimen>
<dimen name="dimen_block_12">12dp</dimen>
<dimen name="dimen_block_10">10dp</dimen>
<dimen name="dimen_block_9">9dp</dimen>
<dimen name="dimen_block_8">8dp</dimen>
<dimen name="dimen_block_5">5dp</dimen>
<dimen name="dimen_block_4">4dp</dimen>
<dimen name="dimen_block_3">3dp</dimen>
<dimen name="dimen_block_2">2dp</dimen>
<dimen name="dimen_block_1_half">1.5dp</dimen>
<dimen name="dimen_block_1">1dp</dimen>
<dimen name="dimen_font_22sp">22sp</dimen>
<dimen name="dimen_font_18sp">18sp</dimen>
<dimen name="dimen_font_16sp">16sp</dimen>
<dimen name="dimen_font_15sp">15sp</dimen>
<dimen name="dimen_font_14sp">14sp</dimen>
<dimen name="dimen_font_12sp">12sp</dimen>
<dimen name="dimen_font_10sp">10sp</dimen>
<dimen name="dimen_zoom_btn_size">30dp</dimen>
<dimen name="corner_radius">4dp</dimen>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
\ No newline at end of file
<resources>
<string name="app_name">ArcGisLib</string>
<string name="string_common_ok">确定</string>
<string name="string_common_cancel">取消</string>
<string name="string_common_nodata">暂无数据</string>
<string name="string_net">请检查网络&#8230;</string>
<!---缩放-->
<string name="string_zoom_in">放大</string>
<string name="string_zoom_out">缩小</string>
<!--callout-->
<string name="string_callout_point_x">X:%s</string>
<string name="string_callout_point_y">Y:%s</string>
<string name="string_callout_point_address">地址:%s</string>
<string name="string_callout_point_POI">POI:%s</string>
<string name="string_callout_desc_label">补充描述:</string>
<string name="string_callout_desc_hint">请输入&#8230;</string>
<!--导航-->
<string name="string_navi_title">导航</string>
<string name="string_navi_ads_start">出发地</string>
<string name="string_navi_ads_end">目的地</string>
<string name="string_navi_input_hint">请选择</string>
<string name="string_navi_finish">路线规划</string>
<string name="string_navi_navi">导航</string>
<string name="string_navi_start_navi">开始导航</string>
<!--搜索-->
<string name="string_search_hint">请输入关键字</string>
<string name="string_search_prompt">请选择</string>
<!--热力图-->
<string name="string_hotpots_title">热力图</string>
<string name="string_hotpots_start_time">开始时间</string>
<string name="string_hotpots_end_time">结束时间</string>
<string name="string_hotpots_input_hint">请选择</string>
<string name="string_hotpots_finish">完成</string>
<!--绘制-->
<string name="string_draw_line">线</string>
<string name="string_draw_circle"></string>
<string name="string_draw_orthogon">矩形</string>
<string name="string_draw_polygon">多边形</string>
<string name="string_draw_prev">撤销</string>
<string name="string_draw_next">恢复</string>
<string name="string_draw_clear">清除</string>
<string name="string_draw_end">完成</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MatchParent">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">match_parent</item>
</style>
<style name="WrapContent">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
</style>
<style name="WrapContent.WidthMatchParent">
<item name="android:layout_width">match_parent</item>
</style>
<style name="WrapContent.main_text_style">
<item name="android:textColor">@color/color_333333</item>
<item name="android:textSize">@dimen/dimen_font_16sp</item>
</style>
<!--类似popup的dialog的样式-->
<style name="LeftDialogAnimation" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/anim_enter_left</item>
<item name="android:windowExitAnimation">@anim/anim_exit_left</item>
</style>
<style name="RightDialogAnimation" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/anim_enter_right</item>
<item name="android:windowExitAnimation">@anim/anim_exit_right</item>
</style>
<style name="TopDialogAnimation" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/anim_enter_top</item>
<item name="android:windowExitAnimation">@anim/anim_exit_top</item>
</style>
<style name="BottomDialogAnimation" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/anim_enter_bottom</item>
<item name="android:windowExitAnimation">@anim/anim_exit_bottom</item>
</style>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path
name="arcgis_lib_no_navi_file_name"
path=""/>
<files-path
name="arcgis_lib_no_navi_file_name"
path=""/>
<cache-path
name="arcgis_lib_no_navi_file_name"
path=""/>
<root-path
name="arcgis_lib_no_navi_file_name"/>
</paths>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
Tencent is pleased to support the open source community by making QMUI_Android available.
Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved.
Licensed under the MIT License (the "License"); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
http://opensource.org/licenses/MIT
Unless required by applicable law or agreed to in writing, software distributed under the License is
distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
either express or implied. See the License for the specific language governing permissions and
limitations under the License.
-->
<network-security-config>
<!--Android 高版本网络配置-->
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment