Commit b785e7cb authored by p x's avatar p x
Browse files

四维搜索

parent 0665639d
package com.sd.maplibrary.ui.view;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import androidx.appcompat.widget.AppCompatEditText;
/**
* @author Administrator
* 在焦点变化时和输入内容发生变化时均要判断是否显示右边clean图标
*/
public class CleanableEditText extends AppCompatEditText {
private Drawable mRightDrawable;
private boolean isHasFocus;
public CleanableEditText(Context context) {
super(context);
init();
}
public CleanableEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CleanableEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
// getCompoundDrawables:
// Returns drawables for the left, top, right, and bottom borders.
Drawable[] drawables = this.getCompoundDrawables();
// 取得right位置的Drawable
// 即我们在布局文件中设置的android:drawableRight
mRightDrawable = drawables[2];
// mRightDrawable.setBounds(0,0,25,25);
// 设置焦点变化的监听
this.setOnFocusChangeListener(new FocusChangeListenerImpl());
// 设置EditText文字变化的监听
this.addTextChangedListener(new TextWatcherImpl());
// 初始化时让右边clean图标不可见
setClearDrawableVisible(false);
}
/**
* 当手指抬起的位置在clean的图标的区域 我们将此视为进行清除操作 getWidth():得到控件的宽度
* event.getX():抬起时的坐标(改坐标是相对于控件本身而言的)
* getTotalPaddingRight():clean的图标左边缘至控件右边缘的距离
* getPaddingRight():clean的图标右边缘至控件右边缘的距离 于是: getWidth() -
* getTotalPaddingRight()表示: 控件左边到clean的图标左边缘的区域 getWidth() -
* getPaddingRight()表示: 控件左边到clean的图标右边缘的区域 所以这两者之间的区域刚好是clean的图标的区域
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
boolean isClean = (event.getX() > (getWidth() - getTotalPaddingRight()))
&& (event.getX() < (getWidth() - getPaddingRight()));
if (isClean) {
setText("");
}
break;
default:
break;
}
return super.onTouchEvent(event);
}
private class FocusChangeListenerImpl implements OnFocusChangeListener {
@Override
public void onFocusChange(View v, boolean hasFocus) {
isHasFocus = hasFocus;
if (isHasFocus) {
boolean isVisible = getText().toString().length() >= 1;
setClearDrawableVisible(isVisible);
} else {
setClearDrawableVisible(false);
}
}
}
// 当输入结束后判断是否显示右边clean的图标
private class TextWatcherImpl implements TextWatcher {
@Override
public void afterTextChanged(Editable s) {
boolean isVisible = getText().toString().length() >= 1;
setClearDrawableVisible(isVisible);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
}
// 隐藏或者显示右边clean的图标
protected void setClearDrawableVisible(boolean isVisible) {
Drawable rightDrawable;
if (isVisible) {
rightDrawable = mRightDrawable;
} else {
rightDrawable = null;
}
// 使用代码设置该控件left, top, right, and bottom处的图标
setCompoundDrawables(getCompoundDrawables()[0],
getCompoundDrawables()[1], rightDrawable,
getCompoundDrawables()[3]);
}
}
package com.sd.maplibrary.ui.view
import android.content.Context
import android.graphics.Rect
import android.util.AttributeSet
import com.minedata.minenavi.map.MapView
import com.minedata.minenavi.map.MineMap
import com.minedata.minenavi.map.TrafficEventInfo
import com.minedata.minenavi.mapdal.InitializationException
import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10
/***四维地图**/
class ForeMapView : MapView {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
interface Listener {
fun onCameraChanged(changeType: Int)
fun onTrafficEventIconClicked(type: Int, trafficEventInfo: TrafficEventInfo?)
fun onScrollStarted()
fun onScrollFinished()
}
private val mListeners = arrayListOf<ForeMapView.Listener>()
fun addListener(listener: Listener) {
mListeners.add(listener)
}
override fun onSurfaceCreated(gl10: GL10?, eglConfig: EGLConfig?) {
super.onSurfaceCreated(gl10, eglConfig)
}
override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
super.onSurfaceChanged(gl, width, height)
}
override fun onCameraChanged(changeType: Int) {
super.onCameraChanged(changeType)
for (listener in mListeners) {
listener.onCameraChanged(changeType)
}
}
override fun onTrafficEventIconClicked(type: Int, trafficEventInfo: TrafficEventInfo?) {
super.onTrafficEventIconClicked(type, trafficEventInfo)
for (listener in mListeners) {
listener.onTrafficEventIconClicked(type, trafficEventInfo)
}
}
override fun onScrollStarted() {
super.onScrollStarted()
for (listener in mListeners) {
listener.onScrollStarted()
}
}
override fun onScrollFinished(isScroll: Boolean) {
super.onScrollFinished(isScroll)
for (listener in mListeners) {
listener.onScrollFinished()
}
}
override fun createMineMap(rct: Rect?, listener: MineMap.Listener?): MineMap? {
try {
return MineMap(context, listener, true)
} catch (e: InitializationException) {
e.printStackTrace()
}
return null
}
}
\ No newline at end of file
package com.sd.maplibrary.utils
import android.app.Activity
import android.content.Context
import android.content.res.Configuration
import android.content.res.Resources
import android.os.Build
import android.provider.Settings
import android.util.DisplayMetrics
import android.util.TypedValue
import android.view.View
import android.view.View.MeasureSpec
/**
*author:pc-20171125
*data:2019/11/7 16:08
*/
object DisplayUtil {
fun getDpi(): Int {
return Resources.getSystem().displayMetrics.densityDpi
}
fun px2dp(pxValue: Float): Int {
val scale = Resources.getSystem().displayMetrics.density
return (pxValue / scale + 0.5f).toInt()
}
fun dp2px(dipValue: Float): Int {
val scale = Resources.getSystem().displayMetrics.density
return (dipValue * scale + 0.5f).toInt()
}
fun px2sp(pxValue: Float): Int {
val fontScale = Resources.getSystem().displayMetrics.scaledDensity
return (pxValue / fontScale + 0.5f).toInt()
}
fun sp2px(spValue: Float): Int {
val fontScale = Resources.getSystem().displayMetrics.scaledDensity
return (spValue * fontScale + 0.5f).toInt()
}
fun getScreenWidthDp(): Int {
val displayMetrics = Resources.getSystem().displayMetrics
val widthPixels = displayMetrics.widthPixels
val density = displayMetrics.density
return Math.round(widthPixels / density)
}
fun getScreenWidthPx(): Int {
val displayMetrics = Resources.getSystem().displayMetrics
return displayMetrics.widthPixels
}
fun getScreenHeightDp(): Int {
val displayMetrics = Resources.getSystem().displayMetrics
val heightPixels = displayMetrics.heightPixels
val density = displayMetrics.density
return Math.round(heightPixels / density)
}
fun getScreenHeightPx(): Int {
val displayMetrics = Resources.getSystem().displayMetrics
return displayMetrics.heightPixels
}
fun forceMeasure(view: View) {
val widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
val heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
view.measure(widthMeasureSpec, heightMeasureSpec)
}
private val mTmpValue = TypedValue()
fun getXmlDef(context: Context, id: Int): Int {
synchronized(mTmpValue) {
val value: TypedValue = mTmpValue
context.resources.getValue(id, value, true)
return TypedValue.complexToFloat(value.data).toInt()
}
}
fun getNavigationBarHeight(context: Context): Int {
val mInPortrait =
context.resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT
val result = 0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
if (hasNavBar(context as Activity)) {
val key: String
if (mInPortrait) {
key = "navigation_bar_height"
} else {
key = "navigation_bar_height_landscape"
}
return getInternalDimensionSize(context, key)
}
}
return result
}
private fun hasNavBar(activity: Activity): Boolean {
//判断小米手机是否开启了全面屏,开启了,直接返回false
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
if (Settings.Global.getInt(activity.contentResolver, "force_fsg_nav_bar", 0) != 0) {
return false
}
}
//其他手机根据屏幕真实高度与显示高度是否相同来判断
val windowManager = activity.windowManager
val d = windowManager.defaultDisplay
val realDisplayMetrics = DisplayMetrics()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
d.getRealMetrics(realDisplayMetrics)
}
val realHeight = realDisplayMetrics.heightPixels
val realWidth = realDisplayMetrics.widthPixels
val displayMetrics = DisplayMetrics()
d.getMetrics(displayMetrics)
val displayHeight = displayMetrics.heightPixels
val displayWidth = displayMetrics.widthPixels
return realWidth - displayWidth > 0 || realHeight - displayHeight > 0
}
private fun getInternalDimensionSize(context: Context, key: String): Int {
var result = 0
try {
val resourceId = context.resources.getIdentifier(key, "dimen", "android")
if (resourceId > 0) {
result =
Math.round(context.resources.getDimensionPixelSize(resourceId) * Resources.getSystem().displayMetrics.density / context.resources.displayMetrics.density)
}
} catch (ignored: Resources.NotFoundException) {
return 0
}
return result
}
}
\ No newline at end of file
package com.sd.maplibrary.utils
object MyContants {
const val IS_DEBUG = true
var HOST = if (IS_DEBUG) "http://laravel.suiyigou.shop/" else "https://api.suixinsuiyi.cn/"
var PORT = if (IS_DEBUG) "123" else "34534"
var SOCKET_HOSTNAME =
if (IS_DEBUG) "192.168.60.77" else ""
var SOCKET_RECEIVE_PORT =
if (IS_DEBUG) 8082 else 0
const val PERMISSON_REQUESTCODE: Int = 10
const val online = true
/**
* 智旅APK传智*/
const val LAT_LNG_INFO = "LAT_LNG_INFO"
/***当前速度***/
var CUR_SPEED = 0f
const val MOCK_LAT = 39.9129
const val MOCK_LNG = 116.3723
// var CUR_LAT = MOCK_LAT
// var CUR_LNG = MOCK_LNG
var CUR_LAT = 0.0
var CUR_LNG = 0.0
// const val MOCK_LAT = 39.56
// const val MOCK_LNG = 116.20
// 116.372641,39.913242
}
\ No newline at end of file
package com.sd.maplibrary.utils
import android.location.Location
import com.minedata.minenavi.addons.DistanceBean
object MyGeoTools {
/**
* 计算我的位置到目标的直线距离
*/
fun cauMyLocDistance(lat: Double,lng: Double): DistanceBean {
var mUtils = Utils()
var results = FloatArray(1)
Location.distanceBetween(
MyContants.CUR_LAT,
MyContants.CUR_LNG,
lat,
lng,
results
)
var distanceInMeters = results[0]
val distanceBean: DistanceBean = mUtils.formatDistance(distanceInMeters.toInt(), false)
return distanceBean
}
}
\ No newline at end of file
package com.sd.maplibrary.utils
import android.app.Activity
import android.app.ActivityManager
import android.content.*
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.PowerManager
import android.provider.Settings
import android.telephony.TelephonyManager
import android.view.View
import android.view.WindowManager
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import androidx.annotation.RequiresPermission
import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import java.io.File
object SystemUtils {
/**
* 调用系统打电话
*
* @param phone
*/
fun callSystemTell(context: Context, phone: String) {
if (!phone.isNullOrEmpty()) {
try {
// var intent = Intent(Intent.ACTION_DIAL, phone.toUri())
var intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:$phone"))
context.startActivity(intent)
} catch (e: ActivityNotFoundException) {
}
}
}
/**
* 获取当前应用程序的版本号
*/
fun getAppVersionCode(context: Context): Int {
var version = 0
try {
version = context.packageManager.getPackageInfo(context.packageName, 0).versionCode
} catch (e: PackageManager.NameNotFoundException) {
throw RuntimeException(context.javaClass.simpleName + "the application not found")
}
return version
}
/**
* 获取当前应用程序的版本号
*/
fun getAppVersionName(context: Context): String {
var version = "0"
try {
version = context.packageManager.getPackageInfo(context.packageName, 0).versionName.toString()
} catch (e: PackageManager.NameNotFoundException) {
throw RuntimeException("the application not found")
}
return version
}
/**
* 关闭软键盘
*/
fun closeKeyboard(et: EditText, context: Context) {
et.clearFocus()
val imm = ContextCompat.getSystemService(context, InputMethodManager::class.java)
// 对于当前焦点的View
imm?.hideSoftInputFromWindow(et.windowToken, 0)
}
/**
* 打卡软键盘
*/
fun showKeyboard(view: View, context: Context) {
view.isFocusable = true
view.requestFocus()
val imm = ContextCompat.getSystemService(context, InputMethodManager::class.java)
imm?.showSoftInput(view, 0)
}
/**
* 适配华为安全键盘
*/
fun etHuaWeiKeybroad(et: EditText) {
// if (MobileUtils.isEMUI() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
// with(et) {
// inputType =
// android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_VARIATION_NORMAL
// transformationMethod =
// android.text.method.PasswordTransformationMethod.getInstance()
// }
// }
}
fun setStatusBarColor(activity: Activity, colorId: Int) {
val window = activity.window
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.statusBarColor = ContextCompat.getColor(activity, colorId)
}
/**
* 通过上下文找到activity
*/
fun findActivity(context: Context): Activity? {
if (context is Activity) {
return context
}
return if (context is ContextWrapper) {
val wrapper = context as ContextWrapper
findActivity(wrapper.baseContext)
} else {
null
}
}
@RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE")
fun getPhoneIMEI(context: Context): String? {
val tm = ContextCompat.getSystemService(context, TelephonyManager::class.java)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
return tm?.deviceId
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
return tm?.getImei(0)
} else {
return Settings.System.getString(context.contentResolver, Settings.Secure.ANDROID_ID)
}
}
/**
* 复制文字到剪切板
*/
fun copyTextClip(context: Context, text: String) {
// 得到剪贴板管理器
val cmb = ContextCompat.getSystemService(context, ClipboardManager::class.java)
var clipData = ClipData.newPlainText("", text)
cmb?.setPrimaryClip(clipData)
}
fun exitApp(context: Context) {
// val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val activityManager = ContextCompat.getSystemService(context, ActivityManager::class.java)
val appTaskList = activityManager?.appTasks
if (appTaskList != null) {
for (appTask in appTaskList) {
appTask.finishAndRemoveTask()
}
}
}
fun openThridUrl(url: String, context: Context) {
var myurl = url
if (!url.startsWith("http://") && !url.startsWith("https://")) {
myurl = "http://$url"
}
try {
val uri = Uri.parse(myurl)
val intent = Intent(Intent.ACTION_VIEW, uri)
context.startActivity(intent)
} catch (e: ActivityNotFoundException) {
// LogUtil.e("--------", "没找到Activity url=$url")
}
}
//android获取一个用于打开HTML文件的intent
fun openHtmlFileIntent(urlParam: String, context: Context) {
val intent = Intent("android.intent.action.VIEW")
intent.addCategory("android.intent.category.DEFAULT")
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
// val uri = Uri.fromFile(File(urlParam))
var file = File(urlParam)
var uri: Uri?
if (Build.VERSION.SDK_INT >= 24) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
uri = FileProvider.getUriForFile(context, "com.zhaolaobao.fileProvider", file)
} else {
uri = Uri.fromFile(file)
}
var type = ""
/* 取得扩展名 */
var suffix = urlParam.substringAfterLast(".").toLowerCase()
println("----url 后缀 = ${suffix}")
when (suffix) {
"pdf" -> type = "application/pdf"
"ppt", "pptx" -> type = "application/vnd.ms-powerpoint"
// "pptx" -> type =
// "application/vnd.openxmlformats-officedocument.presentationml.presentation"
"doc" -> type = "application/msword"
"docx" -> type =
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
"xls", "xlsx" -> type = "application/vnd.ms-excel"
"txt" -> type = "text/plain"
else -> type = "*/*"
}
intent.setDataAndType(uri, type)
try {
context.startActivity(intent)
} catch (e: ActivityNotFoundException) {
ToastHelper.showShort(context, "不支持打开")
}
}
/**
*跳转到应用外部打开
*/
fun openFile(file: File, context: Context) {
var intent = Intent(Intent.ACTION_VIEW)
intent.addCategory("android.intent.category.DEFAULT")
var uri: Uri?
if (Build.VERSION.SDK_INT >= 24) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
uri = FileProvider.getUriForFile(context, "com.zhaolaobao.fileProvider", file)
} else {
uri = Uri.fromFile(file)
}
var type = ""
/* 取得扩展名 */
var end = file.name.substringAfterLast(".").toLowerCase()
when (end) {
"pdf" -> type = "application/pdf"
"ppt" -> type = "application/vnd.ms-powerpoint"
"pptx" -> type =
"application/vnd.openxmlformats-officedocument.presentationml.presentation"
"doc" -> type = "application/msword"
"docx" -> type =
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
"xls" -> type = "application/vnd.ms-excel"
"xlsx" -> type = "application/vnd.ms-excel"
"txt" -> type = "text/plain"
else -> type = "*/*"
}
intent.setDataAndType(uri, type)
try {
context.startActivity(intent)
} catch (e: ActivityNotFoundException) {
// context.toast("不支持打开")
}
}
/**
* 登录超时
*/
fun timeOutLoginActivity(context: Context) {
context.startActivity(Intent().apply {
// flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
action = "goLoginActivity"
putExtra("is_login_timeout", true)
})
}
/**
* 账户禁用
*/
fun accountDisLoginActivity(context: Context) {
context.startActivity(Intent().apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
action = "goLoginActivity"
putExtra("is_login_timeout", false)
})
}
/**
* 应用是否在电池白名单里
*/
fun isIgnoringBatteryOptimizations(context: Context): Boolean {
var isIgnoring = false
val powerManager = ContextCompat.getSystemService(context, PowerManager::class.java)
if (powerManager != null) {
isIgnoring = powerManager.isIgnoringBatteryOptimizations(context.packageName)
}
return isIgnoring
}
}
\ No newline at end of file
/*********************************************************************************************************************************
* NaviCore Corporate MIT License 0.1
* Copyright (c) 2019 GIS Core R&D Department, NavInfo Corp.
*
* Permission is hereby granted, free of charge, to any entity within the corporation(Entity) obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit Entities to whom the Software is furnished to do so, subject to the following conditions:
*
* 1. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. and
* 2. The above copyright notice, this permission notice and the acknowledgments below shall be displayed in UI or web pages
* if the Software is redistributed in binary form or as web service.
*
* Acknowledgments: "This work uses NaviZeroAndroid provided by GIS Core R&D Department, NavInfo Corp."
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* You may also get a copy of the license at http://navicore.cn/license/NC_MIT_0.1
**********************************************************************************************************************************/
package com.sd.maplibrary.utils;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.media.AudioManager;
import android.os.BatteryManager;
import android.os.Build;
import android.os.CountDownTimer;
import android.os.Handler;
import android.os.StatFs;
import android.text.TextUtils;
import android.util.Base64;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.TranslateAnimation;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.Toast;
import com.minedata.minenavi.SDKInitializer;
import com.minedata.minenavi.addons.DistanceBean;
import com.minedata.minenavi.addons.TimeBean;
import com.minedata.minenavi.map.MineMap;
import com.minedata.minenavi.mapdal.DistanceStringInfo;
import com.minedata.minenavi.mapdal.NativeEnv;
import com.minedata.minenavi.util.MineNaviUtil;
import com.minedata.minenavi.util.ScreenUtil;
import java.io.BufferedReader;
import java.io.FileReader;
import java.security.MessageDigest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class Utils {
private Context mContext;
private AudioManager mAudioManager;
private PackageManager mPackageManager;
private float mDpiFactor = 2.0f;
private boolean mIsInited = false;
private Timer mTimer;
private Context mApplicationContext;
private CountDownTimer mCountDownTimer;
private static class SingletonHolder {
public static final Utils instance = new Utils();
}
public static Utils getInstance() {
return SingletonHolder.instance;
}
public void init(Context context) {
if (mIsInited) {
return;
}
mContext = context;
mApplicationContext = context.getApplicationContext();
mTimer = new Timer();
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
mPackageManager = mContext.getPackageManager();
mDpiFactor = context.getResources().getDisplayMetrics().density;
mIsInited = true;
}
/**
* 获取当前音量值
*/
public int getCurrentVolume() {
return mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
}
/**
* 获取音量最大值
*/
public int getMaxVolume() {
return mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
}
/**
* 设置当前的音量
*/
public void setVolume(int volumeValue) {
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volumeValue, AudioManager.FLAG_PLAY_SOUND);//设置值为Val
}
/**
* APP是否处于前台
*/
public boolean isAppOnForeground() {
ActivityManager activityManager = (ActivityManager) mContext.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
String packageName = mContext.getApplicationContext().getPackageName();
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
.getRunningAppProcesses();
if (appProcesses == null)
return false;
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(packageName)
&& appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
return true;
}
}
return false;
}
/**
* 判断设备是否正在充电
*/
public boolean isCharging() {
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = mContext.registerReceiver(null, ifilter);
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
return isCharging;
}
/**
* 获取屏幕的高,如果横屏的话,返回的高就是屏幕的宽,如果是竖屏的话,返回的高就是屏幕的高,获取的高是从状态栏到导航栏整体的高
*
* @param activity 当前的activity
* @return 屏幕的高
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public int getWindowHeight(Activity activity) {
Point realSize = new Point();
activity.getWindowManager().getDefaultDisplay().getRealSize(realSize);
return realSize.y;
}
/**
* 获取屏幕的高,如果横屏的话,返回的高就是屏幕的宽,如果是竖屏的话,返回的高就是屏幕的高,获取的高是从状态栏到导航栏整体的高
*
* @param activity 当前的activity
* @return 屏幕的高
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public int getWindowWidth(Activity activity) {
Point realSize = new Point();
activity.getWindowManager().getDefaultDisplay().getRealSize(realSize);
return realSize.x;
}
/**
* 平移动画
*/
private TranslateAnimation mTranslateAnimation;
public void translateAnimation(View view, float fromX, float toX, float fromY, float toY, long duration, Animation.AnimationListener animationListener,
boolean isFillAfter) {
mTranslateAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, fromX, Animation.RELATIVE_TO_SELF, toX,
Animation.RELATIVE_TO_SELF, fromY, Animation.RELATIVE_TO_SELF, toY);
mTranslateAnimation.setDuration(duration);
mTranslateAnimation.setFillAfter(isFillAfter);
if (animationListener != null) {
mTranslateAnimation.setAnimationListener(animationListener);
}
view.startAnimation(mTranslateAnimation);
}
/**
* 混合动画动画
*/
public void translateAnimationWithAbsolute(View view, float fromAlpha, float toAlpha, long alaphDuration, long startTime, float fromX, float toX, float fromY, float toY,
long translateDuration, long animationSetDuration, Animation.AnimationListener animationListener,
boolean isFillAfter) {
//途径点1——————————添加文字移动平移动画 333
AnimationSet animationSet = new AnimationSet(true);
AlphaAnimation animationa = new AlphaAnimation(fromAlpha, toAlpha);
animationa.setDuration(alaphDuration);
animationa.setStartTime(startTime);
animationSet.addAnimation(animationa);
TranslateAnimation translateAnimation = new TranslateAnimation(Animation.ABSOLUTE, fromX, Animation.ABSOLUTE, toX, Animation.ABSOLUTE,
fromY, Animation.ABSOLUTE, toY);
translateAnimation.setDuration(translateDuration);
animationSet.addAnimation(translateAnimation);
animationSet.setDuration(animationSetDuration);
animationSet.setAnimationListener(animationListener);
animationSet.setFillAfter(isFillAfter);
view.startAnimation(animationSet);
}
public boolean isTranslateAnimationHasEnded() {
if (mTranslateAnimation == null) {
return true;
}
return mTranslateAnimation.hasEnded();
}
/**
* 地图是否是2d模式
*/
public final boolean isMap2dStyle(MineMap mineMap) {
return mineMap.getElevation() == 90;
}
/**
* 地图是否是3d模式
*/
public final boolean isMap3dStyle(MineMap mineMap) {
return mineMap.getElevation() != 90;
}
/**
* 延时操作
*
* @param runnable
* @param delayed
*/
private Handler delayedViewOperateHandler = new Handler();
public void doDelayedViewOperate(Runnable runnable, long delayed) {
delayedViewOperateHandler.postDelayed(runnable, delayed);
}
public Handler getDelayedViewOperateHandler() {
return delayedViewOperateHandler;
}
public void cleanup() {
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
}
}
/**
* 秒转换成分钟,向上取整
*
* @param secondTime 秒
* @return 取整后的分钟
*/
public final int second2Minute(int secondTime) {
return (secondTime + 59) / 60;
}
/**
* 将以秒为单位的时间格式化
*
* @param secondTime 秒
* @return 得到格式化的时间
*/
public String formatTime(int secondTime) {
String sTotalTime;
int minutes = second2Minute(secondTime);
if (minutes < 60) {
sTotalTime = minutes + "分钟";
} else {
int remainMin = minutes % 60;
sTotalTime = minutes / 60 + "小时" + (remainMin == 0 ? "" : remainMin + "分");
}
return sTotalTime;
}
/**
* 格式化到千米,如果距离不小于100km或整千米,保留整数;否则保留小数点后一位,比如 110000 -> 110,8000 -> 8, 8001 -> 8, 800 -> 0.8, 99 -> 0
*
* @param distance 距离,单位:米
* @return 格式化后以千米表示的结果,不包含单位
*/
public String formatDistanceToKm(int distance) {
String distanceValue;
if (distance >= 100000 || distance % 1000 == 0) {
distanceValue = String.valueOf(distance / 1000);
} else {
distanceValue = String.format(Locale.getDefault(), "%.1f", (distance / 100) / 10.0);
}
return distanceValue;
}
public DistanceBean formatDistance(int distance, boolean isEnglishDistanceUnit) {
DistanceStringInfo distanceStringInfo = MineNaviUtil.distance2String(distance, isEnglishDistanceUnit ? MineNaviUtil.DistanceUnit.english : MineNaviUtil.DistanceUnit.normal, false);
String distanceValue = "";
String distanceUnit = "";
switch (distanceStringInfo.unit) {
case MineNaviUtil.GisUnit.m:
distanceUnit = isEnglishDistanceUnit ? "m" : "米";
break;
case MineNaviUtil.GisUnit.km:
distanceUnit = isEnglishDistanceUnit ? "km" : "公里";
break;
case MineNaviUtil.GisUnit.mi:
distanceUnit = isEnglishDistanceUnit ? "mile" : "英里";
break;
case MineNaviUtil.GisUnit.ft:
distanceUnit = isEnglishDistanceUnit ? "ft" : "英尺";
break;
}
distanceValue = distanceStringInfo.distanceString.split(distanceUnit)[0];
return new DistanceBean(distanceValue, distanceUnit);
}
public TimeBean calcTimeBean(int time) {
int totalMinute = (time + 59) / 60;
int timeHour = totalMinute / 60;
int timeMinute = totalMinute % 60;
return new TimeBean(timeHour, timeMinute);
}
/**
* 弹出/隐藏键盘
*/
public void enableInputMethod(boolean enable, EditText editText) {
InputMethodManager inputManager = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
if (enable) {
//弹出键盘
inputManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
} else {
//隐藏键盘
inputManager.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
}
/**
* 弹出/隐藏键盘 : 防止焦点丢失
*/
public void enableInputMethodWithFocus(boolean enable, EditText editText) {
InputMethodManager inputManager = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
editText.setFocusable(enable);
editText.setFocusableInTouchMode(enable);
editText.requestFocus();
if (enable) {
//弹出键盘
editText.requestFocus();
inputManager.showSoftInput(editText, 0);
} else {
//隐藏键盘
inputManager.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
}
/**
* 光标移到文字后
*/
public void setSelectionEnd(EditText editText) {
if (editText != null) {
String b = editText.getText().toString();
editText.setSelection(b.length());
}
}
/**
* 无焦点情况下隐藏键盘
*/
public void hideKeyboard(Context context) {
Activity activity = (Activity) context;
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
View v = activity.getWindow().peekDecorView();
if (null != v) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
public String getStrDistance(Point point1, Point point2) {
int distance = MineNaviUtil.distance(point1, point2);
return MineNaviUtil.distance2String(distance, MineNaviUtil.DistanceUnit.normal, false).distanceString;
}
public int dp2Px(float dp) {
return (int) (dp * mDpiFactor + 0.5f);
}
public int px2Dp(int px) {
return (int) (px / mDpiFactor + 0.5f);
}
/**
* 判断系统当前是24小时制还是 12小时制
*/
public boolean is24Hour() {
return android.text.format.DateFormat.is24HourFormat(mContext);
}
/**
* 将流量大小(B)格式化为显示文本,规则如下:<br>
* 1. 小于1K时,显示xxB,例如2B<br>
* 2. 小于1M时,显示xxKB,例如250KB<br>
* 3. 小于1G时,显示xxMB,例如250MB<br>
* 4. 不小于1G时,显示xx.xGB,例如1.0GB, 10.5GB
*
* @param size 流量大小,单位:字节
*/
public String formatTrafficDataSize(long size) {
if (size < 1024) {
return size + "B";
} else if (size < 1024 * 1024) {
return size / 1024 + "KB";
} else if (size < 10 * 1024 * 1024) {
return String.format("%.1fM", size / (1024.0 * 1024));
} else if (size < 1024L * 1024 * 1024) {
return size / (1024 * 1024) + "MB";
} else {
return String.format("%.1fGB", size / (1024.0 * 1024 * 1024));
}
}
/**
* 获取版本号名字
*/
public String getVerName() {
String verName = "";
try {
verName = mPackageManager.getPackageInfo(mApplicationContext.getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return verName;
}
/**
* 获取版本号
*/
public int getVersionCode() {
int versionCode = 0;
try {
versionCode = mPackageManager.getPackageInfo(mApplicationContext.getPackageName(), 0).versionCode;
} catch (Exception e) {
e.printStackTrace();
}
return versionCode;
}
/**
* 获取app名字
*/
public String getAppName() {
String appName = "";
try {
PackageInfo packageInfo = mPackageManager.getPackageInfo(mApplicationContext.getPackageName(), 0);
appName = packageInfo.applicationInfo.loadLabel(mPackageManager).toString();
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return appName;
}
/**
* 全角转半角
*
* @return 半角字符串
*/
public String toDBC(String input) {
char c[] = input.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i] == '\u3000') {
c[i] = ' ';
} else if (c[i] > '\uFF00' && c[i] < '\uFF5F') {
c[i] = (char) (c[i] - 65248);
}
}
return new String(c);
}
/**
* 系统Toast
*/
public void showToast(Context context, String msg) {
Toast toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
toast.setText(msg);
toast.show();
}
public void scheduleTimerTask(TimerTask timerTask, long time) {
if (mTimer != null && timerTask != null) {
mTimer.schedule(timerTask, time);
}
}
/**
* 软件运行环境是否是手机
*
* @return
*/
public boolean isMobilePhone() {
// try {
// if (ScreenUtil.getInstance().isScreenLandscape() && getTotalRam(mContext) <= 2.0f
// && getSdcardAvailableSize(SDKInitializer.getAppPath()) < (25L * 1024 * 1024 * 1024)) {
// return false;
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
return true;
}
/**
* 根据包名获取当前数据存储的路径后缀
*/
public String getCurrentStoragePathSuffix() {
String suffix = "";
if (isTestVersion()) {
suffix = "/mapbar/NaviZero";
} else if (isReleaseVersion()) {
suffix = "/mapbar/NaviZeroRelease";
}
return suffix;
}
public boolean isTestVersion() {
String packageName = mContext.getPackageName();
return TextUtils.equals("com.mapbar.navigation.zero", packageName);
}
public boolean isReleaseVersion() {
String packageName = mContext.getPackageName();
return TextUtils.equals("com.mapbar.navigation.zero.release", packageName);
}
public String getLoginAppName() {
return isTestVersion() ? "naviZeroBeta" : "naviZeroRelease";
}
/**
* 获取SD卡大小
*
* @param sdcardPath
* @return
*/
public long getSdcardAvailableSize(String sdcardPath) {
long size = 0;
StatFs statFs = new StatFs(sdcardPath);
int blockSize = statFs.getBlockSize();
int totalBlocks = statFs.getBlockCount();
size = (long) totalBlocks * blockSize;
return size;
}
public float getTotalRam(Context context) {
String path = "/proc/meminfo";
String firstLine = null;
float totalRam = 0;
try {
FileReader fileReader = new FileReader(path);
BufferedReader br = new BufferedReader(fileReader, 8192);
firstLine = br.readLine().split("\\s+")[1];
br.close();
} catch (Exception e) {
e.printStackTrace();
}
if (firstLine != null) {
totalRam = Float.valueOf(firstLine) / (1024 * 1024);
}
return totalRam;
}
public Bitmap createCircleBitmap(Bitmap resource) {
//获取图片的宽度
int width = resource.getWidth();
Paint paint = new Paint();
//设置抗锯齿
paint.setAntiAlias(true);
//创建一个与原bitmap一样宽度的正方形bitmap
Bitmap circleBitmap = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888);
//以该bitmap为低创建一块画布
Canvas canvas = new Canvas(circleBitmap);
//以(width/2, width/2)为圆心,width/2为半径画一个圆
canvas.drawCircle(width / 2, width / 2, width / 2, paint);
//设置画笔为取交集模式
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//裁剪图片
canvas.drawBitmap(resource, 0, 0, paint);
return circleBitmap;
}
private SimpleDateFormat mSimpleDateFormat;
/**
* local时间转换成UTC时间
*
* @param date 时间格式 例: 2019-5-21 14:12:38
* @return 返回格式化好的时间 例: 2019-5-21 22:12:38
*/
public String formatLocalDate(String date) {
if (mSimpleDateFormat == null) {
mSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
Date localDate = null;
try {
localDate = mSimpleDateFormat.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
long localTimeInMillis = localDate.getTime() + 60 * 60 * 8 * 1000;
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(localTimeInMillis);
return mSimpleDateFormat.format(calendar.getTime());
}
/**
* /**
* 使用SHA1算法对字符串进行加密
*
* @param str 要签名的字符串
* @return SHA1 签名后的内容
*/
public static String sha1Digest(String str) {
if (str == null || str.length() == 0) {
return null;
}
char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'};
try {
MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
mdTemp.update(str.getBytes("UTF-8"));
byte[] md = mdTemp.digest();
int j = md.length;
char buf[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
return new String(buf);
} catch (Exception e) {
return null;
}
}
/**
* 随机字符串
*
* @return 随机字符串
*/
public static String randomString() {
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 10; i++) {
int number = random.nextInt(str.length());
char charAt = str.charAt(number);
sb.append(charAt);
}
return sb.toString();
}
/**
* 开启横竖屏模式
*
* @param activity 需要开启横竖屏的activity
* @param isOpen 是否打开
*/
public void enableHorizontalAndVerticalScreenMode(Activity activity, boolean isOpen) {
activity.setRequestedOrientation(isOpen ? ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
/**
* 开启横竖屏模式
*
* @param isOpen 是否打开
*/
public void enableHorizontalAndVerticalScreenMode(boolean isOpen) {
enableHorizontalAndVerticalScreenMode((Activity) mContext, isOpen);
}
/**
* 是否有网络连接
*
* @return
*/
public boolean isHaveNetwork() {
int netWorkState = NativeEnv.getNetworkStatus(mContext);
if (netWorkState == NativeEnv.NetworkStatus.unavailable) {
return false;
}
return true;
}
public boolean isNumber(String str) {
for (int i = str.length(); --i >= 0; ) {
int chr = str.charAt(i);
if (chr < 48 || chr > 57)
return false;
}
return true;
}
/***
* MD5加密
*/
public static String string2MD5(String inStr) {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
return "";
}
byte[] md5Bytes = md5.digest(inStr.getBytes());
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString().toUpperCase();
}
public static String base64(String str) {
return Base64.encodeToString(str.getBytes(), Base64.DEFAULT);
}
public static String location2String(Point pt) {
return String.format("%.5f,%.5f", pt.x / 100000.0, pt.y / 100000.0);
}
public static Point string2Location(String str) {
try {
String[] parts = str.split(",");
return new Point((int) (Float.valueOf(parts[0]) * 100000), (int) (Float.valueOf(parts[1]) * 100000));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
package com.sd.maplibrary.viewmodels
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
class Ee:ViewModel() {
fun sdsd(){
}
}
\ No newline at end of file
package com.sd.maplibrary.viewmodels
import android.annotation.SuppressLint
import android.app.Application
import android.os.Bundle
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.minedata.minenavi.location.MineLocation
import com.minedata.minenavi.location.MineLocationListener
import com.minedata.minenavi.location.MineLocationManager
import com.minedata.minenavi.location.MineLocationOptions
import com.minedata.minenavi.map.MineMap
import com.minedata.minenavi.map.MyLocationStyle
import com.minedata.minenavi.mapdal.CoordType
import com.sd.maplibrary.bean.MyLocBean
import com.sd.maplibrary.ui.view.ForeMapView
import com.sd.maplibrary.utils.MyContants
/***四维地图操作类***/
class FourMapOpVm(private var application: Application) : AndroidViewModel(application) {
@SuppressLint("StaticFieldLeak")
private lateinit var mMapView: ForeMapView
private lateinit var mMineMap: MineMap
private var mMyLocationStyle: MyLocationStyle? = null
//我的定位信息
var myLocBean = MutableLiveData<MyLocBean>()
fun init(foreMapView: ForeMapView) {
mMapView = foreMapView
MineLocationManager.getInstance()
.init(application, MineLocationManager.LocationSource.all)
MineLocationManager.getInstance().addListener(mineLocationListener)
mMapView.addMapRenderCallback { mineMap: MineMap ->
mMineMap = mineMap
mMineMap.minZoomLevel = 0.0f
mMineMap.maxZoomLevel = 17.0f
addMyLocationStyle()
mOnMapViewListener?.onMapReady()
}
}
private fun addMyLocationStyle() {
// 定位蓝点,默认使用内置定位
mMyLocationStyle = MyLocationStyle()
// 使用外部传入位置信息
mMyLocationStyle?.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE)
// mMyLocationStyle.setPosition(point);
// mMyLocationStyle.orientAngle(30.0f);
// mMyLocationStyle.interval(2000);
mMyLocationStyle?.showMyLocation(true)
mMyLocationStyle?.setClickable(true)
mMineMap.setMyLocationStyle(mMyLocationStyle)
}
/***
* 开启定位
*/
fun starLoc(): LiveData<MyLocBean> {
// 设置定位参数,并开始定位。
val options = MineLocationOptions()
options.setCoordType(CoordType.GCJ02)
options.setGpsInterval(1000);//GPS定位更新时间,最小1000
options.setNetWorkInterval(3000);//WiFi定位更新时间,最小3000
options.setStationInterval(5000);//基站定位更新时间,最小500
MineLocationManager.getInstance().start(options)
return myLocBean
}
fun stopLoc() {
MineLocationManager.getInstance().removeAllListener()
MineLocationManager.getInstance().stop()
MineLocationManager.getInstance().cleanup()
}
////////////////////////////////////
////////////////////////////////////
////////////////////////////////////
var mOnMapViewListener: OnMapViewListener? = null
interface OnMapViewListener {
fun onMapReady()
fun onswitchLocation(imageLevel: Int)
}
private var mineLocationListener = object : MineLocationListener {
override fun onSimLocationChanged(location: MineLocation?) {
var a = 0
}
override fun onLocationChanged(location: MineLocation?) {
println("-------定位改变 = ${location?.latitude} curLng=${location?.longitude} speed=${location?.speed}")
// var df = DecimalFormat("#.00000000")
MyContants.CUR_LAT = location?.latitude ?: 0.0
MyContants.CUR_LNG = location?.longitude ?: 0.0
MyContants.CUR_SPEED = location?.speed ?: 0f
// MyPres.curLat = MyContants.CUR_LAT
// MyPres.curLng = MyContants.CUR_LNG
if (MyContants.CUR_SPEED > 0f) {
// MyPres.curSpeed = MyContants.CUR_SPEED
}
var myLoc = MyLocBean().apply {
curLat = MyContants.CUR_LAT
curLng = MyContants.CUR_LNG
// curLat = MyContants.MOCK_LAT
// curLng = MyContants.MOCK_LNG
speed = MyContants.CUR_SPEED
}
// myLocBean.postValue(bean)
myLocBean.value = myLoc
}
override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {
var a = 0
}
override fun onProviderEnabled(provider: String?) {
var a = 0
}
override fun onProviderDisabled(provider: String?) {
var b = 0
}
}
}
\ No newline at end of file
package com.sd.maplibrary.viewmodels
import android.annotation.SuppressLint
import android.app.Application
import android.content.Context
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.minedata.minenavi.mapdal.PoiItem
import com.minedata.minenavi.poiquery.LatLonPoint
import com.minedata.minenavi.poiquery.PoiResult
import com.minedata.minenavi.poiquery.PoiSearch
import com.minedata.minenavi.poiquery.SearchErrorCode
import com.minedata.minenavi.poiquery.SortType
import com.sd.maplibrary.bean.PoiSearchBean
import com.sd.maplibrary.utils.MyContants
/***四维地图搜索相关***/
class SearchForeMapVm(private var application: Application) : AndroidViewModel(application) {
@SuppressLint("StaticFieldLeak")
private var ctx: Context? = null
private var poiSearch: PoiSearch? = null
//搜索结果
var poiSearchBean = MutableLiveData<List<PoiSearchBean>>()
init {
ctx = application.applicationContext
poiSearch = PoiSearch(ctx)
poiSearch?.setOnPoiSearchListener(object : PoiSearch.OnPoiSearchListener {
override fun onPoiItemSearched(poiItem: PoiItem?, errorCode: Int) {
var a=0
}
override fun onPoiSearched(
poiResult: PoiResult?, errorCode: Int
) {
if (errorCode == SearchErrorCode.none) {
var temps = poiResult?.getPois()
var poiList = temps!!.map { pos ->
PoiSearchBean().apply {
lat = pos.location.latitude
lng = pos.location.longitude
// title = "${pos.provinceName}${pos.cityName}${pos.district}${pos.title}"
title = pos.title
snippet = pos.snippet
cityName = pos.cityName
//这里为0 因为不是范围搜素
distance = pos.distance
adCode = pos.adCode
}
}
poiSearchBean.postValue(poiList)
} else {
}
}
})
}
fun getPoiList(str: String,curLat: Double, curLng: Double): LiveData<List<PoiSearchBean>> {
val query = PoiSearch.Query(str,"")
// 限制严格按照设置城市搜索
// query.setCityLimit(true)
// 设置查询位置点
if (curLat != 0.0 && curLng != 0.0) {
query.setLocation(LatLonPoint(curLat, curLng))
}
// 设置排序方式为热度排序
query.setSortType(SortType.SORT_TYPE_HIT)
// 返回父子关系
query.requireSubPois(false)
// 设置查询每页的结果数目
query.setPageSize(10)
poiSearch?.setQuery(query)
// 开始搜索
poiSearch?.searchPOIAsyn()
return poiSearchBean
}
}
\ 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:drawable="@drawable/btn_change_press" android:state_focused="true" />
<item android:drawable="@drawable/btn_change_press" android:state_pressed="true"/>
<item android:drawable="@drawable/btn_change_normal"/>
</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">
<corners android:radius="10dp"/>
<solid android:color="@color/white"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
</data>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:id="@+id/r_input_layout"
layout="@layout/route_input_view"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/poi_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="5dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</LinearLayout>
</layout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragments.AMapFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragments.ForeMapFragment">
<!-- smallView="true"-->
<!-- smallViewBottom="10"-->
<!-- smallViewEnableEvent="true"-->
<!-- smallViewLeft="0"-->
<!-- smallViewRight="10"-->
<!-- smallViewTop="0"-->
<com.sd.maplibrary.ui.view.ForeMapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<include
android:id="@+id/s_layout"
layout="@layout/search_layout" />
</RelativeLayout>
</layout>
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