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

封装导航

parent 05725fa8
...@@ -14,6 +14,7 @@ import com.minedata.minenavi.navi.NaviSession ...@@ -14,6 +14,7 @@ import com.minedata.minenavi.navi.NaviSession
import com.minedata.minenavi.navi.NaviSessionData import com.minedata.minenavi.navi.NaviSessionData
import com.minedata.minenavi.navi.NaviSessionParams import com.minedata.minenavi.navi.NaviSessionParams
import com.minedata.minenavi.navi.RouteBase import com.minedata.minenavi.navi.RouteBase
import com.minedata.minenavi.navi.RouteExplorer
import com.minedata.minenavi.navi.SmoothNaviData import com.minedata.minenavi.navi.SmoothNaviData
import com.minedata.minenavi.navi.TmcSections import com.minedata.minenavi.navi.TmcSections
import com.minedata.minenavi.util.Tools import com.minedata.minenavi.util.Tools
...@@ -34,7 +35,7 @@ object MineNai { ...@@ -34,7 +35,7 @@ object MineNai {
private var mNaviSession: NaviSession? = null private var mNaviSession: NaviSession? = null
// 导航小车 // 导航小车
private var mMapCar: Model? = null var mMapCar: Model? = null
private var mMineMap: MineMap? = null private var mMineMap: MineMap? = null
/**四维导航监听回调***/ /**四维导航监听回调***/
...@@ -87,22 +88,24 @@ object MineNai { ...@@ -87,22 +88,24 @@ object MineNai {
//是否正在导航 //是否正在导航
private var mIsInNavigation = false private var mIsInNavigation = false
/** /**
* 直接使用RouteBase开启导航 * 直接使用RouteBase开启导航
*/ */
fun startNaviFormRouteBase(routeBase: RouteBase?,mStartPoint:MSLatLng) { fun startNaviFormRouteBase(routeBase: RouteBase?, mStartPoint: MSLatLng,mapReadView: MapReadyView?) {
// mMineMap = mapReadView?.mMineMap // mMineMap = mapReadView?.mMineMap
if (routeBase == null) if (routeBase == null)
return return
mMineMap = mapReadView?.mMineMap
mNaviSession?.addMineNaviListener(myMineNaviListener) mNaviSession?.addMineNaviListener(myMineNaviListener)
val starPoint = Tools.latLngToPoint(LatLng(mStartPoint.lat, mStartPoint.lng)) val starPoint = Tools.latLngToPoint(LatLng(mStartPoint.lat, mStartPoint.lng))
drawNavingCar(starPoint) drawNavingCar(starPoint)
mIsInNavigation=true mIsInNavigation = true
mNaviSession?.takeRoute(routeBase) mNaviSession?.takeRoute(routeBase)
} }
fun stopNavi() { fun stopNavi() {
mIsInNavigation=false mIsInNavigation = false
mNaviSession?.removeRoute() mNaviSession?.removeRoute()
} }
...@@ -144,43 +147,55 @@ object MineNai { ...@@ -144,43 +147,55 @@ object MineNai {
* 四维 导航监听 * 四维 导航监听
*/ */
private var myMineNaviListener = object : MyMineNaviListener() { private var myMineNaviListener = object : MyMineNaviListener() {
override fun onRerouteStarted() {
super.onRerouteStarted()
RouteExplorer.getInstance().removeRoutes()
}
override fun onRerouteComplete(data: RouteBase?) {
super.onRerouteComplete(data)
MineRoutePlans.mRouteBase = data
MineRoutePlans.drawPlanPath(MineRoutePlans.mRouteBase)
// driverRouteBean.routeBase=mRouteBase
}
override fun onTracking(data: NaviSessionData) { override fun onTracking(data: NaviSessionData) {
// super.onTracking(data) // super.onTracking(data)
onNaviPresenterListener?.onTracking(data.travelledDistance.toFloat() / data.routeLength) onNaviPresenterListener?.onTracking(data.travelledDistance.toFloat() / data.routeLength)
} }
override fun onSmoothTracking(data: SmoothNaviData) { override fun onSmoothTracking(data: SmoothNaviData) {
super.onSmoothTracking(data) // super.onSmoothTracking(data)
onNaviPresenterListener?.onSmoothTracking(data) onNaviPresenterListener?.onSmoothTracking(data)
} }
override fun onDataUpdated(naviProgressData: NaviProgressData) { override fun onDataUpdated(naviProgressData: NaviProgressData) {
super.onDataUpdated(naviProgressData) // super.onDataUpdated(naviProgressData)
onNaviPresenterListener?.onDataUpdated(naviProgressData) onNaviPresenterListener?.onDataUpdated(naviProgressData)
} }
override fun onTiBarUpdated(tmcSections: TmcSections) { override fun onTiBarUpdated(tmcSections: TmcSections) {
super.onTiBarUpdated(tmcSections) // super.onTiBarUpdated(tmcSections)
onNaviPresenterListener?.onTiBarUpdated(tmcSections) onNaviPresenterListener?.onTiBarUpdated(tmcSections)
} }
override fun onTextChanged(guidanceText: GuidanceText) { override fun onTextChanged(guidanceText: GuidanceText) {
super.onTextChanged(guidanceText) // super.onTextChanged(guidanceText)
onNaviPresenterListener?.onTextChanged(guidanceText) onNaviPresenterListener?.onTextChanged(guidanceText)
} }
override fun onDistanceChanged(distance: Int) { override fun onDistanceChanged(distance: Int) {
super.onDistanceChanged(distance) // super.onDistanceChanged(distance)
onNaviPresenterListener?.onDistanceChanged(distance) onNaviPresenterListener?.onDistanceChanged(distance)
} }
override fun onArriveDestination() { override fun onArriveDestination() {
super.onArriveDestination() // super.onArriveDestination()
onNaviPresenterListener?.onArriveDestination() onNaviPresenterListener?.onArriveDestination()
} }
override fun onNaviEnded() { override fun onNaviEnded() {
super.onNaviEnded() // super.onNaviEnded()
onNaviPresenterListener?.onNaviEnded() onNaviPresenterListener?.onNaviEnded()
} }
......
...@@ -8,13 +8,11 @@ import com.minedata.minenavi.mapdal.DataPreference ...@@ -8,13 +8,11 @@ import com.minedata.minenavi.mapdal.DataPreference
import com.minedata.minenavi.mapdal.LatLng import com.minedata.minenavi.mapdal.LatLng
import com.minedata.minenavi.mapdal.PoiFavorite import com.minedata.minenavi.mapdal.PoiFavorite
import com.minedata.minenavi.navi.NaviSession import com.minedata.minenavi.navi.NaviSession
import com.minedata.minenavi.navi.NaviSessionParams
import com.minedata.minenavi.navi.RouteBase import com.minedata.minenavi.navi.RouteBase
import com.minedata.minenavi.navi.RouteCollection import com.minedata.minenavi.navi.RouteCollection
import com.minedata.minenavi.navi.RoutePlan import com.minedata.minenavi.navi.RoutePlan
import com.minedata.minenavi.navi.RouterErrorInfo import com.minedata.minenavi.navi.RouterErrorInfo
import com.minedata.minenavi.util.Tools import com.minedata.minenavi.util.Tools
import com.sd.maplibrary.UserCtx
import com.sd.maplibrary.bean.DriverRouteBean import com.sd.maplibrary.bean.DriverRouteBean
import com.sd.maplibrary.bean.MSLatLng import com.sd.maplibrary.bean.MSLatLng
import com.sd.maplibrary.bean.WayPoi import com.sd.maplibrary.bean.WayPoi
...@@ -76,12 +74,12 @@ object MineRoutePlans { ...@@ -76,12 +74,12 @@ object MineRoutePlans {
mNaviSession = NaviSession.getInstance() mNaviSession = NaviSession.getInstance()
// 开启语音播报 // 开启语音播报
mNaviSession?.enableSound(true) mNaviSession?.enableSound(true)
/* var naviSessionParams = NaviSessionParams().apply { /* var naviSessionParams = NaviSessionParams().apply {
autoReroute = true autoReroute = true
autoRemoveRoute = true autoRemoveRoute = true
// useMineNaviGPS = true // useMineNaviGPS = true
} }
mNaviSession!!.init(context, naviSessionParams)*/ mNaviSession!!.init(context, naviSessionParams)*/
mNaviSession?.setDataPreference(DataPreference.preferOnline) mNaviSession?.setDataPreference(DataPreference.preferOnline)
mNaviSession?.addMineNaviListener(planiListener) mNaviSession?.addMineNaviListener(planiListener)
...@@ -117,9 +115,7 @@ object MineRoutePlans { ...@@ -117,9 +115,7 @@ object MineRoutePlans {
* 绘制规划的路线路径。 * 绘制规划的路线路径。
* @param routeBase 路线数据 * @param routeBase 路线数据
*/ */
private fun drawPlanPath( fun drawPlanPath(routeBase: RouteBase?) {
routeBase: RouteBase?
) {
if (routeBase == null) if (routeBase == null)
return return
// 移除旧的路线覆盖物 // 移除旧的路线覆盖物
...@@ -201,7 +197,7 @@ object MineRoutePlans { ...@@ -201,7 +197,7 @@ object MineRoutePlans {
// 获取单条道路信息 // 获取单条道路信息
mRouteBase = data.routes.get(0) mRouteBase = data.routes.get(0)
drawPlanPath(mRouteBase) drawPlanPath(mRouteBase)
driverRouteBean.routeBase=mRouteBase driverRouteBean.routeBase = mRouteBase
onDriveRoute?.onDriverRoute(driverRouteBean) onDriveRoute?.onDriverRoute(driverRouteBean)
} }
......
...@@ -58,7 +58,7 @@ abstract class MyMineNaviListener : MineNaviListener { ...@@ -58,7 +58,7 @@ abstract class MyMineNaviListener : MineNaviListener {
override fun onRerouteCancelled() { override fun onRerouteCancelled() {
} }
override fun onRerouteComplete(p0: RouteBase?) { override fun onRerouteComplete(data: RouteBase?) {
} }
override fun onRerouteFailed(p0: RouterErrorInfo) { override fun onRerouteFailed(p0: RouterErrorInfo) {
......
package com.sd.maplibrary.intfaces
/***
* 确定取消
*/
interface OnComCan {
fun onComfirm()
fun onCancel()
}
\ No newline at end of file
package com.sd.maplibrary.ui package com.sd.maplibrary.ui
import android.os.Bundle import android.os.Bundle
import android.view.KeyEvent
import android.view.View
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import com.minedata.minenavi.addons.DistanceBean
import com.minedata.minenavi.addons.SpannableBuilder
import com.minedata.minenavi.mapdal.NativeEnv
import com.minedata.minenavi.mapdal.NdsPoint
import com.minedata.minenavi.navi.GuidanceText import com.minedata.minenavi.navi.GuidanceText
import com.minedata.minenavi.navi.NaviProgressData import com.minedata.minenavi.navi.NaviProgressData
import com.minedata.minenavi.navi.NaviSessionData import com.minedata.minenavi.navi.RouteExplorer
import com.minedata.minenavi.navi.SmoothNaviData import com.minedata.minenavi.navi.SmoothNaviData
import com.minedata.minenavi.navi.TmcSections import com.minedata.minenavi.navi.TmcSections
import com.minedata.minenavi.navi.TurnIconModel
import com.minedata.minenavi.util.MineNaviUtil
import com.minedata.minenavi.util.Tools
import com.sd.maplibrary.R
import com.sd.maplibrary.bean.DriverRouteBean import com.sd.maplibrary.bean.DriverRouteBean
import com.sd.maplibrary.core.MapReadyView import com.sd.maplibrary.core.MapReadyView
import com.sd.maplibrary.core.basic.OnDriveRoute import com.sd.maplibrary.core.basic.OnDriveRoute
import com.sd.maplibrary.core.basic.mine.MineNai import com.sd.maplibrary.core.basic.mine.MineNai
import com.sd.maplibrary.core.basic.mine.MineNaiParams import com.sd.maplibrary.core.basic.mine.MineNaiParams
import com.sd.maplibrary.core.basic.mine.MineRoutePlans
import com.sd.maplibrary.databinding.ActivityMineNaiDirBinding import com.sd.maplibrary.databinding.ActivityMineNaiDirBinding
import com.sd.maplibrary.factorys.MapCoreApi import com.sd.maplibrary.factorys.MapCoreApi
import com.sd.maplibrary.intfaces.OnComCan
import com.sd.maplibrary.intfaces.OnNaviPresenterListener import com.sd.maplibrary.intfaces.OnNaviPresenterListener
import com.sd.maplibrary.ui.MapMultiView.OnMapReadyLis import com.sd.maplibrary.ui.MapMultiView.OnMapReadyLis
import com.sd.maplibrary.ui.dialog.ExitNaiDialog
import com.sd.maplibrary.utils.Utils
/** /**
* 直接开始导航 * 直接开始导航
*/ */
class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener { class MineNaiDirActivity : AppCompatActivity(), OnNaviPresenterListener {
private lateinit var binding: ActivityMineNaiDirBinding private lateinit var binding: ActivityMineNaiDirBinding
...@@ -32,6 +47,11 @@ class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener { ...@@ -32,6 +47,11 @@ class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener {
//获取接口功能实例 //获取接口功能实例
private var mapCoreApi = MapCoreApi.mapCoreApi private var mapCoreApi = MapCoreApi.mapCoreApi
//四维导航地图工具
private lateinit var mUtils: Utils
private lateinit var dialogFragment: ExitNaiDialog
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
...@@ -42,9 +62,12 @@ class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener { ...@@ -42,9 +62,12 @@ class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener {
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets insets
}*/ }*/
mUtils = Utils()
mUtils.init(this)
mineNaiParams = intent.getParcelableExtra<MineNaiParams>("mineNaiParams") mineNaiParams = intent.getParcelableExtra<MineNaiParams>("mineNaiParams")
MineNai.onNaviPresenterListener = this
binding.mapMultiView.addMapRenderCallback(object : OnMapReadyLis { binding.mapMultiView.addMapRenderCallback(object : OnMapReadyLis {
override fun onMapReady(mapReadyView: MapReadyView) { override fun onMapReady(mapReadyView: MapReadyView) {
this@MineNaiDirActivity.mapReadView = mapReadyView this@MineNaiDirActivity.mapReadView = mapReadyView
...@@ -66,19 +89,19 @@ class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener { ...@@ -66,19 +89,19 @@ class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener {
//开始路径规划 //开始路径规划
mapCoreApi.drivingPathPlanning( mapCoreApi.drivingPathPlanning(
startPoint, startName, endPoint, endName, ways, mapReadView,object : OnDriveRoute { startPoint, startName, endPoint, endName, ways, mapReadView, object : OnDriveRoute {
override fun onDriverRoute(driverRouteBean: DriverRouteBean) { override fun onDriverRoute(driverRouteBean: DriverRouteBean) {
var routeBase = driverRouteBean.routeBase var routeBase = driverRouteBean.routeBase
MineNai.startNaviFormRouteBase(routeBase,startPoint) MineNai.startNaviFormRouteBase(routeBase, startPoint, mapReadView)
} }
} }
) )
} }
override fun onDestroy() { // override fun onDestroy() {
super.onDestroy() // super.onDestroy()
MineNai.stopNavi() // MineNai.stopNavi()
} // }
override fun onTracking(ratio: Float) { override fun onTracking(ratio: Float) {
binding.layoutNavi.tmcBarView.updateRatio(ratio) binding.layoutNavi.tmcBarView.updateRatio(ratio)
...@@ -86,19 +109,179 @@ class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener { ...@@ -86,19 +109,179 @@ class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener {
} }
/**
* 刷新导航中的自车位置
*/
fun showNavingCarPosition(ndsPoint: NdsPoint?, heading: Float) {
synchronized(NativeEnv.SyncObject) {
if (ndsPoint == null) {
return
}
var mMapCar = MineNai.mMapCar
mMapCar?.setPositionNds(Tools.ndsPointToLatLng(ndsPoint))
mMapCar?.setHeading(heading)
//刷新小地图自车位置
/* if (mSmallMapCar != null) {
mSmallMapCar!!.orientAngle(heading)
mSmallMapCar!!.setPositionNds(Tools.ndsPointToLatLng(ndsPoint))
}
if (mNaviCompassOverlay != null) {
mNaviCompassOverlay!!.setPositionNds(ndsPoint)
}*/
}
}
override fun onSmoothTracking(data: SmoothNaviData) { override fun onSmoothTracking(data: SmoothNaviData) {
val carHeading =
if (data != null) data.carHeading else MineRoutePlans.mRouteBase!!.getStartDirection()
.toFloat()
val mapHeading = if (data != null) data.mapHeading else 0f
var mineMap = mapReadView?.mMineMap
showNavingCarPosition(data.carPos, carHeading)
mineMap?.setHeading(mapHeading)
mineMap?.setElevation(50.0f)
mineMap?.setFovy(35f)
mineMap?.setViewShiftXY(0f, 0.55f)
mineMap?.setNdsPointToCenter(data.carPos.x, data.carPos.y)
val zoomLevel = mineMap!!.getAutomaticZoomLevelForMineMap(0.2f)
if (zoomLevel != -1f) {
mineMap!!.setZoomLevel(zoomLevel)
}
}
/**
* 设置剩余行程距离时间
*/
private fun setResidualDistance(hour: Int, distance: Int) {
val distanceBean = mUtils.formatDistance(distance, false)
val timeBean = mUtils.calcTimeBean(hour)
if (binding.layoutNavi.tvResidualTimeDistance.isVisible) {
val stringBuilder = StringBuilder()
stringBuilder.append(distanceBean.distanceValue).append(distanceBean.distanceUnit)
binding.layoutNavi.tvResidualTimeDistance.setText(stringBuilder.toString())
stringBuilder.delete(0, stringBuilder.length)
stringBuilder
// .append("剩余")
.append(if (timeBean.hour == 0) "" else "${timeBean.hour}")
.append(if (timeBean.hour == 0) "" else "小时")
.append("${timeBean.minute}")
.append(if (timeBean.hour == 0) "分钟" else "分")
binding.layoutNavi.tvTime.setText(stringBuilder.toString())
}
}
/**
* 设置到达时间
*/
private fun setResidualTime(naviProgressData: NaviProgressData?) {
if (naviProgressData == null) return
val s_arriveTime =
MineNaviUtil.relativeTimeStringFromNow(
naviProgressData.remainingTime,
mUtils.is24Hour()
)
var stringBuilder = StringBuilder()
if (s_arriveTime.contains("天")) {
stringBuilder
// .append("预计")
.append(s_arriveTime.substring(0, s_arriveTime.indexOf("天") + 1) + "")
.append(s_arriveTime.substring(s_arriveTime.indexOf("天") + 1, s_arriveTime.length))
.append("到")
} else if (s_arriveTime.contains("日")) {
stringBuilder
// .append("预计")
.append(s_arriveTime.substring(0, s_arriveTime.indexOf("日") + 1) + "")
.append(s_arriveTime.substring(s_arriveTime.indexOf("日") + 1, s_arriveTime.length))
.append("到")
} else {
stringBuilder
// .append("预计")
.append(s_arriveTime)
.append("到")
}
binding.layoutNavi.tvArriveTime.setText(stringBuilder.toString())
} }
override fun onDataUpdated(naviProgressData: NaviProgressData) { override fun onDataUpdated(naviProgressData: NaviProgressData) {
/* mSmallMapViewRouteRect = naviProgressData.remainingBoundingBox
fitRouteInSmallMap()*/
var mRouteBase = MineRoutePlans.mRouteBase
setResidualDistance(
naviProgressData.remainingTime,
naviProgressData.routeLength - naviProgressData.curDistance
)
setResidualTime(naviProgressData)
val remainingTrafficLightCount: Int =
mRouteBase?.calculateTrafficLightCountInDistanceRange(
naviProgressData.curDistance,
naviProgressData.routeLength
) ?: 0
val statusByRoute =
RouteExplorer.getInstance().getStatusByRoute(mRouteBase)
if (statusByRoute != null && statusByRoute.remainingDistance < 100 * 1000) {
with(binding.layoutNavi) {
ivBottomTrafficLight.setVisibility(View.VISIBLE)
tvTrafficLightNumber.setVisibility(View.VISIBLE)
tvTrafficLightNumber.setText(remainingTrafficLightCount.toString() + "")
}
} else {
with(binding.layoutNavi) {
ivBottomTrafficLight.setVisibility(View.GONE)
tvTrafficLightNumber.setVisibility(View.GONE)
}
}
} }
override fun onTiBarUpdated(tmcSections: TmcSections) { override fun onTiBarUpdated(tmcSections: TmcSections) {
binding.layoutNavi.tmcBarView.post {
if (tmcSections != null) {
binding.layoutNavi.tmcBarView.setTmcSections(tmcSections)
}
}
} }
override fun onTextChanged(guidanceText: GuidanceText) { override fun onTextChanged(guidanceText: GuidanceText) {
if (guidanceText?.turnIconModel?.valid ?: false) {
when (guidanceText?.turnIconModel?.type) {//交叉路口、、环岛
TurnIconModel.Type.junction, TurnIconModel.Type.rotary -> {
// println("----------- 转角和环岛 iconId= ${guidanceText.turnIconModel.iconId}")
// println("----------- 转角和环岛 toDirection= ${guidanceText.turnIconModel.toDirection}")
binding.layoutNavi.turnIconView.setTurnIconModel(guidanceText.turnIconModel)
}
TurnIconModel.Type.iconId -> {// 图片类型
// println("----------- iconId= ${guidanceText.turnIconModel.iconId}")
// println("----------- toDirection = ${guidanceText.turnIconModel.toDirection}")
binding.layoutNavi.turnIconView.setTurnIconId(guidanceText.turnIconModel.iconId)
}
}
} else {
binding.layoutNavi.turnIconView.setTurnIconId(
// guidanceText?.turnIconModel?.iconId ?: 0
R.drawable.go_here
)
}
with(binding.layoutNavi) {
tvTurnAction.setText(guidanceText?.action)
tvTurnRoadName.setText(mUtils.toDBC(guidanceText?.name))
}
} }
override fun onDistanceChanged(distance: Int) { override fun onDistanceChanged(distance: Int) {
val distanceBean: DistanceBean = mUtils.formatDistance(distance, false)
val distanceToTurnInJunctionViewSpannable = SpannableBuilder.create(this)
.append(distanceBean.distanceValue, R.dimen.sp_24, R.color.text_black)
.append(distanceBean.distanceUnit, R.dimen.sp_14, R.color.text_black)
.build()
binding.layoutNavi.tvTurnDistance.setText(distanceToTurnInJunctionViewSpannable)
} }
override fun onArriveDestination() { override fun onArriveDestination() {
...@@ -107,5 +290,24 @@ class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener { ...@@ -107,5 +290,24 @@ class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener {
override fun onNaviEnded() { override fun onNaviEnded() {
} }
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK) || event.getKeyCode() == KeyEvent.KEYCODE_HOME) {
dialogFragment = ExitNaiDialog()
dialogFragment.onComCan = object : OnComCan {
override fun onComfirm() {
MineNai.stopNavi()
finish()
}
override fun onCancel() {
}
}
dialogFragment.show(supportFragmentManager, "exit")
return true
} else {
return super.dispatchKeyEvent(event)
}
}
} }
\ No newline at end of file
package com.sd.maplibrary.ui.dialog
import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
import com.sd.maplibrary.intfaces.OnComCan
class ExitNaiDialog : DialogFragment() {
var onComCan: OnComCan? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
isCancelable=false
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return AlertDialog.Builder(requireContext())
// dialog.setIcon(android.R.drawable.ic_dialog_info)
.setTitle("提示")
.setMessage("确定退出导航")
.setPositiveButton(
"确定"
) { dialog1: DialogInterface?, which: Int ->
onComCan?.onComfirm()
}
.setNegativeButton("取消") { dialog, _ ->
onComCan?.onCancel()
}.create()
}
}
\ 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;
}
}
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
android:layout_width="@dimen/map_left_top_widget" android:layout_width="@dimen/map_left_top_widget"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_10" android:layout_marginLeft="@dimen/dp_10"
android:layout_marginTop="@dimen/dp_10" android:layout_marginTop="@dimen/dp_30"
/> />
</RelativeLayout> </RelativeLayout>
\ No newline at end of file
...@@ -437,7 +437,7 @@ ...@@ -437,7 +437,7 @@
<dimen name="nz_px_398">191.04dp</dimen> <dimen name="nz_px_398">191.04dp</dimen>
<dimen name="nz_px_399">191.52dp</dimen> <dimen name="nz_px_399">191.52dp</dimen>
<dimen name="nz_px_400">192.00dp</dimen> <dimen name="nz_px_400">192.00dp</dimen>
<dimen name="map_left_top_widget">230dp</dimen> <dimen name="map_left_top_widget">260dp</dimen>
<dimen name="fab_margin">16dp</dimen> <dimen name="fab_margin">16dp</dimen>
......
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