[282 taxi乘客屏] 处理启动自动驾驶按钮卡顿问题

This commit is contained in:
wangmingjun
2022-07-20 16:56:14 +08:00
parent e381e49468
commit 3b6f07aa81
2 changed files with 307 additions and 21 deletions

View File

@@ -0,0 +1,261 @@
package com.mogo.och.common.module.utils;
import android.content.Context;
import android.content.res.XmlResourceParser;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
/**
* @author: wangmingjun
* @date: 2022/7/20
*/
public class AnimatorDrawableUtil {
private static final int MSG_START = 0xf1;
private static final int MSG_STOP = 0xf2;
private static final int STATE_STOP = 0xf3;
private static final int STATE_RUNNING = 0xf4;
//运行状态
private int mState = STATE_RUNNING;
//显示图片的View
private ImageView mImageView = null;
//图片资源的ID列表
private List<Integer> mResourceIdList = null;
//定时任务器
private Timer mTimer = null;
//定时任务
private AnimTimerTask mTimeTask = null;
//记录播放位置
private int mFrameIndex = 0;
//播放形式
private boolean isLooping = false;
public AnimatorDrawableUtil() {
mTimer = new Timer();
}
/**
* 设置动画播放资源
*/
public void setAnimation(ImageView imageview, List<Integer> resourceIdList) {
mImageView = imageview;
if(mResourceIdList==null){
mResourceIdList = new ArrayList<Integer>();
}else{
mResourceIdList.clear();
}
mResourceIdList.addAll(resourceIdList);
}
/**
* 设置动画播放资源
*/
public void setAnimation(Context context, int resourceId, ImageView imageview) {
this.mImageView = imageview;
if(mResourceIdList==null){
mResourceIdList = new ArrayList<Integer>();
}else{
mResourceIdList.clear();
}
loadFromXml(context, resourceId, new OnParseListener() {
@Override
public void onParse(List<Integer> res) {
mResourceIdList.addAll(res);
}
});
}
/**
* 解析xml
*
* @param context
* @param resourceId 资源id
*/
private void loadFromXml(final Context context, final int resourceId,
final OnParseListener onParseListener) {
if (context == null) {
return;
}
final List<Integer> res = new ArrayList<Integer>();
XmlResourceParser parser = context.getResources().getXml(resourceId);
try {
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_DOCUMENT) {
} else if (eventType == XmlPullParser.START_TAG) {
if (parser.getName().equals("item")) {
for (int i = 0; i < parser.getAttributeCount(); i++) {
if (parser.getAttributeName(i).equals("drawable")) {
int resId = Integer.parseInt(parser.getAttributeValue(i).substring(1));
res.add(resId);
}
}
}
} else if (eventType == XmlPullParser.END_TAG) {
} else if (eventType == XmlPullParser.TEXT) {
}
eventType = parser.next();
}
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
} catch (XmlPullParserException e2) {
// TODO: handle exception
e2.printStackTrace();
} finally {
parser.close();
}
if (onParseListener != null) {
onParseListener.onParse(res);
}
}
private AnimationLisenter lisenter;
/**
* 开始播放动画
*
* @param loop 是否循环播放
* @param duration 动画播放时间间隔
*/
public void start(boolean loop, int duration, AnimationLisenter lisenter) {
this.lisenter = lisenter;
stop();
if (mResourceIdList == null || mResourceIdList.size() == 0) {
return;
}
if (mTimer == null) {
mTimer = new Timer();
}
isLooping = loop;
mFrameIndex = 0;
mState = STATE_RUNNING;
mTimeTask = new AnimTimerTask();
mTimer.schedule(mTimeTask, 0, duration);
if (lisenter != null){
lisenter.startAnimation();
}
}
/**
* 停止动画播放
*/
public void stop() {
if (mTimer != null) {
mTimer.purge();
mTimer.cancel();
mTimer = null;
}
if (mTimeTask != null) {
mFrameIndex = 0;
mState = STATE_STOP;
mTimeTask.cancel();
mTimeTask = null;
}
//移除Handler消息
if (AnimHandler != null) {
AnimHandler.removeMessages(MSG_START);
AnimHandler.removeMessages(MSG_STOP);
AnimHandler.removeCallbacksAndMessages(null);
}
}
/**
* 定时器任务
*/
class AnimTimerTask extends TimerTask {
@Override
public void run() {
if (mFrameIndex < 0 || mState == STATE_STOP) {
return;
}
if (mFrameIndex < mResourceIdList.size()) {
Message msg = AnimHandler.obtainMessage(MSG_START, 0, 0, null);
msg.sendToTarget();
} else {
mFrameIndex = 0;
if (!isLooping) {
Message msg = AnimHandler.obtainMessage(MSG_STOP, 0, 0, null);
msg.sendToTarget();
}
}
}
}
/**
* Handler
*/
private Handler AnimHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_START: {
if (mFrameIndex >= 0 && mFrameIndex < mResourceIdList.size() && mState == STATE_RUNNING) {
//这里不能使用image.setImageResource 因为源码中也是创建了bitmap 所以这里我们自己创建
Bitmap bitmap=readBitMap(mImageView.getContext(),mResourceIdList.get(mFrameIndex));
mImageView.setImageBitmap(bitmap);
mFrameIndex++;
}
}
break;
case MSG_STOP: {
if (mTimeTask != null) {
mFrameIndex = 0;
mTimer.purge();
mTimeTask.cancel();
mState = STATE_STOP;
mTimeTask = null;
if (lisenter !=null){
lisenter.endAnimation();
}
if (isLooping) {
mImageView.setImageResource(0);
}
}
}
break;
default:
break;
}
}
};
public static Bitmap readBitMap(Context context, int resId) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is, null, opt);
}
public interface OnParseListener {
void onParse(List<Integer> res);
}
public interface AnimationLisenter {
void startAnimation();
void endAnimation();
}
}

