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

封装导航

parent 05725fa8
......@@ -14,6 +14,7 @@ import com.minedata.minenavi.navi.NaviSession
import com.minedata.minenavi.navi.NaviSessionData
import com.minedata.minenavi.navi.NaviSessionParams
import com.minedata.minenavi.navi.RouteBase
import com.minedata.minenavi.navi.RouteExplorer
import com.minedata.minenavi.navi.SmoothNaviData
import com.minedata.minenavi.navi.TmcSections
import com.minedata.minenavi.util.Tools
......@@ -34,7 +35,7 @@ object MineNai {
private var mNaviSession: NaviSession? = null
// 导航小车
private var mMapCar: Model? = null
var mMapCar: Model? = null
private var mMineMap: MineMap? = null
/**四维导航监听回调***/
......@@ -87,22 +88,24 @@ object MineNai {
//是否正在导航
private var mIsInNavigation = false
/**
* 直接使用RouteBase开启导航
*/
fun startNaviFormRouteBase(routeBase: RouteBase?,mStartPoint:MSLatLng) {
fun startNaviFormRouteBase(routeBase: RouteBase?, mStartPoint: MSLatLng,mapReadView: MapReadyView?) {
// mMineMap = mapReadView?.mMineMap
if (routeBase == null)
return
mMineMap = mapReadView?.mMineMap
mNaviSession?.addMineNaviListener(myMineNaviListener)
val starPoint = Tools.latLngToPoint(LatLng(mStartPoint.lat, mStartPoint.lng))
drawNavingCar(starPoint)
mIsInNavigation=true
mIsInNavigation = true
mNaviSession?.takeRoute(routeBase)
}
fun stopNavi() {
mIsInNavigation=false
mIsInNavigation = false
mNaviSession?.removeRoute()
}
......@@ -144,43 +147,55 @@ object MineNai {
* 四维 导航监听
*/
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) {
// super.onTracking(data)
onNaviPresenterListener?.onTracking(data.travelledDistance.toFloat() / data.routeLength)
}
override fun onSmoothTracking(data: SmoothNaviData) {
super.onSmoothTracking(data)
// super.onSmoothTracking(data)
onNaviPresenterListener?.onSmoothTracking(data)
}
override fun onDataUpdated(naviProgressData: NaviProgressData) {
super.onDataUpdated(naviProgressData)
// super.onDataUpdated(naviProgressData)
onNaviPresenterListener?.onDataUpdated(naviProgressData)
}
override fun onTiBarUpdated(tmcSections: TmcSections) {
super.onTiBarUpdated(tmcSections)
// super.onTiBarUpdated(tmcSections)
onNaviPresenterListener?.onTiBarUpdated(tmcSections)
}
override fun onTextChanged(guidanceText: GuidanceText) {
super.onTextChanged(guidanceText)
// super.onTextChanged(guidanceText)
onNaviPresenterListener?.onTextChanged(guidanceText)
}
override fun onDistanceChanged(distance: Int) {
super.onDistanceChanged(distance)
// super.onDistanceChanged(distance)
onNaviPresenterListener?.onDistanceChanged(distance)
}
override fun onArriveDestination() {
super.onArriveDestination()
// super.onArriveDestination()
onNaviPresenterListener?.onArriveDestination()
}
override fun onNaviEnded() {
super.onNaviEnded()
// super.onNaviEnded()
onNaviPresenterListener?.onNaviEnded()
}
......
......@@ -8,13 +8,11 @@ import com.minedata.minenavi.mapdal.DataPreference
import com.minedata.minenavi.mapdal.LatLng
import com.minedata.minenavi.mapdal.PoiFavorite
import com.minedata.minenavi.navi.NaviSession
import com.minedata.minenavi.navi.NaviSessionParams
import com.minedata.minenavi.navi.RouteBase
import com.minedata.minenavi.navi.RouteCollection
import com.minedata.minenavi.navi.RoutePlan
import com.minedata.minenavi.navi.RouterErrorInfo
import com.minedata.minenavi.util.Tools
import com.sd.maplibrary.UserCtx
import com.sd.maplibrary.bean.DriverRouteBean
import com.sd.maplibrary.bean.MSLatLng
import com.sd.maplibrary.bean.WayPoi
......@@ -76,12 +74,12 @@ object MineRoutePlans {
mNaviSession = NaviSession.getInstance()
// 开启语音播报
mNaviSession?.enableSound(true)
/* var naviSessionParams = NaviSessionParams().apply {
autoReroute = true
autoRemoveRoute = true
// useMineNaviGPS = true
}
mNaviSession!!.init(context, naviSessionParams)*/
/* var naviSessionParams = NaviSessionParams().apply {
autoReroute = true
autoRemoveRoute = true
// useMineNaviGPS = true
}
mNaviSession!!.init(context, naviSessionParams)*/
mNaviSession?.setDataPreference(DataPreference.preferOnline)
mNaviSession?.addMineNaviListener(planiListener)
......@@ -117,9 +115,7 @@ object MineRoutePlans {
* 绘制规划的路线路径。
* @param routeBase 路线数据
*/
private fun drawPlanPath(
routeBase: RouteBase?
) {
fun drawPlanPath(routeBase: RouteBase?) {
if (routeBase == null)
return
// 移除旧的路线覆盖物
......@@ -201,7 +197,7 @@ object MineRoutePlans {
// 获取单条道路信息
mRouteBase = data.routes.get(0)
drawPlanPath(mRouteBase)
driverRouteBean.routeBase=mRouteBase
driverRouteBean.routeBase = mRouteBase
onDriveRoute?.onDriverRoute(driverRouteBean)
}
......
......@@ -58,7 +58,7 @@ abstract class MyMineNaviListener : MineNaviListener {
override fun onRerouteCancelled() {
}
override fun onRerouteComplete(p0: RouteBase?) {
override fun onRerouteComplete(data: RouteBase?) {
}
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
import android.os.Bundle
import android.view.KeyEvent
import android.view.View
import androidx.activity.enableEdgeToEdge
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.NaviProgressData
import com.minedata.minenavi.navi.NaviSessionData
import com.minedata.minenavi.navi.RouteExplorer
import com.minedata.minenavi.navi.SmoothNaviData
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.core.MapReadyView
import com.sd.maplibrary.core.basic.OnDriveRoute
import com.sd.maplibrary.core.basic.mine.MineNai
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.factorys.MapCoreApi
import com.sd.maplibrary.intfaces.OnComCan
import com.sd.maplibrary.intfaces.OnNaviPresenterListener
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
......@@ -32,6 +47,11 @@ class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener {
//获取接口功能实例
private var mapCoreApi = MapCoreApi.mapCoreApi
//四维导航地图工具
private lateinit var mUtils: Utils
private lateinit var dialogFragment: ExitNaiDialog
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
......@@ -42,9 +62,12 @@ class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener {
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}*/
mUtils = Utils()
mUtils.init(this)
mineNaiParams = intent.getParcelableExtra<MineNaiParams>("mineNaiParams")
MineNai.onNaviPresenterListener = this
binding.mapMultiView.addMapRenderCallback(object : OnMapReadyLis {
override fun onMapReady(mapReadyView: MapReadyView) {
this@MineNaiDirActivity.mapReadView = mapReadyView
......@@ -66,19 +89,19 @@ class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener {
//开始路径规划
mapCoreApi.drivingPathPlanning(
startPoint, startName, endPoint, endName, ways, mapReadView,object : OnDriveRoute {
startPoint, startName, endPoint, endName, ways, mapReadView, object : OnDriveRoute {
override fun onDriverRoute(driverRouteBean: DriverRouteBean) {
var routeBase = driverRouteBean.routeBase
MineNai.startNaviFormRouteBase(routeBase,startPoint)
MineNai.startNaviFormRouteBase(routeBase, startPoint, mapReadView)
}
}
)
}
override fun onDestroy() {
super.onDestroy()
MineNai.stopNavi()
}
// override fun onDestroy() {
// super.onDestroy()
// MineNai.stopNavi()
// }
override fun onTracking(ratio: Float) {
binding.layoutNavi.tmcBarView.updateRatio(ratio)
......@@ -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) {
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) {
/* 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) {
binding.layoutNavi.tmcBarView.post {
if (tmcSections != null) {
binding.layoutNavi.tmcBarView.setTmcSections(tmcSections)
}
}
}
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) {
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() {
......@@ -107,5 +290,24 @@ class MineNaiDirActivity : AppCompatActivity(),OnNaviPresenterListener {
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
This diff is collapsed.
......@@ -19,7 +19,7 @@
android:layout_width="@dimen/map_left_top_widget"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_10"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginTop="@dimen/dp_30"
/>
</RelativeLayout>
\ No newline at end of file
......@@ -437,7 +437,7 @@
<dimen name="nz_px_398">191.04dp</dimen>
<dimen name="nz_px_399">191.52dp</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>
......
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