[6.7.0][Opt]优化下高德地图放大的动画效果
This commit is contained in:
@@ -1,26 +1,24 @@
|
||||
package com.mogo.eagle.core.function.hmi.map
|
||||
|
||||
import android.animation.Animator
|
||||
import android.animation.AnimatorListenerAdapter
|
||||
import android.animation.IntEvaluator
|
||||
import android.animation.ValueAnimator
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import android.transition.Transition
|
||||
import android.transition.Transition.TransitionListener
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.animation.AccelerateDecelerateInterpolator
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import androidx.constraintlayout.widget.ConstraintSet
|
||||
import com.mogo.eagle.core.data.map.MogoLatLng
|
||||
import com.mogo.eagle.core.function.api.order.IOrderListener
|
||||
import com.mogo.eagle.core.function.call.order.CallerOrderListenerManager
|
||||
import com.mogo.eagle.core.function.hmi.R
|
||||
import com.mogo.eagle.core.function.hmi.util.ConstraintUtil
|
||||
import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener
|
||||
import com.mogo.map.listener.IMogoMapListener
|
||||
import com.mogo.map.listener.MogoMapListenerHandler
|
||||
import kotlinx.android.synthetic.main.view_map_container.view.mapBizView
|
||||
import kotlinx.android.synthetic.main.view_map_container.view.overMapView
|
||||
import kotlinx.android.synthetic.main.view_map_container.view.parentLayout
|
||||
import kotlinx.android.synthetic.main.view_map_container.view.shadowView
|
||||
import kotlinx.android.synthetic.main.view_map_container.view.visualAngleToggle
|
||||
|
||||
@@ -33,7 +31,6 @@ class MapContainerLayout @JvmOverloads constructor(
|
||||
@Volatile
|
||||
private var isScaled = false
|
||||
private var isPlayingAnim = false
|
||||
private var constraintUtil: ConstraintUtil? = null
|
||||
|
||||
init {
|
||||
LayoutInflater.from(context).inflate(R.layout.view_map_container, this, true)
|
||||
@@ -86,7 +83,7 @@ class MapContainerLayout @JvmOverloads constructor(
|
||||
private fun initView() {
|
||||
shadowView.setOnClickListener(object : OnPreventFastClickListener() {
|
||||
override fun onClickImpl(v: View?) {
|
||||
swapViewsWithAnim()
|
||||
scaleMapWithAnim()
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -104,36 +101,48 @@ class MapContainerLayout @JvmOverloads constructor(
|
||||
}
|
||||
}
|
||||
|
||||
private fun swapViewsWithAnim() {
|
||||
private fun scaleMapWithAnim() {
|
||||
if (isPlayingAnim) return
|
||||
if (constraintUtil == null) {
|
||||
constraintUtil = ConstraintUtil(parentLayout, 300, AccelerateDecelerateInterpolator())
|
||||
constraintUtil?.addTransitionListener(transitionListener)
|
||||
}
|
||||
if (!isScaled) {
|
||||
// 获取属性集并设置动画
|
||||
val begin = constraintUtil!!.beginWithAnim()
|
||||
// 清除约束关系
|
||||
begin.clear(R.id.overMapView)
|
||||
// 设置新的约束关系
|
||||
begin.Left_toLeftOf(R.id.overMapView, ConstraintSet.PARENT_ID)
|
||||
begin.Top_toTopOf(R.id.overMapView, ConstraintSet.PARENT_ID)
|
||||
begin.Right_toRightOf(R.id.overMapView, ConstraintSet.PARENT_ID)
|
||||
begin.Bottom_toBottomOf(R.id.overMapView, ConstraintSet.PARENT_ID)
|
||||
// 应用新的属性集
|
||||
begin.commit()
|
||||
val valueAnimator = ValueAnimator.ofInt(270, 1560)
|
||||
val evaluator = IntEvaluator()
|
||||
valueAnimator.addUpdateListener {
|
||||
overMapView.layoutParams = (overMapView.layoutParams as LayoutParams).also { layoutParams ->
|
||||
layoutParams.width = it.animatedValue as Int
|
||||
layoutParams.height = evaluator.evaluate(it.animatedFraction, 270, 1534)
|
||||
layoutParams.leftMargin = evaluator.evaluate(it.animatedFraction, 1230, 0)
|
||||
layoutParams.topMargin = evaluator.evaluate(it.animatedFraction, 1204, 0)
|
||||
}
|
||||
}
|
||||
valueAnimator.addListener(listenerAdapter)
|
||||
valueAnimator.duration = 350
|
||||
valueAnimator.start()
|
||||
} else {
|
||||
constraintUtil?.reSetWidthAnim()
|
||||
val valueAnimator = ValueAnimator.ofInt(1560, 270)
|
||||
val evaluator = IntEvaluator()
|
||||
valueAnimator.addUpdateListener {
|
||||
overMapView.layoutParams = (overMapView.layoutParams as LayoutParams).also { layoutParams ->
|
||||
layoutParams.width = it.animatedValue as Int
|
||||
layoutParams.height = evaluator.evaluate(it.animatedFraction, 1534, 270)
|
||||
layoutParams.leftMargin = evaluator.evaluate(it.animatedFraction, 0, 1230)
|
||||
layoutParams.topMargin = evaluator.evaluate(it.animatedFraction, 0, 1204)
|
||||
}
|
||||
}
|
||||
valueAnimator.addListener(listenerAdapter)
|
||||
valueAnimator.duration = 350
|
||||
valueAnimator.start()
|
||||
}
|
||||
}
|
||||
|
||||
private val transitionListener = object : TransitionListener {
|
||||
override fun onTransitionStart(transition: Transition?) {
|
||||
private val listenerAdapter = object : AnimatorListenerAdapter() {
|
||||
override fun onAnimationStart(animation: Animator) {
|
||||
super.onAnimationStart(animation)
|
||||
isPlayingAnim = true
|
||||
overMapView.setMapFlag(isScaled)
|
||||
}
|
||||
|
||||
override fun onTransitionEnd(transition: Transition?) {
|
||||
override fun onAnimationCancel(animation: Animator) {
|
||||
super.onAnimationCancel(animation)
|
||||
isPlayingAnim = false
|
||||
overMapView.swapSettings()
|
||||
updateShadowBg(isScaled)
|
||||
@@ -145,19 +154,17 @@ class MapContainerLayout @JvmOverloads constructor(
|
||||
}
|
||||
}
|
||||
|
||||
override fun onTransitionCancel(transition: Transition?) {
|
||||
override fun onAnimationEnd(animation: Animator) {
|
||||
super.onAnimationEnd(animation)
|
||||
isPlayingAnim = false
|
||||
overMapView.swapSettings()
|
||||
updateShadowBg(isScaled)
|
||||
isScaled = !isScaled
|
||||
}
|
||||
|
||||
override fun onTransitionPause(transition: Transition?) {
|
||||
isPlayingAnim = false
|
||||
}
|
||||
|
||||
override fun onTransitionResume(transition: Transition?) {
|
||||
isPlayingAnim = true
|
||||
if (isScaled) {
|
||||
visualAngleToggle?.takeIf { it.visibility == View.VISIBLE }?.visibility = View.GONE
|
||||
} else {
|
||||
visualAngleToggle?.takeIf { it.visibility != View.VISIBLE }?.visibility = View.VISIBLE
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,16 +21,16 @@
|
||||
android:id="@+id/overMapView"
|
||||
android:layout_width="270dp"
|
||||
android:layout_height="270dp"
|
||||
android:layout_marginEnd="60dp"
|
||||
android:layout_marginBottom="60dp"
|
||||
android:layout_marginStart="1230dp"
|
||||
android:layout_marginTop="1204dp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:bottomPadding="160"
|
||||
app:carDrawable="@drawable/taxt_u_p_map_car"
|
||||
app:compassDrawable="@drawable/taxt_u_p_map_car_light"
|
||||
app:startPointDrawable="@drawable/taxi_overmap_startpoint"
|
||||
app:endPointDrawable="@drawable/taxi_overmap_endpoint"
|
||||
app:globalPathColor="#39BA90"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:leftPadding="70"
|
||||
app:mapStyleExtraPath="over_view_style_extra.data"
|
||||
app:mapStylePath="over_view_style.data"
|
||||
|
||||
Reference in New Issue
Block a user