View File

@@ -4,7 +4,6 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAX
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
@@ -15,10 +14,10 @@ import com.elegant.utils.UiThreadHandler;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
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.common.module.wigets.sfv.FrameSurfaceView;
import com.mogo.och.taxi.passenger.R;
import com.mogo.och.taxi.passenger.callback.ITPClickStartAutopilotCallback;
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel;
import java.util.Arrays;
@@ -35,11 +34,11 @@ public class TaxiPassengerStartAutopilotView extends RelativeLayout implements V
private ImageView mCloseIV;
private ITPClickStartAutopilotCallback mClickCallback;
public boolean isStarting = false;
private AnimationDrawable mAnimationBtnDrawable;
private static final long TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L;
private Context mContext;
private View view;
private FrameSurfaceView svCarStartingFrame;
private AnimatorDrawableUtil mAnimationDrawable ;
private Integer[] startingAnimIds = new Integer[]{
R.drawable.light_00000,
R.drawable.light_00001,
@@ -56,6 +55,33 @@ public class TaxiPassengerStartAutopilotView extends RelativeLayout implements V
R.drawable.light_00012,
R.drawable.light_00013
};
private Integer[] startBtnBgAnimIds = new Integer[]{
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,R.drawable.image_00035,
R.drawable.image_00036, R.drawable.image_00037,R.drawable.image_00038,R.drawable.image_00039,
R.drawable.image_00040, R.drawable.image_00041,R.drawable.image_00042,R.drawable.image_00043,
R.drawable.image_00044, R.drawable.image_00045,R.drawable.image_00046,R.drawable.image_00047,
R.drawable.image_00048, R.drawable.image_00049,R.drawable.image_00050,R.drawable.image_00051,
R.drawable.image_00052, R.drawable.image_00053,R.drawable.image_00054,R.drawable.image_00055,
R.drawable.image_00056, R.drawable.image_00057,R.drawable.image_00058,R.drawable.image_00059,
R.drawable.image_00060, R.drawable.image_00061,R.drawable.image_00062,R.drawable.image_00063,
R.drawable.image_00064, R.drawable.image_00065,R.drawable.image_00066,R.drawable.image_00067,
R.drawable.image_00068,R.drawable.image_00069,R.drawable.image_00070, R.drawable.image_00071,
R.drawable.image_00072,R.drawable.image_00073, R.drawable.image_00074, R.drawable.image_00075,
R.drawable.image_00076,R.drawable.image_00077,R.drawable.image_00078,R.drawable.image_00079,
R.drawable.image_00080, R.drawable.image_00081, R.drawable.image_00082,R.drawable.image_00083,
R.drawable.image_00084, R.drawable.image_00085, R.drawable.image_00086,R.drawable.image_00087,
R.drawable.image_00088, R.drawable.image_00089, R.drawable.image_00090,R.drawable.image_00091,
R.drawable.image_00092, R.drawable.image_00093, R.drawable.image_00094,R.drawable.image_00095,
R.drawable.image_00096, R.drawable.image_00097, R.drawable.image_00098,R.drawable.image_00099,
};
public TaxiPassengerStartAutopilotView(Context context) {
super(context);
@@ -73,16 +99,20 @@ public class TaxiPassengerStartAutopilotView extends RelativeLayout implements V
mAutopilotBtnBg = view.findViewById(R.id.taxi_p_autopilot_btn_bg);
initBtnAnimatonDrawable();
initCarStartingFrame();
}
private void initCarStartingFrame() {
svCarStartingFrame = view.findViewById(R.id.taxi_p_autopilot_starting);
svCarStartingFrame.setBitmapIds(Arrays.asList(startingAnimIds));
svCarStartingFrame.setDuration(1300);
// svCarStartingFrame.setOnLongClickListener(new OnLongClickListener() {
// @Override
// public boolean onLongClick(View v) {
// TaxiPassengerModel.getInstance().startServicePilotDone();
// return false;
// }
// });
}
private void initBtnAnimatonDrawable() {
mAnimationDrawable = new AnimatorDrawableUtil();
mAnimationDrawable.setAnimation(mAutopilotBtnBg,Arrays.asList(startBtnBgAnimIds));
}
public void setOnClickStartAutopilotBtnCallback(ITPClickStartAutopilotCallback clickCallback){
@@ -132,7 +162,6 @@ public class TaxiPassengerStartAutopilotView extends RelativeLayout implements V
mStartAutopilotBtn.setTextColor(
mContext.getResources().getColor(R.color.taxi_p_start_autopilot_txt_color));
mStartAutopilotBtn.setBackground(null);
mAutopilotBtnBg.setBackground(mContext.getResources().getDrawable(R.drawable.anmi_flow));
}else {
mStartAutopilotBtn.setBackground(
mContext.getResources().getDrawable(R.drawable.taxi_p_start_autopilot_txt_btn_bg));
@@ -148,15 +177,12 @@ public class TaxiPassengerStartAutopilotView extends RelativeLayout implements V
public void startAutopilotBgAnimatorDrawable(boolean isStart){
if (isStart){
if (mAnimationBtnDrawable == null) {
mAnimationBtnDrawable = (AnimationDrawable) mAutopilotBtnBg.getBackground();
if (mAnimationDrawable == null){
}
if (mAnimationBtnDrawable.isRunning()) {
CallerLogger.INSTANCE.d(M_TAXI_P+TAG,"mAnimationBtnDrawable.isRunning() = true");
return;
if (mAnimationDrawable != null){
mAnimationDrawable.start(true, 30, null);
}
mAnimationBtnDrawable.selectDrawable(-1);
mAnimationBtnDrawable.start();
}else {
clearBgAnimDrawable();
}
@@ -194,10 +220,9 @@ public class TaxiPassengerStartAutopilotView extends RelativeLayout implements V
}
public void clearBgAnimDrawable() {
if (mAnimationBtnDrawable != null) {
mAnimationBtnDrawable.stop();
if (mAnimationDrawable != null){
mAnimationDrawable.stop();
}
mAnimationBtnDrawable = null;
}
public void closeAllAnimsAndView(){