运动轨迹的暂停继续问题

Posted ly570

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运动轨迹的暂停继续问题相关的知识,希望对你有一定的参考价值。

由于运动轨迹是在子线程里面完成的,我们自然而然会想到线程的等待、唤醒,也就是wait、notify的问题了
因此我们在运动过程加上就如下代码就可以了

if (pause)
try
lock.wait();
catch (InterruptedException e)
e.printStackTrace();



1
2
3
4
5
6
7
8
怎么让他恢复运动呢?notify一下即可

public void reStartMove()
synchronized (lock)
pause = false;
lock.notify();


完整的代码如下:


/**
* Description: <MoveCarCustomThread><br>
* Author: mxdl<br>
* Date: 2019/7/10<br>
* Version: V1.0.0<br>
* Update: <br>
*/
public class MoveCarCustomThread extends Thread
public static final String TAG = MoveCarCustomThread.class.getSimpleName();
private Handler moveCarHandler;//发送数据的异步消息处理器
private Object lock = new Object();//线程锁
private boolean moveing = false;//是否线程正在移动
private boolean pause = false;//暂停状态,为true则暂停
private boolean stop = false;//停止状态,为true则停止移动
private WeakReference<MainActivity> mActivityWeakReference;//防止内存Activity导致的内容泄漏
private MOVE_STATE currMoveState = MOVE_STATE.START_STATUS;

public void setCurrMoveState(MOVE_STATE currMoveState)
this.currMoveState = currMoveState;

public MOVE_STATE getCurrMoveState()
return currMoveState;

public MoveCarCustomThread(MainActivity activity)
mActivityWeakReference = new WeakReference<>(activity);

//暂停移动
public void pauseMove()
pause = true;

//设置暂停之后,再次移动调用它
public void reStartMove()
synchronized (lock)
pause = false;
lock.notify();

public void stopMove()
stop = true;
if(moveCarHandler != null)
moveCarHandler.removeCallbacksAndMessages(null);

if(mActivityWeakReference.get() != null)
mActivityWeakReference.get().mLatLngList.clear();
mActivityWeakReference.get().mMainHandler.removeCallbacksAndMessages(null);

public Handler getMoveCarHandler()
return moveCarHandler;

public boolean isMoveing()
return moveing;


@Override
public void run()
super.run();
//设置该线程为loop线程
Looper.prepare();
moveCarHandler = new Handler()
@Override
public void handleMessage(Message msg)
super.handleMessage(msg);
//通过锁保证发过来的数据同步入列
synchronized (lock)
if (msg.obj != null && msg.obj instanceof List)
List<LatLng> latLngList = (List<LatLng>) msg.obj;
moveCoarseTrack(latLngList);



;
//启动loop线程
Looper.loop();

private void moveCoarseTrack(List<LatLng> latLngList)
if (latLngList == null || latLngList.size() == 0 || latLngList.size() == 1)
return;

Log.v(TAG, "moveCoarseTrack start.........................................................");
long startTime = System.currentTimeMillis();
Log.v(TAG, "startTime:" + startTime);
int step = TrackMoveUtil.getStep(latLngList);// 通过距离,计算轨迹动画运动步数
Log.v(TAG, "move step:" + step);
float distance = TrackMoveUtil.getDistance(latLngList);
Log.v(TAG, "move distance:" + distance);
double mTimeInterval = TrackMoveUtil.getMoveTime(distance, step);// 通过距离,计算轨迹动画时间间隔
mTimeInterval = 10;// 每走一步停止10毫秒
Log.v(TAG, "move mTimeInterval:" + mTimeInterval);

moveing = true;
for (int i = 0; i < latLngList.size() - 1; i++)
// 暂停状态,线程停止了
if (pause)
movePause();

if (stop)
break;

moveing = true;
LatLng startLatLng = latLngList.get(i);
LatLng endLatLng = latLngList.get(i + 1);
MainActivity mainActivity = mActivityWeakReference.get();
moveCar(startLatLng, endLatLng, mainActivity);
moveLine(startLatLng, mainActivity);
moveCamera(startLatLng, mainActivity);

double slope = TrackMoveUtil.getSlope(startLatLng, endLatLng);// 计算两点间的斜率
double intercept = TrackMoveUtil.getInterception(slope, startLatLng);// 根据点和斜率算取截距
boolean isReverse = (startLatLng.latitude > endLatLng.latitude);// 是不是正向的标示(向上设为正向)
double xMoveDistance = isReverse ? TrackMoveUtil.getXMoveDistance(slope) : -1 * TrackMoveUtil.getXMoveDistance(slope);
// 应该对经纬度同时处理
double sleep = 0;
int flag = 0;
for (double j = startLatLng.latitude; !((j >= endLatLng.latitude) ^ isReverse); j = j - xMoveDistance)
// 非暂停状态地图才进行跟随移动
if (pause)
movePause();

if (stop)
break;

moveing = true;
flag++;
if (slope != Double.MAX_VALUE)
startLatLng = new LatLng(j, (j - intercept) / slope);
else
startLatLng = new LatLng(j, startLatLng.longitude);

moveCar(startLatLng, mainActivity);
moveLine(startLatLng, mainActivity);
if (flag % 100 == 0)
moveCamera(startLatLng, mainActivity);

// 如果间隔时间小于1毫秒,则略过当前休眠,累加直到休眠时间到1毫秒:会损失精度
if (mTimeInterval < 1)
sleep += mTimeInterval;
if (sleep >= 1)
Log.v(TAG, "sleep:" + sleep);
SystemClock.sleep((long) sleep);
sleep = 0;

else
SystemClock.sleep((long) mTimeInterval);



long endTime = System.currentTimeMillis();
moveing = false;
Log.v(TAG, "endTime:" + endTime);
Log.v(TAG, "run mTimeInterval:" + (endTime - startTime));
Log.v(TAG, "moveCoarseTrack end.........................................................");

private void moveLine(LatLng startLatLng, MainActivity mainActivity)
mainActivity.mLatLngList.add(startLatLng);// 向轨迹集合增加轨迹点
mainActivity.mMovePolyline.setPoints(mainActivity.mLatLngList);// 轨迹画线开始

private void moveCar(LatLng startLatLng, LatLng endLatLng, MainActivity mainActivity)
moveCar(startLatLng,mainActivity);
if (mainActivity.mCarMarker != null)
mainActivity.mCarMarker.setRotateAngle((float) TrackMoveUtil.getAngle(startLatLng, endLatLng));// 设置小车车头的方向


private void moveCar(LatLng startLatLng,MainActivity mainActivity)
if (mainActivity.mCarMarker != null)
mainActivity.mCarMarker.setPosition(startLatLng);// 小车移动


private void movePause()
try
lock.wait();
catch (InterruptedException e)
e.printStackTrace();

private void moveCamera(LatLng startLatLng, MainActivity mainActivity)
Message message = Message.obtain();
message.what = MainActivity.EventType.MapMove;
message.obj = startLatLng;
mainActivity.mMainHandler.sendMessage(message);

以上是关于运动轨迹的暂停继续问题的主要内容,如果未能解决你的问题,请参考以下文章

百度地图绘制运动轨迹技巧

Unity 物体轨迹移动

使用python进行运动轨迹合并:多次骑行跑步轨迹叠加显示

什么是 控制轨迹

nx获取刀轨参数

ThreeJs之选中模型中的物体及物体沿轨迹移动