由于运动轨迹是在子线程里面完成的,我们自然而然会想到线程的等待、唤醒,也就是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);
}

}

转载于:https://www.cnblogs.com/ly570/p/11369964.html

运动轨迹的暂停、继续问题相关推荐

  1. android double精度_Android车辆运动轨迹平滑移动(高仿滴滴打车)最佳实践

    点击上方"Android技术杂货铺",选择"标星" 干货文章,第一时间送达! 作者:门心叼龙 链接:https://www.jianshu.com/p/015b ...

  2. Android车辆运动轨迹平滑移动(高仿滴滴打车)最佳实践

    版权声明:本文来自门心叼龙的博客,属于原创内容,转载请注明出处:https://menxindiaolong.blog.csdn.net/article/details/95789128 github ...

  3. 【Cocos游戏实战】功夫小子第七课之游戏主功能场景逻辑功能和暂停功能场景的分析和实现...

    CSDN的markdown编辑器是吃屎了么! !.什么玩意.!写了一半写不了东西还全没了,搞个毛线! 本节课的视频教程地址是:第七课在此  假设本教程有帮助到您,希望您能点击进去观看一下,并且如今注冊 ...

  4. keep怎么生成运动轨迹_KEEP的另类使用技巧——旅行记录

    2015年,是夜跑流行起来的一年,也是大学时候怎么也吃不胖的我,开始发胖的一年.作为一个软件测评的重度爱好者,对运动类APP自然也是不能放过.在平行使用过咕咚.KEEP.虎扑.悦跑圈以及国外的一些软件 ...

  5. css3动画之圆形运动轨迹

    css3中通过@keyframes定义动画,animation设置动画属性,从而实现动画效果: 在animation属性当中,可以规定动画的名称.整个动画的运行时间.运动的速度曲线以及其延迟时间.播放 ...

  6. 想知道垃圾回收暂停的过程中发生了什么吗?查查垃圾回收日志就知道了!

    \ 关键点 \ 垃圾回收日志中包括着一些关键性能指标: \ 要做一次正确的垃圾回收分析需要收集许多数据,所以好的工具是非常必要的: \ 除了垃圾回收之外还有很多事件都可能会让应用程序暂停: \ 让你的 ...

  7. Intel 6系列芯片组设计缺陷 全球出货暂停

    美国当地时间周一,Intel公司官方宣布,今年1月初刚刚伴随Sandy Bridge系列"第二代Core架构处理器"推出的6系列芯片组(代号Cougar Point)发现了设计方面 ...

  8. 自动跟随小车c语言,基于OpenCV的智能小车运动轨迹跟踪方法研究

    摘要: 随着人工智能技术的快速发展,智能小车开发受到越来越多研究者的关注,也已经成为一个重要的研究方向,而解决智能小车在路径规划中行驶的运动故障重要手段是对其进行的视频监控,但是智能小车的视频监控只能 ...

  9. 滴滴大整改:9月8日至15日暂停深夜叫车服务

    9 月 4 日晚间,滴滴出行正式对外宣布,将于 9 月 4 日启动安全大整治.并宣布,在在以下主要措施落地前,滴滴出行将于 9 月 8 日 23 点至 9 月 15 日凌晨 5 点期间在中国大陆地区暂 ...

最新文章

  1. 华为工程师SRECon Asia见闻:聚焦可靠性、资源优化及性能提升
  2. s3cmd安装与使用
  3. C++与Lua交互(四)
  4. 鸿蒙系统明年上市巧,鸿蒙系统官网下载-鸿蒙系统官网下载手机版 v2.0下载-955游戏网...
  5. python3编码转换_Python3编码转换
  6. ubuntu c mysql_Ubuntu下MySql和C连接的一些问题
  7. “刚毕业1年,做Python挣了60W!”网友:吹的不多..
  8. webdrive不更新_关于selenium 用Webdrive打开Firefox不含有插件的问题(python)
  9. Linux Kernel File IO Syscall Kernel-Source-Code Analysis(undone)
  10. 计算机组成原理实验串行口,计算机组成原理实验2.ppt
  11. android服务的应用,Android学习指南之十四:Service详解及应用实例
  12. VC++6.0环境下调试c语言代码的方法和步骤_附图
  13. 基、维数和坐标 过渡矩阵与坐标变换
  14. usb口拒绝访问_插u盘拒绝访问怎么办_win7u盘插电脑上显示拒绝访问的解决方法...
  15. RNA-seq数据分析
  16. nvm npm exit status 1:乱码
  17. mysql 使用idb文件恢复数据
  18. CMD命令汇总 电脑入门知识【装机吧】
  19. 如何在多个视频画面的任意位置上添加上同一张图片
  20. google浏览器打开出现“喔唷,崩溃啦”解决办法

热门文章

  1. 荒野行动系统推荐观战榜_荒野行动怎么观战 荒野行动观战报点方法一览
  2. [计蒜客] 百度AI小课堂-矩阵问题
  3. 三大运营商都在总结5G商用3年有啥成果?谁更厉害?
  4. ASP.NET Core 2.0 : 七.一张图看透启动背后的秘密
  5. MediaCodec 解码 - 机型适配MI 8 (小米8)
  6. Vue电商项目 封装svg
  7. JVM学习之:虚拟机中的运行时栈帧总结(一)
  8. Vista破解方法深度总结(目前共7种方法) ayconanw撰写
  9. Gstreamer中添加x265编解码器
  10. 如果你工资不到5000,这6个app要收好,能帮你改变现状,工资翻倍