[6.6.0][视角切换] 逻辑优化
This commit is contained in:
@@ -32,8 +32,8 @@ class VisualViewModel : ViewModel(),
|
||||
}
|
||||
|
||||
override fun onSceneChanged(scene: Scene) {
|
||||
if (scene.isCanSwitch) {// 可切换
|
||||
when (scene.angle) {
|
||||
if (scene.isCanSwitch()) {// 可切换
|
||||
when (scene.getVisualAngleMode()) {
|
||||
VisualAngleMode.MODE_MEDIUM_SIGHT -> {
|
||||
UiThreadHandler.post({
|
||||
this.viewCallback?.setViewShow(true)
|
||||
|
||||
@@ -33,8 +33,8 @@ class DebugViewModel : ViewModel(),
|
||||
}
|
||||
|
||||
override fun onSceneChanged(scene: Scene) {
|
||||
if (scene.isCanSwitch) {// 可切换
|
||||
when (scene.angle) {
|
||||
if (scene.isCanSwitch()) {// 可切换
|
||||
when (scene.getVisualAngleMode()) {
|
||||
VisualAngleMode.MODE_MEDIUM_SIGHT -> {
|
||||
UiThreadHandler.post({
|
||||
this.viewCallback?.setViewShow(true)
|
||||
|
||||
@@ -152,7 +152,7 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider {
|
||||
override fun changeScene(scene: Scene) {
|
||||
prevJob?.safeCancel()
|
||||
scope.launch {
|
||||
val delay = scene.delay
|
||||
val delay = scene.getDelay()
|
||||
if (delay > 0) {
|
||||
delay(delay)
|
||||
}
|
||||
@@ -165,8 +165,8 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider {
|
||||
verifyPrior = false
|
||||
}
|
||||
if (verifyPrior) {
|
||||
val lastPriority = prev?.priority ?: Int.MIN_VALUE
|
||||
val currentPriority = scene.priority
|
||||
val lastPriority = prev?.getPriority() ?: Int.MIN_VALUE
|
||||
val currentPriority = scene.getPriority()
|
||||
if (lastPriority > currentPriority) {
|
||||
return@launch
|
||||
}
|
||||
@@ -182,18 +182,19 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider {
|
||||
}
|
||||
|
||||
private fun doChangeAngle(target: Scene) {
|
||||
val angle = target.angle
|
||||
val angle = target.getVisualAngleMode()
|
||||
CallerMapUIServiceManager.getMapUIController()?.also {
|
||||
Log.d(TAG, "--- doChangeAngle ---: $target")
|
||||
val prev = prevScene.get()
|
||||
try {
|
||||
if (!target.isCanTouch) {
|
||||
if (!target.isCanTouch()) {
|
||||
CallerMapUIServiceManager.getMapUIController()?.setAllGesturesEnabled(false)
|
||||
} else {
|
||||
CallerMapUIServiceManager.getMapUIController()?.setAllGesturesEnabled(true)
|
||||
}
|
||||
val screenToOriginDis = target.getScreenToOriginDis()
|
||||
when(screenToOriginDis) {
|
||||
ScreenToOriginDis.NONE -> {}
|
||||
DEFAULT -> CallerMapUIServiceManager.getMapUIController()?.setScreenToOriginDis(4.0f)
|
||||
UP -> CallerMapUIServiceManager.getMapUIController()?.setScreenToOriginDis(3.0f)
|
||||
DOWN -> CallerMapUIServiceManager.getMapUIController()?.setScreenToOriginDis(5.0f)
|
||||
@@ -206,9 +207,9 @@ class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider {
|
||||
notifyChanged(target)
|
||||
}
|
||||
prevScene.set(target)
|
||||
if (target.displayThreshold > 0) {
|
||||
if (target.getDisplayThreshold() > 0) {
|
||||
scope.launch {
|
||||
delay(target.displayThreshold)
|
||||
delay(target.getDisplayThreshold())
|
||||
doChangeAngle(Default())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
package com.mogo.eagle.core.function.angle.scenes
|
||||
|
||||
import com.mogo.eagle.core.data.config.FunctionBuildConfig
|
||||
import com.mogo.eagle.core.function.api.map.angle.Scene
|
||||
import com.mogo.eagle.core.function.api.map.angle.ScreenToOriginDis
|
||||
import com.mogo.eagle.core.function.api.map.angle.ScreenToOriginDis.DOWN
|
||||
import com.mogo.eagle.core.function.api.map.angle.ScreenToOriginDis.NONE
|
||||
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
|
||||
import com.mogo.map.uicontroller.VisualAngleMode
|
||||
import com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_CROSS_NEW
|
||||
import java.util.concurrent.TimeUnit
|
||||
@@ -10,28 +13,32 @@ import java.util.concurrent.TimeUnit
|
||||
/**
|
||||
* 十字路口
|
||||
*/
|
||||
class CrossRoad(private val delayTime: Long = 0, private val unit: TimeUnit = TimeUnit.SECONDS): Scene {
|
||||
override val angle: VisualAngleMode
|
||||
get() = MAP_STYLE_VR_ANGLE_CROSS_NEW
|
||||
class CrossRoad(private val delayTime: Long = 0, unit: TimeUnit = TimeUnit.SECONDS) :
|
||||
Scene(delayTime, unit) {
|
||||
|
||||
override val priority: Int = 0
|
||||
override val displayThreshold: Long
|
||||
get() = -1
|
||||
override fun getVisualAngleMode(): VisualAngleMode {
|
||||
if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
|
||||
return VisualAngleMode.MAP_STYLE_VR_ANGLE_CROSS
|
||||
}
|
||||
return MAP_STYLE_VR_ANGLE_CROSS_NEW
|
||||
}
|
||||
|
||||
override val delay: Long
|
||||
get() = unit.toMillis(delayTime)
|
||||
override fun isCanTouch(): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override val isCanSwitch: Boolean
|
||||
get() = false
|
||||
|
||||
override val isCanTouch: Boolean
|
||||
get() = false
|
||||
override fun isCanSwitch(): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "CrossRoad(delayTime=${delayTime}, priority=${priority}, displayThreshold: ${displayThreshold}, priority=${priority})"
|
||||
return "CrossRoad(delayTime=${delayTime}, priority=${getPriority()}, displayThreshold: ${getDisplayThreshold()}, priority=${getPriority()})"
|
||||
}
|
||||
|
||||
override fun getScreenToOriginDis(): ScreenToOriginDis {
|
||||
if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
|
||||
return NONE
|
||||
}
|
||||
return DOWN
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,37 +1,29 @@
|
||||
package com.mogo.eagle.core.function.angle.scenes
|
||||
|
||||
import android.util.Log
|
||||
import com.mogo.eagle.core.data.config.FunctionBuildConfig
|
||||
import com.mogo.eagle.core.function.api.map.angle.Scene
|
||||
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
|
||||
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
|
||||
import com.mogo.map.uicontroller.VisualAngleMode
|
||||
import com.mogo.map.uicontroller.VisualAngleMode.MODE_MEDIUM_SIGHT
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
/**
|
||||
* 默认视图
|
||||
* @param delay: 表示多少稍后,默认值为2
|
||||
* @param unit: 时间单位,默认为秒
|
||||
*/
|
||||
class Default(val delayTime: Long = 0, val unit: TimeUnit = TimeUnit.SECONDS, val forceClosePrev: Boolean = false): Scene(delayTime, unit) {
|
||||
|
||||
class Default(val delayTime: Long = 0, val unit: TimeUnit = TimeUnit.SECONDS, val forceClosePrev: Boolean = false): Scene {
|
||||
|
||||
override val angle: VisualAngleMode
|
||||
get() = CallerMapUIServiceManager.getMapUIController()?.getVrAngleDefaultMode() ?: MODE_MEDIUM_SIGHT
|
||||
|
||||
override val priority: Int = 0
|
||||
|
||||
override val displayThreshold: Long
|
||||
get() = 0
|
||||
|
||||
override val delay: Long
|
||||
get() = unit.toMillis(delayTime)
|
||||
|
||||
override val isCanSwitch: Boolean
|
||||
get() = true
|
||||
|
||||
override val isCanTouch: Boolean
|
||||
get() = true
|
||||
override fun getVisualAngleMode(): VisualAngleMode {
|
||||
Log.d("Default", "---- 1 --------------")
|
||||
if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
|
||||
Log.d("Default", "---- 2 --------------")
|
||||
return VisualAngleMode.MAP_STYLE_VR_ERHAI_B2
|
||||
}
|
||||
return CallerMapUIServiceManager.getMapUIController()?.getVrAngleDefaultMode() ?: MODE_MEDIUM_SIGHT
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "Default(delay=$delay, unit=$unit, angle=$angle, priority=$priority, closePrevious=$forceClosePrev)"
|
||||
return "Default(delay=${getDelay()}, unit=$unit, angle=${getVisualAngleMode()}, priority=${getPriority()}, closePrevious=$forceClosePrev)"
|
||||
}
|
||||
}
|
||||
@@ -5,21 +5,13 @@ import com.mogo.map.uicontroller.VisualAngleMode
|
||||
import com.mogo.map.uicontroller.VisualAngleMode.MODE_LONG_SIGHT
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
class LongSight(private val delayTime: Long = 0, private val unit: TimeUnit = TimeUnit.SECONDS): Scene {
|
||||
class LongSight(private val delayTime: Long = 0, private val unit: TimeUnit = TimeUnit.SECONDS): Scene(delayTime, unit) {
|
||||
|
||||
override val angle: VisualAngleMode
|
||||
get() = MODE_LONG_SIGHT
|
||||
override val priority: Int
|
||||
get() = 0
|
||||
override val displayThreshold: Long
|
||||
get() = -1
|
||||
override fun getVisualAngleMode(): VisualAngleMode {
|
||||
return MODE_LONG_SIGHT
|
||||
}
|
||||
|
||||
override val delay: Long
|
||||
get() = unit.toMillis(delayTime)
|
||||
|
||||
override val isCanSwitch: Boolean
|
||||
get() = true
|
||||
|
||||
override val isCanTouch: Boolean
|
||||
get() = true
|
||||
override fun toString(): String {
|
||||
return "LongSight(delayTime=${delayTime}, priority=${getPriority()}, displayThreshold: ${getDisplayThreshold()}, priority=${getPriority()})"
|
||||
}
|
||||
}
|
||||
@@ -1,33 +1,27 @@
|
||||
package com.mogo.eagle.core.function.angle.scenes
|
||||
|
||||
import com.mogo.eagle.core.data.config.FunctionBuildConfig
|
||||
import com.mogo.eagle.core.function.api.map.angle.Scene
|
||||
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
|
||||
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
|
||||
import com.mogo.map.uicontroller.VisualAngleMode
|
||||
import com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ERHAI_B2
|
||||
import com.mogo.map.uicontroller.VisualAngleMode.MODE_MEDIUM_SIGHT
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
/**
|
||||
* 道路事件
|
||||
*/
|
||||
class RoadEvent(private val delayTime: Long, private val unit: TimeUnit): Scene {
|
||||
class RoadEvent(delayTime: Long, unit: TimeUnit): Scene(delayTime, unit) {
|
||||
|
||||
override val angle: VisualAngleMode = CallerMapUIServiceManager.getMapUIController()?.getVrAngleDefaultMode() ?: MODE_MEDIUM_SIGHT
|
||||
|
||||
override val priority: Int = 0
|
||||
|
||||
override val displayThreshold: Long
|
||||
get() = -1
|
||||
|
||||
override val delay: Long
|
||||
get() = unit.toMillis(delayTime)
|
||||
|
||||
override fun toString(): String {
|
||||
return "RoadEvent(priority=${priority}, displayThreshold: ${displayThreshold}, priority=${priority}"
|
||||
override fun getVisualAngleMode(): VisualAngleMode {
|
||||
if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {
|
||||
return MAP_STYLE_VR_ERHAI_B2
|
||||
}
|
||||
return CallerMapUIServiceManager.getMapUIController()?.getVrAngleDefaultMode() ?: MODE_MEDIUM_SIGHT
|
||||
}
|
||||
|
||||
override val isCanSwitch: Boolean
|
||||
get() = true
|
||||
|
||||
override val isCanTouch: Boolean
|
||||
get() = true
|
||||
override fun toString(): String {
|
||||
return "RoadEvent(mode: ${getVisualAngleMode()}, priority=${getPriority()}, displayThreshold: ${getDisplayThreshold()},"
|
||||
}
|
||||
}
|
||||
@@ -8,18 +8,21 @@ import java.util.concurrent.TimeUnit
|
||||
/**
|
||||
* 漫游场景
|
||||
*/
|
||||
class Roma(val delayTime: Long = 2, val unit: TimeUnit = TimeUnit.SECONDS): Scene {
|
||||
class Roma(val delayTime: Long = 2, val unit: TimeUnit = TimeUnit.SECONDS): Scene(delayTime, unit) {
|
||||
|
||||
override val angle: VisualAngleMode
|
||||
get() = MAP_STYLE_VR_ROMA
|
||||
override val priority: Int
|
||||
get() = 1
|
||||
override val displayThreshold: Long
|
||||
get() = -1
|
||||
override val delay: Long
|
||||
get() = unit.toMillis(delayTime)
|
||||
override val isCanSwitch: Boolean
|
||||
get() = false
|
||||
override val isCanTouch: Boolean
|
||||
get() = false
|
||||
override fun getVisualAngleMode(): VisualAngleMode {
|
||||
return MAP_STYLE_VR_ROMA
|
||||
}
|
||||
|
||||
override fun isCanTouch(): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun isCanSwitch(): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun getPriority(): Int {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
@@ -2,23 +2,62 @@ package com.mogo.eagle.core.function.api.map.angle
|
||||
|
||||
import com.mogo.eagle.core.function.api.map.angle.ScreenToOriginDis.DEFAULT
|
||||
import com.mogo.map.uicontroller.*
|
||||
|
||||
interface IAttach {
|
||||
val angle: VisualAngleMode
|
||||
val priority: Int
|
||||
val displayThreshold: Long //最大展示时长 > 0; 表示最长展示多长时间, -1 表示,一直展示,直到触发默认视角, 0: 默认视角专用值,
|
||||
val delay: Long // 延迟多长时间切换
|
||||
val isCanSwitch: Boolean // 是否可切换
|
||||
val isCanTouch: Boolean // 是否响应地图触摸事件
|
||||
|
||||
fun getScreenToOriginDis(): ScreenToOriginDis = DEFAULT
|
||||
}
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
enum class ScreenToOriginDis {
|
||||
DEFAULT,
|
||||
UP,
|
||||
DOWN
|
||||
NONE,
|
||||
DEFAULT,
|
||||
UP,
|
||||
DOWN
|
||||
}
|
||||
|
||||
interface Scene: IAttach
|
||||
abstract class Scene(private val delay: Long, private val unit: TimeUnit = TimeUnit.SECONDS) {
|
||||
|
||||
/**
|
||||
* 获取当前视角场景的视角类型,此返回值要与地图支持的视角类型匹配
|
||||
*/
|
||||
abstract fun getVisualAngleMode(): VisualAngleMode
|
||||
|
||||
/**
|
||||
* 当前视角场景的优先级,优先级越高,表示可以打断优先级低的视角场景
|
||||
*/
|
||||
open fun getPriority(): Int = 0
|
||||
|
||||
/**
|
||||
* 单位:(毫秒)
|
||||
* 表示多长时间之后切换到当前视角场景
|
||||
*/
|
||||
final fun getDelay(): Long = unit.toMillis(delay)
|
||||
|
||||
/**
|
||||
* 单位:(毫秒)
|
||||
* 最大展示时长 > 0; 表示最长展示多长时间, -1 表示,一直展示,直到触发默认视角, 0: 默认视角专用值,
|
||||
* @return
|
||||
* 大于0: 此场景对应的视角展示指定时长后,自动切换到默认视角场景
|
||||
* 小于0: 一直展示此场景的视角,直到比此场景优先级:[getPriority]更高的场景触发时,才会终止
|
||||
*/
|
||||
open fun getDisplayThreshold(): Long = 0
|
||||
|
||||
/**
|
||||
* 用于业务层视角切换按钮的使能状态
|
||||
* @return true: 可以切换; false:不可以切换
|
||||
*/
|
||||
open fun isCanSwitch(): Boolean = true
|
||||
|
||||
/**
|
||||
* 用于控制高精地图控件(MapAutoView)是否禁掉所有手势
|
||||
* @return true: 响应地图控件的触摸事件及手势;false:不响应地图控件的触摸事件及手势
|
||||
*/
|
||||
open fun isCanTouch(): Boolean = true
|
||||
|
||||
/**
|
||||
* 返回自车相对于地图控件的位置
|
||||
* @return
|
||||
* 1. [ScreenToOriginDis.NONE]: 不设置
|
||||
* 2. [ScreenToOriginDis.DEFAULT]: 默认的位置
|
||||
* 3. [ScreenToOriginDis.UP]: 偏上
|
||||
* 4. [ScreenToOriginDis.DOWN]: 偏下
|
||||
*/
|
||||
open fun getScreenToOriginDis(): ScreenToOriginDis = DEFAULT
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user