[帧动画优化]
This commit is contained in:
yangyakun
2023-07-25 16:54:37 +08:00
parent 5e37881e37
commit 6fe2e4d5c8
67 changed files with 413 additions and 65 deletions

View File

@@ -19,10 +19,11 @@ import com.mogo.och.common.module.voice.VoiceNotice
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonValueCallback
import com.mogo.och.taxi.passenger.presenter.BaseTaxiPassengerPresenter
import com.mogo.och.taxi.passenger.ui.bottom.BottomBar
import com.mogo.och.taxi.passenger.ui.arrived.ArrivedView
import com.mogo.och.taxi.passenger.ui.bottom.BottomBar
import com.mogo.och.taxi.passenger.ui.check.TaxiPassengerCheckView
import com.mogo.och.taxi.passenger.ui.startautopilot.StartAutopilotView
import com.mogo.och.taxi.passenger.widget.animutils.AnimationsContainer
import kotlinx.android.synthetic.main.taxi_p_base_fragment.*
import java.lang.ref.WeakReference
@@ -53,6 +54,8 @@ class TaxiPassengerBaseFragment() :
*/
private var mStartAutopilotView: WeakReference<StartAutopilotView?>? = null
private var createProgressDialogAnim: AnimationsContainer?=null
override fun getLayoutId(): Int {
return R.layout.taxi_p_base_fragment
}
@@ -70,6 +73,13 @@ class TaxiPassengerBaseFragment() :
mapBizView!!.onCreate(savedInstanceState)
overMapView.onCreateView(savedInstanceState)
overMapView.hideResetView()
createProgressDialogAnim = AnimationsContainer(R.array.xiaozhi_normal, 20,aciv_xiaozhi_normal)
createProgressDialogAnim?.setOnAnimStopListener(object :AnimationsContainer.OnAnimationStoppedListener{
override fun AnimationStopped() {
CallerLogger.d(M_TAXI_P + TAG, "动画暂停")
}
})
}
private fun initListener() {
@@ -147,6 +157,15 @@ class TaxiPassengerBaseFragment() :
}
}
view?.viewTreeObserver?.addOnWindowFocusChangeListener {
if(it){
CallerLogger.d(M_TAXI_P + TAG, "windows获取焦点")
createProgressDialogAnim?.start()
}else{
CallerLogger.d(M_TAXI_P + TAG, "window失去焦点")
createProgressDialogAnim?.stop()
}
}
}
private fun initCheckView() {
@@ -163,10 +182,7 @@ class TaxiPassengerBaseFragment() :
overMapView.onResume()
CallerLogger.d(M_TAXI_P + TAG, "onResume")
if (aciv_xiaozhi_normal.drawable is AnimationDrawable) {
val anim = aciv_xiaozhi_normal.drawable as AnimationDrawable
anim.start()
}
createProgressDialogAnim?.start()
}
override fun createPresenter(): BaseTaxiPassengerPresenter {
@@ -188,10 +204,7 @@ class TaxiPassengerBaseFragment() :
mapBizView!!.onPause()
overMapView?.onPause()
CallerLogger.d(M_TAXI_P + TAG, "onPause")
if (aciv_xiaozhi_normal.drawable is AnimationDrawable) {
val anim = aciv_xiaozhi_normal.drawable as AnimationDrawable
anim.stop()
}
createProgressDialogAnim?.stop()
}
override fun onDestroyView() {

View File

@@ -6,19 +6,25 @@ import android.view.LayoutInflater
import androidx.lifecycle.ViewModelProvider
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.OverlayViewUtils
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment
import com.mogo.och.taxi.passenger.ui.startautopilot.StartAutopilotView
import com.mogo.och.taxi.passenger.widget.WindowRelativeLayout
import com.mogo.och.taxi.passenger.widget.animutils.AnimationsContainer
import com.shuyu.gsyvideoplayer.GSYVideoManager
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack
import io.reactivex.disposables.Disposable
import kotlinx.android.synthetic.main.taxi_p_arrived_end_panel.view.aciv_close
import kotlinx.android.synthetic.main.taxi_p_arrived_end_panel.view.actv_endstation
import kotlinx.android.synthetic.main.taxi_p_arrived_end_panel.view.iv_xiaozhi_belt
import kotlinx.android.synthetic.main.taxi_p_arrived_end_panel.view.svp_frame
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.taxi_p_autopilot_starting
/**
@@ -40,6 +46,8 @@ class ArrivedView : WindowRelativeLayout, ArrivedViewModel.ArrivedViewCallback {
private val gsyVideoOptionBuilder = GSYVideoOptionBuilder()
private var taxiPxiaozhiLove: AnimationsContainer?=null
private fun initView() {
d(SceneConstant.M_TAXI_P + TAG, "initView")
LayoutInflater.from(context).inflate(R.layout.taxi_p_arrived_end_panel, this, true)
@@ -58,12 +66,20 @@ class ArrivedView : WindowRelativeLayout, ArrivedViewModel.ArrivedViewCallback {
aciv_close.onClick {
OverlayViewUtils.dismissOverlayView(this)
}
taxiPxiaozhiLove = AnimationsContainer(R.array.xiaozhi_love, 20,iv_xiaozhi_belt)
taxiPxiaozhiLove?.setOnAnimStopListener(object :AnimationsContainer.OnAnimationStoppedListener{
override fun AnimationStopped() {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "动画暂停")
}
})
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
val viewModel = ViewModelProvider(this).get(ArrivedViewModel::class.java)
viewModel.setViewCallback(this)
taxiPxiaozhiLove?.start()
}
override fun onDetachedFromWindow() {
@@ -71,6 +87,7 @@ class ArrivedView : WindowRelativeLayout, ArrivedViewModel.ArrivedViewCallback {
svp_frame.setVideoAllCallBack(null)
svp_frame.onVideoReset()
svp_frame.release()
taxiPxiaozhiLove?.stop()
super.onDetachedFromWindow()
subscribe?.let {

View File

@@ -8,11 +8,16 @@ import androidx.core.content.res.ResourcesCompat
import androidx.lifecycle.ViewModelProvider
import com.elegant.utils.UiThreadHandler
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.OverlayViewUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.utils.AnimatorDrawableUtil
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment
import com.mogo.och.taxi.passenger.widget.WindowRelativeLayout
import com.mogo.och.taxi.passenger.widget.animutils.AnimationsContainer
import kotlinx.android.synthetic.main.taxi_p_base_fragment.aciv_xiaozhi_normal
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.actv_front_left_door
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.actv_front_right_door
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.actv_orderinfo
@@ -45,24 +50,10 @@ class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAu
}
var isStarting = false
private var mAnimationDrawable: AnimatorDrawableUtil? = null
private var mCarAnimationDrawable: AnimatorDrawableUtil? = null
private val startingAnimIds = arrayOf(R.drawable.light_00000, R.drawable.light_00001,
R.drawable.light_00002, R.drawable.light_00003, R.drawable.light_00004, R.drawable.light_00005,
R.drawable.light_00006, R.drawable.light_00007, R.drawable.light_00008, R.drawable.light_00009,
R.drawable.light_00010, R.drawable.light_00011, R.drawable.light_00012, R.drawable.light_00013
)
private val startBtnBgAnimIds = arrayOf(R.drawable.image_00000, R.drawable.image_00001,
R.drawable.image_00002, R.drawable.image_00003, R.drawable.image_00004, R.drawable.image_00005,
R.drawable.image_00006, R.drawable.image_00007, R.drawable.image_00008, R.drawable.image_00009,
R.drawable.image_00010, R.drawable.image_00011, R.drawable.image_00012, R.drawable.image_00013,
R.drawable.image_00014, R.drawable.image_00015, R.drawable.image_00016, R.drawable.image_00017,
R.drawable.image_00018, R.drawable.image_00019, R.drawable.image_00020, R.drawable.image_00021,
R.drawable.image_00022, R.drawable.image_00023, R.drawable.image_00024, R.drawable.image_00025,
R.drawable.image_00026, R.drawable.image_00027, R.drawable.image_00028, R.drawable.image_00029,
R.drawable.image_00030, R.drawable.image_00031, R.drawable.image_00032, R.drawable.image_00033,
R.drawable.image_00034
)
private var taxiPStartAutopilot: AnimationsContainer?=null
private var taxiPStartAutopilotCar: AnimationsContainer?=null
init {
initView()
@@ -70,18 +61,25 @@ class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAu
private fun initView() {
LayoutInflater.from(context).inflate(R.layout.taxi_p_start_autopilot_view, this, true)
taxiPStartAutopilotCar = AnimationsContainer(R.array.taxi_p_start_autopilot_car, 20,taxi_p_autopilot_starting)
taxiPStartAutopilotCar?.setOnAnimStopListener(object :AnimationsContainer.OnAnimationStoppedListener{
override fun AnimationStopped() {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "动画暂停")
}
})
taxiPStartAutopilot = AnimationsContainer(R.array.taxi_p_start_autopilot, 20,taxi_p_autopilot_btn_bg)
taxiPStartAutopilot?.setOnAnimStopListener(object :AnimationsContainer.OnAnimationStoppedListener{
override fun AnimationStopped() {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "动画暂停")
}
})
}
fun startAutopilotBgAnimatorDrawable(isStart: Boolean) {
if (isStart) {
if (mAnimationDrawable == null) {
initBtnAnimatonDrawable()
}
if (mAnimationDrawable != null) {
mAnimationDrawable!!.start(true, 30, null)
}
taxiPStartAutopilot?.start()
} else {
clearBgAnimDrawable()
taxiPStartAutopilot?.stop()
}
}
@@ -161,29 +159,14 @@ class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAu
}
}
private fun initCarStartingFrame() {
mCarAnimationDrawable = AnimatorDrawableUtil()
mCarAnimationDrawable?.setAnimation(taxi_p_autopilot_starting, Arrays.asList(*startingAnimIds))
}
private fun initBtnAnimatonDrawable() {
mAnimationDrawable = AnimatorDrawableUtil()
mAnimationDrawable?.setAnimation(taxi_p_autopilot_btn_bg, Arrays.asList(*startBtnBgAnimIds))
}
private fun startingCarBgAnimatorDrawable(isStart: Boolean) {
if (isStart) {
if (mCarAnimationDrawable == null) {
initCarStartingFrame()
}
taxi_p_autopilot_starting!!.setImageResource(0)
mCarAnimationDrawable!!.start(true, 40, null)
taxiPStartAutopilotCar?.start()
} else {
if (mCarAnimationDrawable != null) {
mCarAnimationDrawable!!.stop()
}
taxiPStartAutopilotCar?.stop()
taxi_p_autopilot_starting!!.setImageResource(R.drawable.light_00003)
}
}
@@ -203,17 +186,11 @@ class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAu
}
private fun clearBgAnimDrawable() {
if (mAnimationDrawable != null) {
mAnimationDrawable!!.stop()
mAnimationDrawable = null
}
taxiPStartAutopilot?.stop()
}
fun clearStartingAnimFrame() {
if (mCarAnimationDrawable != null) {
mCarAnimationDrawable!!.stop()
mCarAnimationDrawable = null
}
taxiPStartAutopilotCar?.stop()
}
private fun startingAutopilotCountDown() {

View File

@@ -0,0 +1,146 @@
package com.mogo.och.taxi.passenger.widget.animutils
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.drawable.BitmapDrawable
import android.os.Handler
import android.os.Looper
import android.widget.ImageView
import com.mogo.commons.AbsMogoApplication
import java.lang.ref.SoftReference
class AnimationsContainer(resId: Int, fps: Int, imageView: ImageView) {
private lateinit var mFrames: IntArray // 帧数组
private var mIndex = 0 // 当前帧
private var mShouldRun = false // 开始/停止播放用
private var mIsRunning = false // 动画是否正在播放,防止重复播放
private var mSoftReferenceImageView: SoftReference<ImageView>? = null // 软引用ImageView以便及时释放掉
private var mHandler: Handler? = null
private var mDelayMillis = 0
private var mOnAnimationStoppedListener: OnAnimationStoppedListener? = null//播放停止监听
private var mBitmap: Bitmap? = null
private var mBitmapOptions: BitmapFactory.Options? = null //Bitmap管理类可有效减少Bitmap的OOM问题
init {
createAnimation(imageView, getData(resId), fps)
}
private fun createAnimation(imageView: ImageView, frames: IntArray, fps: Int) {
mHandler = Handler(Looper.myLooper()!!)
mFrames = frames
mIndex = -1
mSoftReferenceImageView = SoftReference(imageView)
mShouldRun = false
mIsRunning = false
mDelayMillis = 1000 / fps //帧动画时间间隔,毫秒
imageView.setImageResource(mFrames[0])
// 当图片大小类型相同时进行复用避免频繁GC
val bmp = (imageView.drawable as BitmapDrawable).bitmap
val width = bmp.width
val height = bmp.height
val config = bmp.config
mBitmap = Bitmap.createBitmap(width, height, config)
mBitmapOptions = BitmapFactory.Options()
//设置Bitmap内存复用
mBitmapOptions!!.inBitmap = mBitmap //Bitmap复用内存块类似对象池避免不必要的内存分配和回收
mBitmapOptions!!.inMutable = true //解码时返回可变Bitmap
mBitmapOptions!!.inSampleSize = 1 //缩放比例
}
//循环读取下一帧
private val next: Int
get() {
mIndex++
if (mIndex >= mFrames.size) mIndex = 0
return mFrames[mIndex]
}
/**
* 播放动画,同步锁防止多线程读帧时,数据安全问题
*/
@Synchronized
fun start() {
mShouldRun = true
if (mIsRunning) return
val runnable: Runnable = object : Runnable {
override fun run() {
val imageView = mSoftReferenceImageView!!.get()
if (!mShouldRun || imageView == null) {
mIsRunning = false
if (mOnAnimationStoppedListener != null) {
mOnAnimationStoppedListener!!.AnimationStopped()
}
return
}
mIsRunning = true
//新开线程去读下一帧
mHandler!!.postDelayed(this, mDelayMillis.toLong())
if (imageView.isShown) {
val imageRes: Int = next
if (mBitmap != null) { // so Build.VERSION.SDK_INT >= 11
var bitmap: Bitmap? = null
try {
bitmap = BitmapFactory.decodeResource(
imageView.resources,
imageRes,
mBitmapOptions
)
} catch (e: Exception) {
e.printStackTrace()
}
if (bitmap != null) {
imageView.setImageBitmap(bitmap)
} else {
imageView.setImageResource(imageRes)
mBitmap!!.recycle()
mBitmap = null
}
} else {
imageView.setImageResource(imageRes)
}
}
}
}
mHandler!!.post(runnable)
}
/**
* 停止播放
*/
@Synchronized
fun stop() {
mShouldRun = false
}
/**
* 设置停止播放监听
* @param listener 设置监听
*/
fun setOnAnimStopListener(listener: OnAnimationStoppedListener?) {
mOnAnimationStoppedListener = listener
}
/**
* 从xml中读取帧数组
* @param resId
* @return
*/
private fun getData(resId: Int): IntArray {
val array = AbsMogoApplication.getApp().resources.obtainTypedArray(resId)
val len = array.length()
val intArray = IntArray(array.length())
for (i in 0 until len) {
intArray[i] = array.getResourceId(i, 0)
}
array.recycle()
return intArray
}
/**
* 停止播放监听
*/
interface OnAnimationStoppedListener {
fun AnimationStopped()
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@@ -59,6 +59,13 @@
android:layout_width="@dimen/dp_900"
android:layout_height="@dimen/dp_506"/>
<androidx.appcompat.widget.AppCompatImageView
android:src="@drawable/taxi_p_arrived_glide"
app:layout_constraintStart_toStartOf="@+id/v_video_right_rear"
app:layout_constraintBottom_toBottomOf="@+id/v_video_right_rear"
android:layout_width="@dimen/dp_318"
android:layout_height="@dimen/dp_77"/>
<androidx.appcompat.widget.AppCompatTextView
app:layout_constraintStart_toStartOf="@+id/v_video_right_rear"
app:layout_constraintBottom_toBottomOf="@+id/v_video_right_rear"
@@ -77,7 +84,7 @@
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="@dimen/dp_50"
android:background="@drawable/taxi_p_xiaozhibelt_info"
android:layout_marginBottom="@dimen/dp_20"
android:layout_marginBottom="-60dp"
android:layout_width="@dimen/dp_600"
android:layout_height="@dimen/dp_339"/>
@@ -109,11 +116,10 @@
android:id="@+id/iv_xiaozhi_belt"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="@dimen/dp_98"
android:src="@drawable/xiaozhi_normal002"
android:layout_marginBottom="@dimen/dp_30"
android:layout_width="@dimen/dp_216"
android:layout_height="@dimen/dp_216"/>
android:layout_marginEnd="@dimen/dp_46"
android:layout_marginBottom="@dimen/dp_10"
android:layout_width="@dimen/dp_300"
android:layout_height="@dimen/dp_300"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,189 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="xiaozhi_normal">
<item>@drawable/xiaozhi_normal002</item>
<item>@drawable/xiaozhi_normal004</item>
<item>@drawable/xiaozhi_normal006</item>
<item>@drawable/xiaozhi_normal008</item>
<item>@drawable/xiaozhi_normal010</item>
<item>@drawable/xiaozhi_normal012</item>
<item>@drawable/xiaozhi_normal014</item>
<item>@drawable/xiaozhi_normal016</item>
<item>@drawable/xiaozhi_normal018</item>
<item>@drawable/xiaozhi_normal020</item>
<item>@drawable/xiaozhi_normal022</item>
<item>@drawable/xiaozhi_normal024</item>
<item>@drawable/xiaozhi_normal026</item>
<item>@drawable/xiaozhi_normal028</item>
<item>@drawable/xiaozhi_normal030</item>
<item>@drawable/xiaozhi_normal032</item>
<item>@drawable/xiaozhi_normal034</item>
<item>@drawable/xiaozhi_normal036</item>
<item>@drawable/xiaozhi_normal038</item>
<item>@drawable/xiaozhi_normal040</item>
<item>@drawable/xiaozhi_normal042</item>
<item>@drawable/xiaozhi_normal044</item>
<item>@drawable/xiaozhi_normal046</item>
<item>@drawable/xiaozhi_normal048</item>
<item>@drawable/xiaozhi_normal050</item>
<item>@drawable/xiaozhi_normal052</item>
<item>@drawable/xiaozhi_normal054</item>
<item>@drawable/xiaozhi_normal056</item>
<item>@drawable/xiaozhi_normal058</item>
<item>@drawable/xiaozhi_normal060</item>
<item>@drawable/xiaozhi_normal062</item>
<item>@drawable/xiaozhi_normal064</item>
<item>@drawable/xiaozhi_normal066</item>
<item>@drawable/xiaozhi_normal068</item>
<item>@drawable/xiaozhi_normal070</item>
<item>@drawable/xiaozhi_normal072</item>
<item>@drawable/xiaozhi_normal074</item>
<item>@drawable/xiaozhi_normal076</item>
<item>@drawable/xiaozhi_normal078</item>
<item>@drawable/xiaozhi_normal080</item>
<item>@drawable/xiaozhi_normal082</item>
<item>@drawable/xiaozhi_normal084</item>
<item>@drawable/xiaozhi_normal086</item>
<item>@drawable/xiaozhi_normal088</item>
<item>@drawable/xiaozhi_normal090</item>
<item>@drawable/xiaozhi_normal092</item>
<item>@drawable/xiaozhi_normal094</item>
<item>@drawable/xiaozhi_normal096</item>
<item>@drawable/xiaozhi_normal098</item>
<item>@drawable/xiaozhi_normal100</item>
<item>@drawable/xiaozhi_normal102</item>
<item>@drawable/xiaozhi_normal104</item>
<item>@drawable/xiaozhi_normal106</item>
<item>@drawable/xiaozhi_normal108</item>
<item>@drawable/xiaozhi_normal110</item>
<item>@drawable/xiaozhi_normal112</item>
<item>@drawable/xiaozhi_normal114</item>
<item>@drawable/xiaozhi_normal116</item>
<item>@drawable/xiaozhi_normal118</item>
</string-array>
<string-array name="taxi_p_start_autopilot">
<item>@drawable/image_00000</item>
<item>@drawable/image_00001</item>
<item>@drawable/image_00002</item>
<item>@drawable/image_00003</item>
<item>@drawable/image_00004</item>
<item>@drawable/image_00005</item>
<item>@drawable/image_00006</item>
<item>@drawable/image_00007</item>
<item>@drawable/image_00008</item>
<item>@drawable/image_00009</item>
<item>@drawable/image_00010</item>
<item>@drawable/image_00011</item>
<item>@drawable/image_00012</item>
<item>@drawable/image_00013</item>
<item>@drawable/image_00014</item>
<item>@drawable/image_00015</item>
<item>@drawable/image_00016</item>
<item>@drawable/image_00017</item>
<item>@drawable/image_00018</item>
<item>@drawable/image_00019</item>
<item>@drawable/image_00020</item>
<item>@drawable/image_00021</item>
<item>@drawable/image_00022</item>
<item>@drawable/image_00023</item>
<item>@drawable/image_00024</item>
<item>@drawable/image_00025</item>
<item>@drawable/image_00026</item>
<item>@drawable/image_00027</item>
<item>@drawable/image_00028</item>
<item>@drawable/image_00029</item>
<item>@drawable/image_00030</item>
<item>@drawable/image_00031</item>
<item>@drawable/image_00032</item>
<item>@drawable/image_00033</item>
<item>@drawable/image_00034</item>
</string-array>
<string-array name="taxi_p_start_autopilot_car">
<item>@drawable/light_00000</item>
<item>@drawable/light_00001</item>
<item>@drawable/light_00002</item>
<item>@drawable/light_00003</item>
<item>@drawable/light_00004</item>
<item>@drawable/light_00005</item>
<item>@drawable/light_00006</item>
<item>@drawable/light_00007</item>
<item>@drawable/light_00008</item>
<item>@drawable/light_00009</item>
<item>@drawable/light_00010</item>
<item>@drawable/light_00011</item>
<item>@drawable/light_00012</item>
<item>@drawable/light_00013</item>
</string-array>
<string-array name="xiaozhi_love">
<item>@drawable/xiaozhi_love_000</item>
<item>@drawable/xiaozhi_love_001</item>
<item>@drawable/xiaozhi_love_002</item>
<item>@drawable/xiaozhi_love_003</item>
<item>@drawable/xiaozhi_love_004</item>
<item>@drawable/xiaozhi_love_005</item>
<item>@drawable/xiaozhi_love_006</item>
<item>@drawable/xiaozhi_love_007</item>
<item>@drawable/xiaozhi_love_008</item>
<item>@drawable/xiaozhi_love_009</item>
<item>@drawable/xiaozhi_love_010</item>
<item>@drawable/xiaozhi_love_011</item>
<item>@drawable/xiaozhi_love_012</item>
<item>@drawable/xiaozhi_love_013</item>
<item>@drawable/xiaozhi_love_014</item>
<item>@drawable/xiaozhi_love_015</item>
<item>@drawable/xiaozhi_love_016</item>
<item>@drawable/xiaozhi_love_017</item>
<item>@drawable/xiaozhi_love_018</item>
<item>@drawable/xiaozhi_love_019</item>
<item>@drawable/xiaozhi_love_020</item>
<item>@drawable/xiaozhi_love_021</item>
<item>@drawable/xiaozhi_love_022</item>
<item>@drawable/xiaozhi_love_023</item>
<item>@drawable/xiaozhi_love_024</item>
<item>@drawable/xiaozhi_love_025</item>
<item>@drawable/xiaozhi_love_026</item>
<item>@drawable/xiaozhi_love_027</item>
<item>@drawable/xiaozhi_love_028</item>
<item>@drawable/xiaozhi_love_029</item>
<item>@drawable/xiaozhi_love_030</item>
<item>@drawable/xiaozhi_love_031</item>
<item>@drawable/xiaozhi_love_032</item>
<item>@drawable/xiaozhi_love_033</item>
<item>@drawable/xiaozhi_love_034</item>
<item>@drawable/xiaozhi_love_035</item>
<item>@drawable/xiaozhi_love_036</item>
<item>@drawable/xiaozhi_love_037</item>
<item>@drawable/xiaozhi_love_038</item>
<item>@drawable/xiaozhi_love_039</item>
<item>@drawable/xiaozhi_love_040</item>
<item>@drawable/xiaozhi_love_041</item>
<item>@drawable/xiaozhi_love_042</item>
<item>@drawable/xiaozhi_love_043</item>
<item>@drawable/xiaozhi_love_044</item>
<item>@drawable/xiaozhi_love_045</item>
<item>@drawable/xiaozhi_love_046</item>
<item>@drawable/xiaozhi_love_047</item>
<item>@drawable/xiaozhi_love_048</item>
<item>@drawable/xiaozhi_love_049</item>
<item>@drawable/xiaozhi_love_050</item>
<item>@drawable/xiaozhi_love_051</item>
<item>@drawable/xiaozhi_love_052</item>
<item>@drawable/xiaozhi_love_053</item>
<item>@drawable/xiaozhi_love_054</item>
<item>@drawable/xiaozhi_love_055</item>
<item>@drawable/xiaozhi_love_056</item>
<item>@drawable/xiaozhi_love_057</item>
<item>@drawable/xiaozhi_love_058</item>
<item>@drawable/xiaozhi_love_059</item>
</string-array>
</resources>