Commit bf3f5578db96fafe02044e4bc9f499b178e142fa

Authored by 杨帅
1 parent 9df709a2

1.;跑步结束页面

Showing 25 changed files with 543 additions and 204 deletions
app/build.gradle
@@ -28,15 +28,16 @@ android { @@ -28,15 +28,16 @@ android {
28 buildConfigField("String", "APP_ID", stringValue("802_jhbqccxw08")) 28 buildConfigField("String", "APP_ID", stringValue("802_jhbqccxw08"))
29 buildConfigField("String", "APP_KEY", stringValue("9c5619e9be747bb3b925dd215ca5923d86f12c09b9394f")) 29 buildConfigField("String", "APP_KEY", stringValue("9c5619e9be747bb3b925dd215ca5923d86f12c09b9394f"))
30 buildConfigField("String", "APP_SCERET", stringValue("1e6380cb347255e777f72b5aa60f41daa68443a132aaea")) 30 buildConfigField("String", "APP_SCERET", stringValue("1e6380cb347255e777f72b5aa60f41daa68443a132aaea"))
31 - // BAIDU_MAP_APP_KEY : "2IIsTtvX2FA88yvDrPZedc2ZvMhxyDbN" 31 +// BAIDU_MAP_APP_KEY: "OeotXc38bbnU7WmyKGA0VMahk4v35VG2"
32 manifestPlaceholders = [ 32 manifestPlaceholders = [
33 33
34 - BAIDU_MAP_APP_KEY: "OeotXc38bbnU7WmyKGA0VMahk4v35VG2" 34 + BAIDU_MAP_APP_KEY: "2IIsTtvX2FA88yvDrPZedc2ZvMhxyDbN"
35 35
36 36
37 ] 37 ]
38 } 38 }
39 // BAIDU_MAP_APP_KEY: "Q7y9SGcZVs0tmhbNTiaz0jHm4S1xGzE2" 39 // BAIDU_MAP_APP_KEY: "Q7y9SGcZVs0tmhbNTiaz0jHm4S1xGzE2"
  40 +// BAIDU_MAP_APP_KEY: "0bWeo04KKKHqTwozcqgyLZVd0oVhv3rZ"
40 41
41 release { 42 release {
42 resValue("string", "app_name", "网++") 43 resValue("string", "app_name", "网++")
@@ -44,7 +45,7 @@ android { @@ -44,7 +45,7 @@ android {
44 buildConfigField("String", "APP_KEY", stringValue("0d57b045ec0c3988a682d94c644e66b9b8e0d2b8ef937d")) 45 buildConfigField("String", "APP_KEY", stringValue("0d57b045ec0c3988a682d94c644e66b9b8e0d2b8ef937d"))
45 buildConfigField("String", "APP_SCERET", stringValue("275e8dc29274a1186d82f65bc607c231d02bcb3bfd8976")) 46 buildConfigField("String", "APP_SCERET", stringValue("275e8dc29274a1186d82f65bc607c231d02bcb3bfd8976"))
46 manifestPlaceholders = [ 47 manifestPlaceholders = [
47 - BAIDU_MAP_APP_KEY: "0bWeo04KKKHqTwozcqgyLZVd0oVhv3rZ" 48 + BAIDU_MAP_APP_KEY: "Q7y9SGcZVs0tmhbNTiaz0jHm4S1xGzE2"
48 ] 49 ]
49 } 50 }
50 } 51 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/presenter/RunningMapFragmentPresenter.java
@@ -59,6 +59,7 @@ import com.baidu.trace.model.TraceLocation; @@ -59,6 +59,7 @@ import com.baidu.trace.model.TraceLocation;
59 import com.baidu.trace.model.TransportMode; 59 import com.baidu.trace.model.TransportMode;
60 import com.cnlive.moudle.pedometer.frame.view.RunningMapFragmentView; 60 import com.cnlive.moudle.pedometer.frame.view.RunningMapFragmentView;
61 import com.cnlive.moudle.pedometer.model.Constant; 61 import com.cnlive.moudle.pedometer.model.Constant;
  62 +import com.cnlive.moudle.pedometer.model.RoutePoint;
62 import com.cnlive.moudle.pedometer.service.StepService; 63 import com.cnlive.moudle.pedometer.service.StepService;
63 import com.cnlive.moudle.pedometer.utils.BitmapUtil; 64 import com.cnlive.moudle.pedometer.utils.BitmapUtil;
64 import com.cnlive.moudle.pedometer.utils.CommonUtil; 65 import com.cnlive.moudle.pedometer.utils.CommonUtil;
@@ -127,9 +128,9 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter<RunningMapFrag @@ -127,9 +128,9 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter<RunningMapFrag
127 //去噪:可设置是否需要去除角度、速度和方向异常的轨迹点 128 //去噪:可设置是否需要去除角度、速度和方向异常的轨迹点
128 processOption.setNeedDenoise(true); 129 processOption.setNeedDenoise(true);
129 //绑路:设置是否将轨迹点绑定至路网道路 130 //绑路:设置是否将轨迹点绑定至路网道路
130 - processOption.setNeedMapMatch(true); 131 + processOption.setNeedMapMatch(false);
131 //抽稀:设置是否进行抽稀处理,对冗余的轨迹点进行抽稀去除处理,如一条直线上除起终点外的多个轨迹点 132 //抽稀:设置是否进行抽稀处理,对冗余的轨迹点进行抽稀去除处理,如一条直线上除起终点外的多个轨迹点
132 -// processOption.setNeedVacuate(true); 133 + processOption.setNeedVacuate(true);
133 //自动判断交通方式 134 //自动判断交通方式
134 processOption.setTransportMode(TransportMode.walking); 135 processOption.setTransportMode(TransportMode.walking);
135 // 设置精度过滤值(定位精度大于100米的过滤掉) 136 // 设置精度过滤值(定位精度大于100米的过滤掉)
@@ -172,14 +173,12 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter<RunningMapFrag @@ -172,14 +173,12 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter<RunningMapFrag
172 queryHistoryTrace(context, entityName, startTime, endTime); 173 queryHistoryTrace(context, entityName, startTime, endTime);
173 } else { 174 } else {
174 if (getView() != null) { 175 if (getView() != null) {
175 - List<com.baidu.trace.model.LatLng> fenceLatLngs = new ArrayList<>();  
176 -// for (LatLng latLng:trackPoints){  
177 -// com.baidu.trace.model.LatLng tempLatLng=new com.baidu.trace.model.LatLng(latLng.latitude,latLng.longitude);  
178 -// fenceLatLngs.add(tempLatLng);  
179 -// }  
180 -// Log.e(TAG, "onHistoryTrackCallback: "+trackPoints.size()+","+ GsonUtil.GsonString(trackPoints));  
181 -// createFence(context, fenceLatLngs); 176 + List<RoutePoint> routePoints = new ArrayList<>();
  177 + for (LatLng latLng : trackPoints) {
  178 + routePoints.add(new RoutePoint(latLng.latitude, latLng.longitude));
  179 + }
182 MyMapUtil.drawHistoryTrack(context, getView().baiduMap, trackPoints, SortType.asc, R.color.red, R.drawable.icon_start, R.drawable.icon_end); 180 MyMapUtil.drawHistoryTrack(context, getView().baiduMap, trackPoints, SortType.asc, R.color.red, R.drawable.icon_start, R.drawable.icon_end);
  181 +// MyMapUtil.drawMapLineRoutePoint(context, getView().baiduMap, MyMapUtil.optimizePoints(routePoints), R.color.red);
183 } 182 }
184 } 183 }
185 } 184 }
@@ -335,9 +334,13 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter&lt;RunningMapFrag @@ -335,9 +334,13 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter&lt;RunningMapFrag
335 // 监控状态回调 334 // 监控状态回调
336 @Override 335 @Override
337 public void onMonitoredStatusCallback(MonitoredStatusResponse monitoredStatusResponse) { 336 public void onMonitoredStatusCallback(MonitoredStatusResponse monitoredStatusResponse) {
338 - Toast.makeText(context, "围栏列表回调成功:onMonitoredStatusCallback", Toast.LENGTH_SHORT).show();  
339 - //查询监控对象状态响应结果 337 + if (monitoredStatusResponse.getMonitoredStatusInfos() != null) {
  338 + Toast.makeText(context, "围栏列表回调成功:个数:" + monitoredStatusResponse.getMonitoredStatusInfos().size(), Toast.LENGTH_SHORT).show();
  339 + } //查询监控对象状态响应结果
340 List<MonitoredStatusInfo> monitoredStatusInfos = monitoredStatusResponse.getMonitoredStatusInfos(); 340 List<MonitoredStatusInfo> monitoredStatusInfos = monitoredStatusResponse.getMonitoredStatusInfos();
  341 + if (monitoredStatusInfos == null) {
  342 + return;
  343 + }
341 for (MonitoredStatusInfo monitoredStatusInfo : monitoredStatusInfos) { 344 for (MonitoredStatusInfo monitoredStatusInfo : monitoredStatusInfos) {
342 monitoredStatusInfo.getFenceId(); 345 monitoredStatusInfo.getFenceId();
343 MonitoredStatus status = monitoredStatusInfo.getMonitoredStatus();//获取状态 346 MonitoredStatus status = monitoredStatusInfo.getMonitoredStatus();//获取状态
@@ -406,7 +409,7 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter&lt;RunningMapFrag @@ -406,7 +409,7 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter&lt;RunningMapFrag
406 } 409 }
407 410
408 List<Long> fenid = new ArrayList<>(); 411 List<Long> fenid = new ArrayList<>();
409 - fenid.add(111L); 412 + fenid.add(1L);
410 MonitoredStatusRequest request1 = MonitoredStatusRequest.buildServerRequest(1, 413 MonitoredStatusRequest request1 = MonitoredStatusRequest.buildServerRequest(1,
411 StepService.serviceId, "yangshuai", fenid); 414 StepService.serviceId, "yangshuai", fenid);
412 Handler handler = new Handler(); 415 Handler handler = new Handler();
@@ -414,7 +417,6 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter&lt;RunningMapFrag @@ -414,7 +417,6 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter&lt;RunningMapFrag
414 @Override 417 @Override
415 public void run() { 418 public void run() {
416 StepService.mClient.queryMonitoredStatus(request1, onFenceListener); 419 StepService.mClient.queryMonitoredStatus(request1, onFenceListener);
417 -// handler.postDelayed(this, 5000);  
418 } 420 }
419 }; 421 };
420 handler.postDelayed(runnable, 5000); 422 handler.postDelayed(runnable, 5000);
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/view/RunMainFragmentView.java
@@ -75,6 +75,9 @@ public class RunMainFragmentView implements MvpView { @@ -75,6 +75,9 @@ public class RunMainFragmentView implements MvpView {
75 runnable = new Runnable() { 75 runnable = new Runnable() {
76 @Override 76 @Override
77 public void run() { 77 public void run() {
  78 + if (fragment.getActivity() == null) {
  79 + return;
  80 + }
78 if (timeCountDown > 1) { 81 if (timeCountDown > 1) {
79 timeCountDown--; 82 timeCountDown--;
80 fragment.binding.tvTimeCountDown.setVisibility(View.VISIBLE); 83 fragment.binding.tvTimeCountDown.setVisibility(View.VISIBLE);
@@ -257,7 +260,7 @@ public class RunMainFragmentView implements MvpView { @@ -257,7 +260,7 @@ public class RunMainFragmentView implements MvpView {
257 fragment.getActivity().stopService(new Intent(fragment.getActivity(), StepService.class)); 260 fragment.getActivity().stopService(new Intent(fragment.getActivity(), StepService.class));
258 MySpHelper.getInstance(getContext(), Context.MODE_MULTI_PROCESS).putString("userId", ""); 261 MySpHelper.getInstance(getContext(), Context.MODE_MULTI_PROCESS).putString("userId", "");
259 RunningFinishActivity.startActivity(fragment.getActivity()); 262 RunningFinishActivity.startActivity(fragment.getActivity());
260 - // fragment.getActivity().finish(); 263 + fragment.getActivity().finish();
261 } 264 }
262 }, "取消", new SelectDialog.DialogInterface() { 265 }, "取消", new SelectDialog.DialogInterface() {
263 @Override 266 @Override
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/view/RunningMapFragmentView.java
@@ -28,8 +28,11 @@ import com.baidu.mapapi.map.MapView; @@ -28,8 +28,11 @@ import com.baidu.mapapi.map.MapView;
28 import com.baidu.mapapi.map.MarkerOptions; 28 import com.baidu.mapapi.map.MarkerOptions;
29 import com.baidu.mapapi.map.MyLocationConfiguration; 29 import com.baidu.mapapi.map.MyLocationConfiguration;
30 import com.baidu.mapapi.map.MyLocationData; 30 import com.baidu.mapapi.map.MyLocationData;
  31 +import com.baidu.mapapi.map.Overlay;
31 import com.baidu.mapapi.map.UiSettings; 32 import com.baidu.mapapi.map.UiSettings;
32 import com.baidu.mapapi.model.LatLng; 33 import com.baidu.mapapi.model.LatLng;
  34 +import com.baidu.mapapi.utils.DistanceUtil;
  35 +import com.baidu.trace.model.SortType;
33 import com.cnlive.moudle.pedometer.model.RunningMapBean; 36 import com.cnlive.moudle.pedometer.model.RunningMapBean;
34 import com.cnlive.moudle.pedometer.ui.fragment.RunningMapFragment; 37 import com.cnlive.moudle.pedometer.ui.fragment.RunningMapFragment;
35 import com.cnlive.moudle.pedometer.utils.BitmapUtil; 38 import com.cnlive.moudle.pedometer.utils.BitmapUtil;
@@ -39,6 +42,7 @@ import com.cnlive.moudle.pedometer.utils.StepUtil; @@ -39,6 +42,7 @@ import com.cnlive.moudle.pedometer.utils.StepUtil;
39 import com.example.moudle_pedometer.R; 42 import com.example.moudle_pedometer.R;
40 import com.hannesdorfmann.mosby3.mvp.MvpView; 43 import com.hannesdorfmann.mosby3.mvp.MvpView;
41 44
  45 +import java.util.ArrayList;
42 import java.util.List; 46 import java.util.List;
43 47
44 public class RunningMapFragmentView implements MvpView, SensorEventListener { 48 public class RunningMapFragmentView implements MvpView, SensorEventListener {
@@ -54,7 +58,7 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener { @@ -54,7 +58,7 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener {
54 private static MyLocationData mylocation; 58 private static MyLocationData mylocation;
55 boolean isFirstLoc = true; // 是否首次定位 59 boolean isFirstLoc = true; // 是否首次定位
56 private MarkerOptions currentMark; 60 private MarkerOptions currentMark;
57 - private LatLng firstLatLng; 61 + private LatLng myCurLatLng;
58 private Double lastX = 0.0; 62 private Double lastX = 0.0;
59 private int mCurrentDirection = 0; 63 private int mCurrentDirection = 0;
60 private double mCurrentLat = 0.0; 64 private double mCurrentLat = 0.0;
@@ -66,6 +70,8 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener { @@ -66,6 +70,8 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener {
66 private final int DEFULT_ZOOM = 17; 70 private final int DEFULT_ZOOM = 17;
67 private boolean isFirstLoadMap = true; 71 private boolean isFirstLoadMap = true;
68 private List<LatLng> trackPoints; 72 private List<LatLng> trackPoints;
  73 + private Overlay currentLine;
  74 + private List<LatLng> currentPoints;
69 75
70 public RunningMapFragmentView(RunningMapFragment fragment) { 76 public RunningMapFragmentView(RunningMapFragment fragment) {
71 this.fragment = fragment; 77 this.fragment = fragment;
@@ -76,6 +82,7 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener { @@ -76,6 +82,7 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener {
76 } 82 }
77 83
78 public void initView(List<LatLng> trackPoints) { 84 public void initView(List<LatLng> trackPoints) {
  85 + currentPoints = new ArrayList<>();
79 this.trackPoints = trackPoints; 86 this.trackPoints = trackPoints;
80 this.mMapView = fragment.binding.mapView; 87 this.mMapView = fragment.binding.mapView;
81 if (baiduMap == null) { 88 if (baiduMap == null) {
@@ -103,7 +110,7 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener { @@ -103,7 +110,7 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener {
103 mMapView.showZoomControls(false); 110 mMapView.showZoomControls(false);
104 mUiSettings.setEnlargeCenterWithDoubleClickEnable(true); 111 mUiSettings.setEnlargeCenterWithDoubleClickEnable(true);
105 //隐藏自带的指南针,改用自定义指南针 杨帅 112 //隐藏自带的指南针,改用自定义指南针 杨帅
106 - baiduMap.getUiSettings().setCompassEnabled(true); 113 + mUiSettings.setCompassEnabled(false);
107 //显示定位图层 114 //显示定位图层
108 baiduMap.setMyLocationEnabled(true); 115 baiduMap.setMyLocationEnabled(true);
109 // 定位初始化 116 // 定位初始化
@@ -111,21 +118,36 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener { @@ -111,21 +118,36 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener {
111 mLocClient.registerLocationListener(myListener); 118 mLocClient.registerLocationListener(myListener);
112 LocationClientOption option = new LocationClientOption(); 119 LocationClientOption option = new LocationClientOption();
113 option.setOpenGps(true); // 打开gps 120 option.setOpenGps(true); // 打开gps
  121 + //可选,设置返回经纬度坐标类型,默认GCJ02
  122 + //GCJ02:国测局坐标;
  123 + //BD09ll:百度经纬度坐标;
  124 + //BD09:百度墨卡托坐标;
  125 + //海外地区定位,无需设置坐标类型,统一返回WGS84类型坐标
114 option.setCoorType("gcj02"); // 设置坐标类型 126 option.setCoorType("gcj02"); // 设置坐标类型
115 //可选,默认false,设置是否开启Gps定位 127 //可选,默认false,设置是否开启Gps定位
116 option.setOpenGps(true); 128 option.setOpenGps(true);
117 //设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者,该模式下开发者无需再关心定位间隔是多少,定位SDK本身发现位置变化就会及时回调给开发者 129 //设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者,该模式下开发者无需再关心定位间隔是多少,定位SDK本身发现位置变化就会及时回调给开发者
118 option.setOpenAutoNotifyMode(); 130 option.setOpenAutoNotifyMode();
119 //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 131 //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
  132 + //LocationMode.Hight_Accuracy:高精度;
  133 + //LocationMode. Battery_Saving:低功耗;
  134 + //LocationMode. Device_Sensors:仅使用设备;
120 option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); 135 option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
121 //可选,设置是否需要地址信息,默认不需要 136 //可选,设置是否需要地址信息,默认不需要
122 - option.setIsNeedAddress(true); 137 + option.setIsNeedAddress(false);
123 //可选,设置是否需要地址描述 138 //可选,设置是否需要地址描述
124 - option.setIsNeedLocationDescribe(true); 139 + option.setIsNeedLocationDescribe(false);
125 //可选,设置是否需要设备方向结果 140 //可选,设置是否需要设备方向结果
126 option.setNeedDeviceDirect(false); 141 option.setNeedDeviceDirect(false);
127 //设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者 142 //设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者
  143 + //minTimeInterval - 最短定位时间间隔,单位毫秒,最小值0,开发者可以在设置希望的位置回调最短时间间隔
  144 + //minDistance - 最短定位距离间隔,单位米,最小值0,开发者可以设置希望的位置回调距离间隔
  145 + //locSensitivity - 定位变化敏感程度,LOC_SENSITIVITY_HIGHT,LOC_SENSITIVITY_MIDDLE,LOC_SENSITIVITY_LOW
128 option.setOpenAutoNotifyMode(3000, 1, LocationClientOption.LOC_SENSITIVITY_HIGHT); 146 option.setOpenAutoNotifyMode(3000, 1, LocationClientOption.LOC_SENSITIVITY_HIGHT);
  147 + //可选,定位SDK内部是一个service,并放到了独立进程。
  148 + //设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)
  149 + option.setIgnoreKillProcess(true);
  150 +
129 mLocClient.setLocOption(option); 151 mLocClient.setLocOption(option);
130 mLocClient.start(); 152 mLocClient.start();
131 //地图加载完毕监听 153 //地图加载完毕监听
@@ -142,7 +164,11 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener { @@ -142,7 +164,11 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener {
142 new Handler().postDelayed(new Runnable() { 164 new Handler().postDelayed(new Runnable() {
143 @Override 165 @Override
144 public void run() { 166 public void run() {
145 - MyMapUtil.drawMapLine(getContext(), baiduMap, trackPoints, R.color.green_50); 167 + //绘制赛道轨迹
  168 + if (getContext() == null) {
  169 + return;
  170 + }
  171 + MyMapUtil.drawServerLineTrack(getContext(), baiduMap, trackPoints, SortType.asc, R.color.green_50, R.drawable.icon_start, R.drawable.icon_end);
146 } 172 }
147 }, 1500); 173 }, 1500);
148 } 174 }
@@ -197,6 +223,20 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener { @@ -197,6 +223,20 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener {
197 * 定位SDK监听函数 223 * 定位SDK监听函数
198 */ 224 */
199 public class MyLocationListenner extends BDAbstractLocationListener { 225 public class MyLocationListenner extends BDAbstractLocationListener {
  226 + @Override
  227 + public void onLocDiagnosticMessage(int i, int i1, String s) {
  228 + super.onLocDiagnosticMessage(i, i1, s);
  229 + if (getContext() == null) {
  230 + return;
  231 + }
  232 + if (i == 67) {
  233 + Toast.makeText(getContext(), getContext().getString(R.string.loc_check_internet), Toast.LENGTH_SHORT).show();
  234 + } else if (i == 161 && i1 == 1) {
  235 + Toast.makeText(getContext(), getContext().getString(R.string.loc_open_gps), Toast.LENGTH_SHORT).show();
  236 + } else if (i == 161 && i1 == 2) {
  237 + Toast.makeText(getContext(), getContext().getString(R.string.loc_open_wifi), Toast.LENGTH_SHORT).show();
  238 + }
  239 + }
200 240
201 @Override 241 @Override
202 public void onReceiveLocation(BDLocation location) { 242 public void onReceiveLocation(BDLocation location) {
@@ -228,31 +268,38 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener { @@ -228,31 +268,38 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener {
228 return; 268 return;
229 } 269 }
230 MapStatus.Builder builder = new MapStatus.Builder(); 270 MapStatus.Builder builder = new MapStatus.Builder();
  271 + //不是第一次定位
  272 + if (!isFirstLoc) {
  273 + if (currentPoints.size() > 0) {
  274 + //进行判断
  275 + LatLng lastLatLng = currentPoints.get(currentPoints.size() - 1);
  276 + LatLng curLatLng = new LatLng(location.getLatitude(),
  277 + location.getLongitude());
  278 + Log.e(TAG, "onReceiveLocation: 距离:" + DistanceUtil.getDistance(lastLatLng, curLatLng));
  279 + if (DistanceUtil.getDistance(lastLatLng, curLatLng) > 1) {
  280 + currentPoints.add(curLatLng);
  281 + }
  282 + } else {
  283 + currentPoints.add(new LatLng(location.getLatitude(),
  284 + location.getLongitude()));
  285 + }
231 286
232 -// if (isFirstLoc) {  
233 -// isFirstLoc = false;  
234 - firstLatLng = new LatLng(location.getLatitude(), 287 + //判断当前集合列表是否可以划线(至少两个点)
  288 + if (currentPoints != null && currentPoints.size() > 1) {
  289 + //判断当前是否已经在地图上画点
  290 + if (currentLine != null) {
  291 + currentLine.remove();
  292 + }
  293 + //开始划线
  294 + if (getContext() == null) {
  295 + return;
  296 + }
  297 + currentLine = MyMapUtil.drawMapLine(getContext(), baiduMap, currentPoints, R.color.red);
  298 + }
  299 + }
  300 + myCurLatLng = new LatLng(location.getLatitude(),
235 location.getLongitude()); 301 location.getLongitude());
236 baiduMap.setMyLocationData(mylocation); 302 baiduMap.setMyLocationData(mylocation);
237 -// if (trackPoints!=null){  
238 -// Log.e(TAG, "trackPoints: "+MyMapUtil.isInPolygon(firstLatLng,trackPoints) );  
239 -// }  
240 -// if (isFirstLoc) {  
241 -// builder.target(firstLatLng).zoom(DEFULT_ZOOM);  
242 -// isFirstLoc = false;  
243 -// } else {  
244 -// float current = baiduMap.getMapStatus().zoom;  
245 -// builder.target(firstLatLng).zoom(current);  
246 -//  
247 -// }  
248 -// baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));  
249 -// //显示当前位置图标  
250 -// Bitmap pointBitmap = BitmapUtil.getBitmapFromDp(getContext(), BitmapFactory.decodeResource(getContext().getResources(), R.drawable.rt_ic_location), 40, 40);  
251 -// currentMark = new MarkerOptions().position(firstLatLng).icon(BitmapDescriptorFactory.fromBitmap(pointBitmap));  
252 -// baiduMap.addOverlay(currentMark);  
253 -  
254 -  
255 -// }  
256 } 303 }
257 } 304 }
258 305
@@ -342,6 +389,7 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener { @@ -342,6 +389,7 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener {
342 389
343 } 390 }
344 391
  392 +
345 public void onResume() { 393 public void onResume() {
346 if (mMapView != null) { 394 if (mMapView != null) {
347 mMapView.onResume(); 395 mMapView.onResume();
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/model/Constant.java
@@ -6,5 +6,7 @@ public class Constant { @@ -6,5 +6,7 @@ public class Constant {
6 public static final int SERVICE_STEP_COUNT_CONTINUE = 2;//继续计步 6 public static final int SERVICE_STEP_COUNT_CONTINUE = 2;//继续计步
7 public static final int SERVICE_STEP_COUNT_RESET_SPEED = 3;//重置速度 7 public static final int SERVICE_STEP_COUNT_RESET_SPEED = 3;//重置速度
8 public static final int FRAGMENT_RUN_CHRONOMETER = 4;//同步计时器 8 public static final int FRAGMENT_RUN_CHRONOMETER = 4;//同步计时器
  9 + public static final int EXIT_RANGE = 5;//超出范围
  10 + public static final int ENTER_RANGE = 6;//进入范围
9 11
10 } 12 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/model/RoutePoint.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.model;
  2 +
  3 +public class RoutePoint {
  4 + private double lat;
  5 + private double lng;
  6 +
  7 + public RoutePoint() {
  8 + }
  9 +
  10 + public RoutePoint(double lat, double lng) {
  11 + this.lat = lat;
  12 + this.lng = lng;
  13 + }
  14 +
  15 + public double getLat() {
  16 + return lat;
  17 + }
  18 +
  19 + public void setLat(double lat) {
  20 + this.lat = lat;
  21 + }
  22 +
  23 + public double getLng() {
  24 + return lng;
  25 + }
  26 +
  27 + public void setLng(double lng) {
  28 + this.lng = lng;
  29 + }
  30 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/service/StepService.java
@@ -147,9 +147,8 @@ public class StepService extends Service implements SensorEventListener { @@ -147,9 +147,8 @@ public class StepService extends Service implements SensorEventListener {
147 //打包周期 147 //打包周期
148 private int packInterval = 10; 148 private int packInterval = 10;
149 // 轨迹服务ID 149 // 轨迹服务ID
150 -// public static final long serviceId = 213511;  
151 -//杨帅  
152 - public static final long serviceId = 213553; 150 + public static final long serviceId = 213511;//杨帅
  151 +// public static final long serviceId = 213553;
153 152
154 // 设备标识 153 // 设备标识
155 public static String entityName = ""; 154 public static String entityName = "";
@@ -170,7 +169,6 @@ public class StepService extends Service implements SensorEventListener { @@ -170,7 +169,6 @@ public class StepService extends Service implements SensorEventListener {
170 169
171 @Override 170 @Override
172 public void onCreate() { 171 public void onCreate() {
173 - Log.e("执行onCreate", "onCreate");  
174 super.onCreate(); 172 super.onCreate();
175 init(); 173 init();
176 showStartForegroundNotification(); 174 showStartForegroundNotification();
@@ -325,11 +323,11 @@ public class StepService extends Service implements SensorEventListener { @@ -325,11 +323,11 @@ public class StepService extends Service implements SensorEventListener {
325 } 323 }
326 //超出范围 324 //超出范围
327 if (alarmPushInfo.getMonitoredAction() == MonitoredAction.exit) { 325 if (alarmPushInfo.getMonitoredAction() == MonitoredAction.exit) {
328 - 326 + EventBus.getDefault().post(new MessageEvent(Constant.EXIT_RANGE, ""));
329 } 327 }
330 //进入范围 328 //进入范围
331 else if (alarmPushInfo.getMonitoredAction() == MonitoredAction.enter) { 329 else if (alarmPushInfo.getMonitoredAction() == MonitoredAction.enter) {
332 - 330 + EventBus.getDefault().post(new MessageEvent(Constant.ENTER_RANGE, ""));
333 } 331 }
334 Toast.makeText(getApplicationContext(), "onPushCallback:" + alarmPushInfo.getMonitoredAction(), Toast.LENGTH_SHORT).show(); 332 Toast.makeText(getApplicationContext(), "onPushCallback:" + alarmPushInfo.getMonitoredAction(), Toast.LENGTH_SHORT).show();
335 333
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/activity/PedometerMainActivity.java
@@ -13,6 +13,7 @@ import android.support.annotation.NonNull; @@ -13,6 +13,7 @@ import android.support.annotation.NonNull;
13 import android.support.v4.app.NotificationManagerCompat; 13 import android.support.v4.app.NotificationManagerCompat;
14 import android.support.v4.content.ContextCompat; 14 import android.support.v4.content.ContextCompat;
15 import android.util.Log; 15 import android.util.Log;
  16 +import android.view.KeyEvent;
16 import android.widget.Toast; 17 import android.widget.Toast;
17 18
18 import com.alibaba.android.arouter.facade.annotation.Route; 19 import com.alibaba.android.arouter.facade.annotation.Route;
@@ -40,6 +41,7 @@ public class PedometerMainActivity extends QMUIFragmentActivity { @@ -40,6 +41,7 @@ public class PedometerMainActivity extends QMUIFragmentActivity {
40 private NotificationManagerCompat notificationManagerCompat; 41 private NotificationManagerCompat notificationManagerCompat;
41 private boolean isOpen; 42 private boolean isOpen;
42 private PermissionsUtils mPermissionsUtils = new PermissionsUtils();//权限申请 43 private PermissionsUtils mPermissionsUtils = new PermissionsUtils();//权限申请
  44 + private RunMainFragment fragment;
43 45
44 @Override 46 @Override
45 protected int getContextViewId() { 47 protected int getContextViewId() {
@@ -149,7 +151,7 @@ public class PedometerMainActivity extends QMUIFragmentActivity { @@ -149,7 +151,7 @@ public class PedometerMainActivity extends QMUIFragmentActivity {
149 } 151 }
150 152
151 private void addFragment() { 153 private void addFragment() {
152 - QMUIFragment fragment = new RunMainFragment(); 154 + fragment = new RunMainFragment();
153 getSupportFragmentManager().beginTransaction() 155 getSupportFragmentManager().beginTransaction()
154 .add(getContextViewId(), fragment, fragment.getClass().getSimpleName()) 156 .add(getContextViewId(), fragment, fragment.getClass().getSimpleName())
155 .addToBackStack(fragment.getClass().getSimpleName()) 157 .addToBackStack(fragment.getClass().getSimpleName())
@@ -236,4 +238,10 @@ public class PedometerMainActivity extends QMUIFragmentActivity { @@ -236,4 +238,10 @@ public class PedometerMainActivity extends QMUIFragmentActivity {
236 super.onRequestPermissionsResult(requestCode, permissions, grantResults); 238 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
237 mPermissionsUtils.dealResult(requestCode, permissions, grantResults); 239 mPermissionsUtils.dealResult(requestCode, permissions, grantResults);
238 } 240 }
  241 +
  242 +
  243 + @Override
  244 + public void onBackPressed() {
  245 + return;
  246 + }
239 } 247 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/activity/RunLineActivity.java
@@ -23,6 +23,7 @@ public class RunLineActivity extends AppCompatActivity { @@ -23,6 +23,7 @@ public class RunLineActivity extends AppCompatActivity {
23 setContentView(R.layout.activity_run_line); 23 setContentView(R.layout.activity_run_line);
24 24
25 getSupportFragmentManager().beginTransaction().replace(R.id.run_line_container, new RunLineFragment()).commit(); 25 getSupportFragmentManager().beginTransaction().replace(R.id.run_line_container, new RunLineFragment()).commit();
  26 +// getSupportFragmentManager().beginTransaction().replace(R.id.run_line_container, new RunningFinishFragment()).commit();
26 27
27 } 28 }
28 } 29 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/activity/RunRaceDetailActivity.java
@@ -16,9 +16,12 @@ import com.cnlive.libs.base.ui.QMUIFragment; @@ -16,9 +16,12 @@ import com.cnlive.libs.base.ui.QMUIFragment;
16 import com.cnlive.libs.base.ui.QMUIFragmentActivity; 16 import com.cnlive.libs.base.ui.QMUIFragmentActivity;
17 import com.cnlive.libs.base.util.StatusBarUtil2; 17 import com.cnlive.libs.base.util.StatusBarUtil2;
18 import com.cnlive.moudle.pedometer.model.RunningMapBean; 18 import com.cnlive.moudle.pedometer.model.RunningMapBean;
  19 +import com.cnlive.moudle.pedometer.sql.entity.UserStepEntity;
  20 +import com.cnlive.moudle.pedometer.ui.fragment.RunMainFragment;
19 import com.cnlive.moudle.pedometer.ui.fragment.RunRaceDetailFragment; 21 import com.cnlive.moudle.pedometer.ui.fragment.RunRaceDetailFragment;
20 import com.cnlive.moudle.pedometer.ui.fragment.RunningMapFragment; 22 import com.cnlive.moudle.pedometer.ui.fragment.RunningMapFragment;
21 import com.cnlive.moudle.pedometer.ui.widget.FivePersonIconView; 23 import com.cnlive.moudle.pedometer.ui.widget.FivePersonIconView;
  24 +import com.cnlive.moudle.pedometer.utils.StepUtil;
22 import com.example.moudle_pedometer.R; 25 import com.example.moudle_pedometer.R;
23 26
24 import java.util.ArrayList; 27 import java.util.ArrayList;
@@ -41,12 +44,20 @@ public class RunRaceDetailActivity extends QMUIFragmentActivity { @@ -41,12 +44,20 @@ public class RunRaceDetailActivity extends QMUIFragmentActivity {
41 protected void onCreate(Bundle savedInstanceState) { 44 protected void onCreate(Bundle savedInstanceState) {
42 super.onCreate(savedInstanceState); 45 super.onCreate(savedInstanceState);
43 StatusBarUtil2.setColor(this, getResources().getColor(R.color.run_main_bg), 0); 46 StatusBarUtil2.setColor(this, getResources().getColor(R.color.run_main_bg), 0);
44 - addFragment();  
45 - 47 + //判断用户是否结束运动
  48 + String uid = "yangshuai";
  49 + UserStepEntity userStepEntity = StepUtil.getUserStepData(getApplicationContext(), uid);
  50 + //没有在数据库中找到相关记录
  51 + if (userStepEntity == null) {
  52 + addFragment(new RunRaceDetailFragment());
  53 + }
  54 + //找到记录
  55 + else {
  56 + addFragment(new RunMainFragment());
  57 + }
46 } 58 }
47 59
48 - private void addFragment() {  
49 - QMUIFragment fragment = new RunRaceDetailFragment(); 60 + private void addFragment(QMUIFragment fragment) {
50 getSupportFragmentManager().beginTransaction() 61 getSupportFragmentManager().beginTransaction()
51 .add(getContextViewId(), fragment, fragment.getClass().getSimpleName()) 62 .add(getContextViewId(), fragment, fragment.getClass().getSimpleName())
52 .addToBackStack(fragment.getClass().getSimpleName()) 63 .addToBackStack(fragment.getClass().getSimpleName())
@@ -56,7 +67,7 @@ public class RunRaceDetailActivity extends QMUIFragmentActivity { @@ -56,7 +67,7 @@ public class RunRaceDetailActivity extends QMUIFragmentActivity {
56 @Override 67 @Override
57 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { 68 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
58 super.onActivityResult(requestCode, resultCode, data); 69 super.onActivityResult(requestCode, resultCode, data);
59 - if(resultCode == 1002){ 70 + if (resultCode == 1002) {
60 71
61 } 72 }
62 } 73 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/fragment/RunMainFragment.java
@@ -100,5 +100,4 @@ public class RunMainFragment extends QMUIFragment&lt;RunMainFragmentView, RunMainFr @@ -100,5 +100,4 @@ public class RunMainFragment extends QMUIFragment&lt;RunMainFragmentView, RunMainFr
100 } 100 }
101 } 101 }
102 } 102 }
103 -  
104 } 103 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/fragment/RunRaceDetailFragment.java
@@ -15,8 +15,11 @@ import android.widget.LinearLayout; @@ -15,8 +15,11 @@ import android.widget.LinearLayout;
15 import com.cnlive.libs.base.ui.QMUIFragment; 15 import com.cnlive.libs.base.ui.QMUIFragment;
16 import com.cnlive.moudle.pedometer.frame.presenter.RunRaceDetailFragmentPresenter; 16 import com.cnlive.moudle.pedometer.frame.presenter.RunRaceDetailFragmentPresenter;
17 import com.cnlive.moudle.pedometer.frame.view.RunRaceDetailFragmentView; 17 import com.cnlive.moudle.pedometer.frame.view.RunRaceDetailFragmentView;
  18 +import com.cnlive.moudle.pedometer.sql.entity.UserStepEntity;
18 import com.cnlive.moudle.pedometer.ui.widget.FivePersonIconView; 19 import com.cnlive.moudle.pedometer.ui.widget.FivePersonIconView;
  20 +import com.cnlive.moudle.pedometer.utils.ChineseToSpeechUtil;
19 import com.cnlive.moudle.pedometer.utils.ScreenUtil; 21 import com.cnlive.moudle.pedometer.utils.ScreenUtil;
  22 +import com.cnlive.moudle.pedometer.utils.StepUtil;
20 import com.example.moudle_pedometer.R; 23 import com.example.moudle_pedometer.R;
21 import com.example.moudle_pedometer.databinding.FragmentRunRaceDetailBinding; 24 import com.example.moudle_pedometer.databinding.FragmentRunRaceDetailBinding;
22 import com.sothree.slidinguppanel.SlidingUpPanelLayout; 25 import com.sothree.slidinguppanel.SlidingUpPanelLayout;
@@ -36,6 +39,7 @@ import static android.content.Context.SENSOR_SERVICE; @@ -36,6 +39,7 @@ import static android.content.Context.SENSOR_SERVICE;
36 public class RunRaceDetailFragment extends QMUIFragment<RunRaceDetailFragmentView, RunRaceDetailFragmentPresenter, FragmentRunRaceDetailBinding> { 39 public class RunRaceDetailFragment extends QMUIFragment<RunRaceDetailFragmentView, RunRaceDetailFragmentPresenter, FragmentRunRaceDetailBinding> {
37 private static final String TAG = "RunRaceDetailFragment"; 40 private static final String TAG = "RunRaceDetailFragment";
38 private SensorManager mSensorManager; 41 private SensorManager mSensorManager;
  42 +
39 @Override 43 @Override
40 protected int getToolbarId() { 44 protected int getToolbarId() {
41 return 0; 45 return 0;
@@ -54,12 +58,14 @@ public class RunRaceDetailFragment extends QMUIFragment&lt;RunRaceDetailFragmentVie @@ -54,12 +58,14 @@ public class RunRaceDetailFragment extends QMUIFragment&lt;RunRaceDetailFragmentVie
54 @Override 58 @Override
55 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 59 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
56 super.onViewCreated(view, savedInstanceState); 60 super.onViewCreated(view, savedInstanceState);
57 - mSensorManager = (SensorManager) getActivity().getSystemService(SENSOR_SERVICE);//获取传感器管理服务  
58 61
  62 + mSensorManager = (SensorManager) getActivity().getSystemService(SENSOR_SERVICE);//获取传感器管理服务
59 if (getMvpView() != null) { 63 if (getMvpView() != null) {
60 getMvpView().initView(); 64 getMvpView().initView();
61 } 65 }
  66 +
62 } 67 }
  68 +
63 @Override 69 @Override
64 public void onResume() { 70 public void onResume() {
65 super.onResume(); 71 super.onResume();
@@ -96,6 +102,7 @@ public class RunRaceDetailFragment extends QMUIFragment&lt;RunRaceDetailFragmentVie @@ -96,6 +102,7 @@ public class RunRaceDetailFragment extends QMUIFragment&lt;RunRaceDetailFragmentVie
96 if (getMvpView() != null) { 102 if (getMvpView() != null) {
97 getMvpView().onDestroy(); 103 getMvpView().onDestroy();
98 } 104 }
  105 +
99 } 106 }
100 // private void test() { 107 // private void test() {
101 // BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(getActivity()); 108 // BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(getActivity());
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/fragment/RunningMapFragment.java
1 package com.cnlive.moudle.pedometer.ui.fragment; 1 package com.cnlive.moudle.pedometer.ui.fragment;
2 2
  3 +import android.app.Service;
3 import android.content.Context; 4 import android.content.Context;
4 import android.hardware.Sensor; 5 import android.hardware.Sensor;
5 import android.hardware.SensorManager; 6 import android.hardware.SensorManager;
6 import android.os.Bundle; 7 import android.os.Bundle;
7 import android.os.Handler; 8 import android.os.Handler;
8 import android.os.SystemClock; 9 import android.os.SystemClock;
  10 +import android.os.Vibrator;
9 import android.support.annotation.Nullable; 11 import android.support.annotation.Nullable;
10 import android.text.TextUtils; 12 import android.text.TextUtils;
11 import android.util.Log; 13 import android.util.Log;
@@ -20,6 +22,8 @@ import com.cnlive.moudle.pedometer.model.RunningMapBean; @@ -20,6 +22,8 @@ import com.cnlive.moudle.pedometer.model.RunningMapBean;
20 import com.cnlive.moudle.pedometer.model.Constant; 22 import com.cnlive.moudle.pedometer.model.Constant;
21 import com.cnlive.moudle.pedometer.model.MessageEvent; 23 import com.cnlive.moudle.pedometer.model.MessageEvent;
22 import com.cnlive.moudle.pedometer.service.StepService; 24 import com.cnlive.moudle.pedometer.service.StepService;
  25 +import com.cnlive.moudle.pedometer.ui.widget.TipDialog;
  26 +import com.cnlive.moudle.pedometer.utils.ChineseToSpeechUtil;
23 import com.cnlive.moudle.pedometer.utils.GsonUtil; 27 import com.cnlive.moudle.pedometer.utils.GsonUtil;
24 import com.cnlive.moudle.pedometer.utils.MyMapUtil; 28 import com.cnlive.moudle.pedometer.utils.MyMapUtil;
25 import com.cnlive.moudle.pedometer.utils.MySpHelper; 29 import com.cnlive.moudle.pedometer.utils.MySpHelper;
@@ -46,6 +50,9 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run @@ -46,6 +50,9 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run
46 private RunningMapBean runningMapBean; 50 private RunningMapBean runningMapBean;
47 private SensorManager mSensorManager; 51 private SensorManager mSensorManager;
48 private String test = "[{\"latitude\":39.933889208848,\"latitudeE6\":3.9933889208848E7,\"longitude\":116.30900265517,\"longitudeE6\":1.1630900265517001E8},{\"latitude\":39.933868507347,\"latitudeE6\":3.9933868507347E7,\"longitude\":116.30865416508,\"longitudeE6\":1.1630865416508E8},{\"latitude\":39.934756505077,\"latitudeE6\":3.9934756505077E7,\"longitude\":116.30860516469,\"longitudeE6\":1.1630860516468999E8},{\"latitude\":39.934781620502,\"latitudeE6\":3.9934781620502E7,\"longitude\":116.30961013007,\"longitudeE6\":1.1630961013007E8},{\"latitude\":39.934881620374,\"latitudeE6\":3.9934881620374E7,\"longitude\":116.30960513008,\"longitudeE6\":1.1630960513008E8},{\"latitude\":39.934077623132,\"latitudeE6\":3.9934077623132E7,\"longitude\":116.30965812942,\"longitudeE6\":1.1630965812942E8},{\"latitude\":39.933972618463,\"latitudeE6\":3.9933972618463E7,\"longitude\":116.30962113087,\"longitudeE6\":1.1630962113087E8},{\"latitude\":39.933932608856,\"latitudeE6\":3.9933932608856E7,\"longitude\":116.30953913383,\"longitudeE6\":1.1630953913383E8},{\"latitude\":39.933903844942,\"latitudeE6\":3.9933903844942E7,\"longitude\":116.30918357649,\"longitudeE6\":1.1630918357649E8}]"; 52 private String test = "[{\"latitude\":39.933889208848,\"latitudeE6\":3.9933889208848E7,\"longitude\":116.30900265517,\"longitudeE6\":1.1630900265517001E8},{\"latitude\":39.933868507347,\"latitudeE6\":3.9933868507347E7,\"longitude\":116.30865416508,\"longitudeE6\":1.1630865416508E8},{\"latitude\":39.934756505077,\"latitudeE6\":3.9934756505077E7,\"longitude\":116.30860516469,\"longitudeE6\":1.1630860516468999E8},{\"latitude\":39.934781620502,\"latitudeE6\":3.9934781620502E7,\"longitude\":116.30961013007,\"longitudeE6\":1.1630961013007E8},{\"latitude\":39.934881620374,\"latitudeE6\":3.9934881620374E7,\"longitude\":116.30960513008,\"longitudeE6\":1.1630960513008E8},{\"latitude\":39.934077623132,\"latitudeE6\":3.9934077623132E7,\"longitude\":116.30965812942,\"longitudeE6\":1.1630965812942E8},{\"latitude\":39.933972618463,\"latitudeE6\":3.9933972618463E7,\"longitude\":116.30962113087,\"longitudeE6\":1.1630962113087E8},{\"latitude\":39.933932608856,\"latitudeE6\":3.9933932608856E7,\"longitude\":116.30953913383,\"longitudeE6\":1.1630953913383E8},{\"latitude\":39.933903844942,\"latitudeE6\":3.9933903844942E7,\"longitude\":116.30918357649,\"longitudeE6\":1.1630918357649E8}]";
  53 + //创建震动服务对象
  54 + private Vibrator mVibrator;
  55 + private TipDialog tipDialog;
49 56
50 @Override 57 @Override
51 protected int getToolbarId() { 58 protected int getToolbarId() {
@@ -82,7 +89,12 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run @@ -82,7 +89,12 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run
82 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 89 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
83 super.onViewCreated(view, savedInstanceState); 90 super.onViewCreated(view, savedInstanceState);
84 EventBus.getDefault().register(this); 91 EventBus.getDefault().register(this);
85 - mSensorManager = (SensorManager) getActivity().getSystemService(SENSOR_SERVICE);//获取传感器管理服务 92 + //获取传感器管理服务
  93 + mSensorManager = (SensorManager) getActivity().getSystemService(SENSOR_SERVICE);
  94 + //获取手机震动服务
  95 + mVibrator = (Vibrator) getActivity().getSystemService(Service.VIBRATOR_SERVICE);
  96 + //初始化提示框
  97 + initTipDialog();
86 List<LatLng> trackPoints = GsonUtil.jsonToList(test, LatLng.class); 98 List<LatLng> trackPoints = GsonUtil.jsonToList(test, LatLng.class);
87 if (getArguments() != null) { 99 if (getArguments() != null) {
88 runningMapBean = (RunningMapBean) getArguments().getSerializable("runningMapBean"); 100 runningMapBean = (RunningMapBean) getArguments().getSerializable("runningMapBean");
@@ -113,6 +125,7 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run @@ -113,6 +125,7 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run
113 getPresenter().queryHistoryTrace(getActivity(), StepService.entityName, startTime, endTime); 125 getPresenter().queryHistoryTrace(getActivity(), StepService.entityName, startTime, endTime);
114 //查询实时轨迹 126 //查询实时轨迹
115 getPresenter().queryRealTimeTrace(getActivity(), StepService.entityName, startTime); 127 getPresenter().queryRealTimeTrace(getActivity(), StepService.entityName, startTime);
  128 +
116 } 129 }
117 130
118 131
@@ -144,6 +157,8 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run @@ -144,6 +157,8 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run
144 //取消注册传感器监听 157 //取消注册传感器监听
145 mSensorManager.unregisterListener(getMvpView()); 158 mSensorManager.unregisterListener(getMvpView());
146 } 159 }
  160 + ChineseToSpeechUtil.destroy();
  161 +
147 } 162 }
148 163
149 @Override 164 @Override
@@ -152,6 +167,7 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run @@ -152,6 +167,7 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run
152 if (getMvpView() != null) { 167 if (getMvpView() != null) {
153 getMvpView().onPause(); 168 getMvpView().onPause();
154 } 169 }
  170 +
155 } 171 }
156 172
157 @Override 173 @Override
@@ -179,5 +195,32 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run @@ -179,5 +195,32 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run
179 getMvpView().resetSpeed(); 195 getMvpView().resetSpeed();
180 } 196 }
181 } 197 }
  198 + //超出范围
  199 + else if (messageEvent.getMessageType() == Constant.EXIT_RANGE) {
  200 + ChineseToSpeechUtil.speech(getActivity().getApplicationContext(), "您已偏离预定轨迹!");
  201 + if (mVibrator != null) {
  202 + //设置震动周期,数组表示时间:等待+执行,单位是毫秒,下面操作代表:等待100,执行100,等待100,执行1000,
  203 + //后面的数字如果为-1代表不重复,之执行一次,其他代表会重复,0代表从数组的第0个位置开始
  204 + mVibrator.vibrate(new long[]{100, 1000, 100, 1000}, -1);
  205 + }
  206 + if (tipDialog != null) {
  207 + tipDialog.show();
  208 + }
  209 + }
182 } 210 }
  211 +
  212 + private void initTipDialog() {
  213 + if (tipDialog == null) {
  214 + tipDialog = new TipDialog(getActivity(), "您已偏离预定轨迹!", "我知道了", R.color.green_round, new TipDialog.DialogInterface() {
  215 + @Override
  216 + public void onClick(TipDialog dialog) {
  217 + dialog.dismiss();
  218 + }
  219 + });
  220 + tipDialog.setCancelable(false);
  221 + tipDialog.setCanceledOnTouchOutside(false);
  222 + }
  223 + }
  224 +
  225 +
183 } 226 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/ButtonAnimUtil.java
@@ -21,106 +21,132 @@ public class ButtonAnimUtil { @@ -21,106 +21,132 @@ public class ButtonAnimUtil {
21 21
22 //设置控件放大动画 22 //设置控件放大动画
23 public static void setViewZoomIn(View view) { 23 public static void setViewZoomIn(View view) {
24 - AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画  
25 - ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1, 1.2f);  
26 - ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1, 1.2f);  
27 - animatorSetsuofang.setDuration(DEFAULT_ZOOM_DURATION);  
28 - animatorSetsuofang.setInterpolator(new DecelerateInterpolator());  
29 - animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始  
30 - animatorSetsuofang.start(); 24 + try {
  25 + AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画
  26 + ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1, 1.2f);
  27 + ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1, 1.2f);
  28 + animatorSetsuofang.setDuration(DEFAULT_ZOOM_DURATION);
  29 + animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
  30 + animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始
  31 + animatorSetsuofang.start();
  32 + } catch (Exception e) {
  33 + }
31 } 34 }
32 35
33 //设置控件缩小动画 36 //设置控件缩小动画
34 public static void setViewZoomOut(View view) { 37 public static void setViewZoomOut(View view) {
35 - AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画  
36 - ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1.2f, 1);  
37 - ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1.2f, 1);  
38 - animatorSetsuofang.setDuration(DEFAULT_ZOOM_DURATION);  
39 - animatorSetsuofang.setInterpolator(new DecelerateInterpolator());  
40 - animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始  
41 - animatorSetsuofang.start(); 38 + try {
  39 + AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画
  40 + ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1.2f, 1);
  41 + ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1.2f, 1);
  42 + animatorSetsuofang.setDuration(DEFAULT_ZOOM_DURATION);
  43 + animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
  44 + animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始
  45 + animatorSetsuofang.start();
  46 + } catch (Exception e) {
  47 + }
42 } 48 }
43 49
44 //设置控件缩小动画 50 //设置控件缩小动画
45 public static void setViewDefault(View view) { 51 public static void setViewDefault(View view) {
46 - AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画  
47 - ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1f, 1);  
48 - ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1f, 1);  
49 - animatorSetsuofang.setDuration(DEFAULT_ZOOM_DURATION);  
50 - animatorSetsuofang.setInterpolator(new DecelerateInterpolator());  
51 - animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始  
52 - animatorSetsuofang.start(); 52 + try {
  53 + AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画
  54 + ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1f, 1);
  55 + ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1f, 1);
  56 + animatorSetsuofang.setDuration(DEFAULT_ZOOM_DURATION);
  57 + animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
  58 + animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始
  59 + animatorSetsuofang.start();
  60 + } catch (Exception e) {
  61 + }
53 } 62 }
54 63
55 //设置控件显示放大动画 64 //设置控件显示放大动画
56 public static void setViewShowZoomIn(View view) { 65 public static void setViewShowZoomIn(View view) {
57 - AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画  
58 - ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 0, 1.2f);  
59 - ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 0, 1.2f);  
60 - animatorSetsuofang.setDuration(SHOW_VIEW_ZOOM_DURATION);  
61 - animatorSetsuofang.setInterpolator(new DecelerateInterpolator());  
62 - animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始  
63 - animatorSetsuofang.start();  
64 - new Handler().postDelayed(new Runnable() {  
65 - @Override  
66 - public void run() {  
67 - AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画  
68 - ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1.2f, 1);  
69 - ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1.2f, 1);  
70 - animatorSetsuofang.setDuration(SHOW_VIEW_ZOOM_DURATION);  
71 - animatorSetsuofang.setInterpolator(new DecelerateInterpolator());  
72 - animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始  
73 - animatorSetsuofang.start();  
74 - }  
75 - }, SHOW_VIEW_ZOOM_DURATION); 66 + try {
  67 + AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画
  68 + ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 0, 1.2f);
  69 + ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 0, 1.2f);
  70 + animatorSetsuofang.setDuration(SHOW_VIEW_ZOOM_DURATION);
  71 + animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
  72 + animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始
  73 + animatorSetsuofang.start();
  74 + new Handler().postDelayed(new Runnable() {
  75 + @Override
  76 + public void run() {
  77 + if (view == null) {
  78 + return;
  79 + }
  80 + AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画
  81 + ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1.2f, 1);
  82 + ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1.2f, 1);
  83 + animatorSetsuofang.setDuration(SHOW_VIEW_ZOOM_DURATION);
  84 + animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
  85 + animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始
  86 + animatorSetsuofang.start();
  87 + }
  88 + }, SHOW_VIEW_ZOOM_DURATION);
  89 + } catch (Exception e) {
  90 + }
76 } 91 }
77 92
78 //设置控件隐藏缩小动画 93 //设置控件隐藏缩小动画
79 public static void setViewHideZoomOut(View view) { 94 public static void setViewHideZoomOut(View view) {
80 - AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画  
81 - ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1, 0);  
82 - ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1, 0);  
83 - animatorSetsuofang.setDuration(HIDE_VIEW_ZOOM_DURATION);  
84 - animatorSetsuofang.setInterpolator(new DecelerateInterpolator());  
85 - animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始  
86 - animatorSetsuofang.start(); 95 + try {
  96 + AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画
  97 + ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1, 0);
  98 + ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1, 0);
  99 + animatorSetsuofang.setDuration(HIDE_VIEW_ZOOM_DURATION);
  100 + animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
  101 + animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始
  102 + animatorSetsuofang.start();
  103 + } catch (Exception e) {
  104 + }
87 } 105 }
88 106
89 //设置时间显示放大动画 107 //设置时间显示放大动画
90 public static void setTimeShowZoomIn(View view) { 108 public static void setTimeShowZoomIn(View view) {
91 - ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 0, 1.4f);  
92 - ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 0, 1.4f);  
93 - ObjectAnimator scaleX1 = ObjectAnimator.ofFloat(view, "scaleX", 1.4f, 1);  
94 - ObjectAnimator scaleY1 = ObjectAnimator.ofFloat(view, "scaleY", 1.4f, 1);  
95 - ObjectAnimator scaleX2 = ObjectAnimator.ofFloat(view, "scaleX", 1, 0);  
96 - ObjectAnimator scaleY2 = ObjectAnimator.ofFloat(view, "scaleY", 1, 0);  
97 - AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画  
98 - animatorSetsuofang.setDuration(100);  
99 - animatorSetsuofang.setInterpolator(new DecelerateInterpolator());  
100 - animatorSetsuofang.play(scaleX).with(scaleY);  
101 - animatorSetsuofang.start();  
102 - new Handler().postDelayed(new Runnable() {  
103 - @Override  
104 - public void run() {  
105 - AnimatorSet animatorSetsuofang2 = new AnimatorSet();//组合动画  
106 - animatorSetsuofang2.setDuration(100);  
107 - animatorSetsuofang2.setInterpolator(new DecelerateInterpolator());  
108 - animatorSetsuofang2.play(scaleX1).with(scaleY1);  
109 - animatorSetsuofang2.start();  
110 - }  
111 - }, 100);  
112 -  
113 - new Handler().postDelayed(new Runnable() {  
114 - @Override  
115 - public void run() {  
116 - AnimatorSet animatorSetsuofang3 = new AnimatorSet();//组合动画  
117 - animatorSetsuofang3.setDuration(10);  
118 - animatorSetsuofang3.setInterpolator(new DecelerateInterpolator());  
119 - animatorSetsuofang3.play(scaleX2).with(scaleY2);  
120 - animatorSetsuofang3.start();  
121 - }  
122 - }, 300); 109 + try {
  110 + ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 0, 1.4f);
  111 + ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 0, 1.4f);
  112 + ObjectAnimator scaleX1 = ObjectAnimator.ofFloat(view, "scaleX", 1.4f, 1);
  113 + ObjectAnimator scaleY1 = ObjectAnimator.ofFloat(view, "scaleY", 1.4f, 1);
  114 + ObjectAnimator scaleX2 = ObjectAnimator.ofFloat(view, "scaleX", 1, 0);
  115 + ObjectAnimator scaleY2 = ObjectAnimator.ofFloat(view, "scaleY", 1, 0);
  116 + AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画
  117 + animatorSetsuofang.setDuration(100);
  118 + animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
  119 + animatorSetsuofang.play(scaleX).with(scaleY);
  120 + animatorSetsuofang.start();
  121 + new Handler().postDelayed(new Runnable() {
  122 + @Override
  123 + public void run() {
  124 + if (view == null) {
  125 + return;
  126 + }
  127 + AnimatorSet animatorSetsuofang2 = new AnimatorSet();//组合动画
  128 + animatorSetsuofang2.setDuration(100);
  129 + animatorSetsuofang2.setInterpolator(new DecelerateInterpolator());
  130 + animatorSetsuofang2.play(scaleX1).with(scaleY1);
  131 + animatorSetsuofang2.start();
  132 + }
  133 + }, 100);
123 134
  135 + new Handler().postDelayed(new Runnable() {
  136 + @Override
  137 + public void run() {
  138 + if (view == null) {
  139 + return;
  140 + }
  141 + AnimatorSet animatorSetsuofang3 = new AnimatorSet();//组合动画
  142 + animatorSetsuofang3.setDuration(10);
  143 + animatorSetsuofang3.setInterpolator(new DecelerateInterpolator());
  144 + animatorSetsuofang3.play(scaleX2).with(scaleY2);
  145 + animatorSetsuofang3.start();
  146 + }
  147 + }, 300);
  148 + } catch (Exception e) {
  149 + }
124 } 150 }
125 151
126 152
@@ -131,46 +157,49 @@ public class ButtonAnimUtil { @@ -131,46 +157,49 @@ public class ButtonAnimUtil {
131 * @param closeFlag 157 * @param closeFlag
132 */ 158 */
133 public static void startAnimation(View view, boolean closeFlag) { 159 public static void startAnimation(View view, boolean closeFlag) {
134 - //因为CircularReveal动画是api21之后才有的,所以加个判断语句,免得崩溃  
135 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {  
136 - int cicular_R = view.getHeight() / 2 > view.getWidth() / 2 ? view.getHeight() / 2 : view.getWidth() / 2;  
137 - Animator animator = null;  
138 - if (!closeFlag) {  
139 - animator = ViewAnimationUtils.createCircularReveal(view, (int) view.getWidth() / 2, (int) view.getHeight() / 2, 0, cicular_R);  
140 - } else {  
141 - animator = ViewAnimationUtils.createCircularReveal(view, (int) view.getWidth() / 2, (int) view.getHeight() / 2, cicular_R, 0);  
142 - }  
143 - animator.addListener(new Animator.AnimatorListener() {  
144 - @Override  
145 - public void onAnimationStart(Animator animator) {  
146 - 160 + try {
  161 + //因为CircularReveal动画是api21之后才有的,所以加个判断语句,免得崩溃
  162 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  163 + int cicular_R = view.getHeight() / 2 > view.getWidth() / 2 ? view.getHeight() / 2 : view.getWidth() / 2;
  164 + Animator animator = null;
  165 + if (!closeFlag) {
  166 + animator = ViewAnimationUtils.createCircularReveal(view, (int) view.getWidth() / 2, (int) view.getHeight() / 2, 0, cicular_R);
  167 + } else {
  168 + animator = ViewAnimationUtils.createCircularReveal(view, (int) view.getWidth() / 2, (int) view.getHeight() / 2, cicular_R, 0);
147 } 169 }
  170 + animator.addListener(new Animator.AnimatorListener() {
  171 + @Override
  172 + public void onAnimationStart(Animator animator) {
148 173
149 - @Override  
150 - public void onAnimationEnd(Animator animator) {  
151 - if (closeFlag) {  
152 - view.setVisibility(View.GONE);  
153 } 174 }
154 - }  
155 175
156 - @Override  
157 - public void onAnimationCancel(Animator animator) { 176 + @Override
  177 + public void onAnimationEnd(Animator animator) {
  178 + if (closeFlag) {
  179 + view.setVisibility(View.GONE);
  180 + }
  181 + }
158 182
159 - } 183 + @Override
  184 + public void onAnimationCancel(Animator animator) {
160 185
161 - @Override  
162 - public void onAnimationRepeat(Animator animator) { 186 + }
  187 +
  188 + @Override
  189 + public void onAnimationRepeat(Animator animator) {
163 190
  191 + }
  192 + });
  193 + animator.setDuration(350);
  194 + animator.start();
  195 + } else {
  196 + if (closeFlag) {
  197 + view.setVisibility(View.GONE);
164 } 198 }
165 - });  
166 - animator.setDuration(350);  
167 - animator.start();  
168 - } else {  
169 - if (closeFlag) {  
170 - view.setVisibility(View.GONE);  
171 } 199 }
172 - }  
173 200
  201 + } catch (Exception e) {
  202 + }
174 } 203 }
175 204
176 } 205 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/ChineseToSpeechUtil.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.utils;
  2 +
  3 +import android.app.Application;
  4 +import android.content.Context;
  5 +import android.speech.tts.TextToSpeech;
  6 +
  7 +import java.util.Locale;
  8 +
  9 +public class ChineseToSpeechUtil {
  10 + private static TextToSpeech textToSpeech;
  11 +
  12 +
  13 + public static void speech(Context context, String text) {
  14 + if (textToSpeech == null) {
  15 + textToSpeech = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
  16 + @Override
  17 + public void onInit(int status) {
  18 + if (status == TextToSpeech.SUCCESS) {
  19 + int result = textToSpeech.setLanguage(Locale.CHINA);
  20 + if (result == TextToSpeech.LANG_MISSING_DATA
  21 + || result == TextToSpeech.LANG_NOT_SUPPORTED) {
  22 +// new CoolToast(Application.getContext()).show("不支持朗读功能");
  23 + } else {
  24 + // 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
  25 + textToSpeech.setPitch(1.0f);
  26 + // 设置语速
  27 + textToSpeech.setSpeechRate(1f);
  28 + textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null);
  29 + }
  30 + }
  31 + }
  32 + });
  33 + }else {
  34 + textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null);
  35 + }
  36 +
  37 +
  38 +
  39 + }
  40 +
  41 + public static void destroy() {
  42 + if (textToSpeech != null) {
  43 + textToSpeech.stop();
  44 + textToSpeech.shutdown();
  45 + textToSpeech=null;
  46 + }
  47 + }
  48 +
  49 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/MyMapUtil.java
@@ -13,7 +13,9 @@ import com.baidu.mapapi.map.PolylineOptions; @@ -13,7 +13,9 @@ import com.baidu.mapapi.map.PolylineOptions;
13 import com.baidu.mapapi.model.LatLng; 13 import com.baidu.mapapi.model.LatLng;
14 import com.baidu.mapapi.utils.DistanceUtil; 14 import com.baidu.mapapi.utils.DistanceUtil;
15 import com.baidu.trace.model.SortType; 15 import com.baidu.trace.model.SortType;
  16 +import com.cnlive.moudle.pedometer.model.RoutePoint;
16 17
  18 +import java.util.ArrayList;
17 import java.util.List; 19 import java.util.List;
18 20
19 /** 21 /**
@@ -35,16 +37,19 @@ public class MyMapUtil { @@ -35,16 +37,19 @@ public class MyMapUtil {
35 */ 37 */
36 public static Overlay drawHistoryTrack(Context context, BaiduMap baiduMap, List<LatLng> points, SortType sortType, int lineColor, int startIconRes, int endIconRes) { 38 public static Overlay drawHistoryTrack(Context context, BaiduMap baiduMap, List<LatLng> points, SortType sortType, int lineColor, int startIconRes, int endIconRes) {
37 // 绘制新覆盖物前,清空之前的覆盖物 39 // 绘制新覆盖物前,清空之前的覆盖物
38 - baiduMap.clear();  
39 if (points == null || points.size() == 0) { 40 if (points == null || points.size() == 0) {
40 return null; 41 return null;
41 } 42 }
42 //只有一个点 43 //只有一个点
43 if (points.size() == 1) { 44 if (points.size() == 1) {
44 - Bitmap pointBitmap = BitmapUtil.getBitmapFromDp(context, BitmapFactory.decodeResource(context.getResources(), startIconRes), 40, 40);  
45 - OverlayOptions startOptions = new MarkerOptions().position(points.get(0)).icon(BitmapDescriptorFactory.fromBitmap(pointBitmap)); 45 + if (startIconRes != 0) {
  46 + Bitmap pointBitmap = BitmapUtil.getBitmapFromDp(context, BitmapFactory.decodeResource(context.getResources(), startIconRes), 40, 40);
  47 + OverlayOptions startOptions = new MarkerOptions().position(points.get(0)).icon(BitmapDescriptorFactory.fromBitmap(pointBitmap));
46 // .zIndex(9).draggable(true); 48 // .zIndex(9).draggable(true);
47 - return baiduMap.addOverlay(startOptions); 49 + return baiduMap.addOverlay(startOptions);
  50 + } else {
  51 + return null;
  52 + }
48 } 53 }
49 54
50 LatLng startPoint; 55 LatLng startPoint;
@@ -58,22 +63,33 @@ public class MyMapUtil { @@ -58,22 +63,33 @@ public class MyMapUtil {
58 } 63 }
59 64
60 // 添加起点图标 65 // 添加起点图标
61 - Bitmap startPointBitmap = BitmapUtil.getBitmapFromDp(context, BitmapFactory.decodeResource(context.getResources(), startIconRes), 40, 40);  
62 - OverlayOptions startOptions = new MarkerOptions()  
63 - .position(startPoint).icon(BitmapDescriptorFactory.fromBitmap(startPointBitmap)); 66 + Bitmap startPointBitmap = null;
  67 + OverlayOptions startOptions = null;
  68 + if (startIconRes != 0) {
  69 + startPointBitmap = BitmapUtil.getBitmapFromDp(context, BitmapFactory.decodeResource(context.getResources(), startIconRes), 40, 40);
  70 + startOptions = new MarkerOptions().perspective(false).animateType(MarkerOptions.MarkerAnimateType.grow)
  71 + .position(startPoint).icon(BitmapDescriptorFactory.fromBitmap(startPointBitmap));
  72 + }
64 // .zIndex(9).draggable(true); 73 // .zIndex(9).draggable(true);
65 // 添加终点图标 74 // 添加终点图标
66 - Bitmap endPointBitmap = BitmapUtil.getBitmapFromDp(context, BitmapFactory.decodeResource(context.getResources(), endIconRes), 40, 40);  
67 - OverlayOptions endOptions = new MarkerOptions().position(endPoint)  
68 - .icon(BitmapDescriptorFactory.fromBitmap(endPointBitmap)); 75 + Bitmap endPointBitmap = null;
  76 + OverlayOptions endOptions = null;
  77 + if (endIconRes != 0) {
  78 + endPointBitmap = BitmapUtil.getBitmapFromDp(context, BitmapFactory.decodeResource(context.getResources(), endIconRes), 40, 40);
  79 + endOptions = new MarkerOptions().position(endPoint).perspective(false).animateType(MarkerOptions.MarkerAnimateType.grow)
  80 + .icon(BitmapDescriptorFactory.fromBitmap(endPointBitmap));
  81 + }
69 // .zIndex(9).draggable(true); 82 // .zIndex(9).draggable(true);
70 83
71 // 添加路线(轨迹) 84 // 添加路线(轨迹)
72 OverlayOptions polylineOptions = new PolylineOptions().width(10) 85 OverlayOptions polylineOptions = new PolylineOptions().width(10)
73 .color(context.getResources().getColor(lineColor)).points(points); 86 .color(context.getResources().getColor(lineColor)).points(points);
74 -  
75 - baiduMap.addOverlay(startOptions);  
76 - baiduMap.addOverlay(endOptions); 87 + if (startOptions != null) {
  88 + baiduMap.addOverlay(startOptions);
  89 + }
  90 + if (endOptions != null) {
  91 + baiduMap.addOverlay(endOptions);
  92 + }
77 return baiduMap.addOverlay(polylineOptions); 93 return baiduMap.addOverlay(polylineOptions);
78 } 94 }
79 95
@@ -82,7 +98,6 @@ public class MyMapUtil { @@ -82,7 +98,6 @@ public class MyMapUtil {
82 */ 98 */
83 public static Overlay drawServerLineTrack(Context context, BaiduMap baiduMap, List<LatLng> points, SortType sortType, int lineColor, int startIconRes, int endIconRes) { 99 public static Overlay drawServerLineTrack(Context context, BaiduMap baiduMap, List<LatLng> points, SortType sortType, int lineColor, int startIconRes, int endIconRes) {
84 // 绘制新覆盖物前,清空之前的覆盖物 100 // 绘制新覆盖物前,清空之前的覆盖物
85 - baiduMap.clear();  
86 if (points == null || points.size() == 0) { 101 if (points == null || points.size() == 0) {
87 return null; 102 return null;
88 } 103 }
@@ -107,12 +122,19 @@ public class MyMapUtil { @@ -107,12 +122,19 @@ public class MyMapUtil {
107 // 添加起点图标 122 // 添加起点图标
108 Bitmap startPointBitmap = BitmapUtil.getBitmapFromDp(context, BitmapFactory.decodeResource(context.getResources(), startIconRes), 40, 40); 123 Bitmap startPointBitmap = BitmapUtil.getBitmapFromDp(context, BitmapFactory.decodeResource(context.getResources(), startIconRes), 40, 40);
109 OverlayOptions startOptions = new MarkerOptions() 124 OverlayOptions startOptions = new MarkerOptions()
110 - .position(startPoint).icon(BitmapDescriptorFactory.fromBitmap(startPointBitmap)); 125 + .position(startPoint)
  126 + .icon(BitmapDescriptorFactory.fromBitmap(startPointBitmap))
  127 + .perspective(false)
  128 + .animateType(MarkerOptions.MarkerAnimateType.grow)
  129 + ;
111 // .zIndex(9).draggable(true); 130 // .zIndex(9).draggable(true);
112 // 添加终点图标 131 // 添加终点图标
113 Bitmap endPointBitmap = BitmapUtil.getBitmapFromDp(context, BitmapFactory.decodeResource(context.getResources(), endIconRes), 40, 40); 132 Bitmap endPointBitmap = BitmapUtil.getBitmapFromDp(context, BitmapFactory.decodeResource(context.getResources(), endIconRes), 40, 40);
114 - OverlayOptions endOptions = new MarkerOptions().position(endPoint)  
115 - .icon(BitmapDescriptorFactory.fromBitmap(endPointBitmap)); 133 + OverlayOptions endOptions = new MarkerOptions()
  134 + .position(endPoint)
  135 + .icon(BitmapDescriptorFactory.fromBitmap(endPointBitmap))
  136 + .perspective(false)
  137 + .animateType(MarkerOptions.MarkerAnimateType.grow);
116 // .zIndex(9).draggable(true); 138 // .zIndex(9).draggable(true);
117 139
118 // 添加路线(轨迹) 140 // 添加路线(轨迹)
@@ -131,6 +153,18 @@ public class MyMapUtil { @@ -131,6 +153,18 @@ public class MyMapUtil {
131 return baiduMap.addOverlay(polylineOptions); 153 return baiduMap.addOverlay(polylineOptions);
132 } 154 }
133 155
  156 + public static Overlay drawMapLineRoutePoint(Context context, BaiduMap baiduMap, List<RoutePoint> points, int lineColor) {
  157 + List<LatLng> latLngs = new ArrayList<>();
  158 + for (RoutePoint routePoint : points) {
  159 + if (routePoint != null && routePoint.getLat() != 0 && routePoint.getLng() != 0) {
  160 + latLngs.add(new LatLng(routePoint.getLat(), routePoint.getLng()));
  161 + }
  162 + }
  163 + OverlayOptions polylineOptions = new PolylineOptions().width(10)
  164 + .color(context.getResources().getColor(lineColor)).points(latLngs);
  165 + return baiduMap.addOverlay(polylineOptions);
  166 + }
  167 +
134 public static double pi = 3.1415926535897932384626; 168 public static double pi = 3.1415926535897932384626;
135 public static double a = 6378245.0; 169 public static double a = 6378245.0;
136 public static double ee = 0.00669342162296594323; 170 public static double ee = 0.00669342162296594323;
@@ -257,7 +291,6 @@ public class MyMapUtil { @@ -257,7 +291,6 @@ public class MyMapUtil {
257 } 291 }
258 292
259 293
260 -  
261 /*****************************************************地理围栏***************************************************************/ 294 /*****************************************************地理围栏***************************************************************/
262 /** 295 /**
263 * 地球半径 296 * 地球半径
@@ -437,36 +470,38 @@ public class MyMapUtil { @@ -437,36 +470,38 @@ public class MyMapUtil {
437 /** 470 /**
438 * luming 471 * luming
439 * 点到边的最短距离 472 * 点到边的最短距离
  473 + *
440 * @param pointP 474 * @param pointP
441 * @param pointA 475 * @param pointA
442 * @param pointB 476 * @param pointB
443 * @return 477 * @return
444 */ 478 */
445 - public static double minDistanceToLine(LatLng pointP, LatLng pointA, LatLng pointB){  
446 - double pa = getDistance(pointP,pointA);  
447 - double pb = getDistance(pointP,pointB);  
448 - double ab = getDistance(pointA,pointB); 479 + public static double minDistanceToLine(LatLng pointP, LatLng pointA, LatLng pointB) {
  480 + double pa = getDistance(pointP, pointA);
  481 + double pb = getDistance(pointP, pointB);
  482 + double ab = getDistance(pointA, pointB);
449 483
450 - if((Math.pow(pa,2) + Math.pow(ab,2)) <= Math.pow(pb,2) ){ 484 + if ((Math.pow(pa, 2) + Math.pow(ab, 2)) <= Math.pow(pb, 2)) {
451 return pa; 485 return pa;
452 } 486 }
453 - if((Math.pow(pb,2) + Math.pow(ab,2)) <= Math.pow(pa,2) ){ 487 + if ((Math.pow(pb, 2) + Math.pow(ab, 2)) <= Math.pow(pa, 2)) {
454 return pb; 488 return pb;
455 } 489 }
456 490
457 - double p = (pa + pb + ab) / 2 ;  
458 - double s = Math.sqrt(p*(p-pa)*(p-pb)*(p-ab)); 491 + double p = (pa + pb + ab) / 2;
  492 + double s = Math.sqrt(p * (p - pa) * (p - pb) * (p - ab));
459 493
460 - return (2*s/ab); 494 + return (2 * s / ab);
461 } 495 }
462 496
463 /** 497 /**
464 * 通过经纬度获取距离(单位:米) 498 * 通过经纬度获取距离(单位:米)
  499 + *
465 * @param location1 500 * @param location1
466 * @param location2 501 * @param location2
467 * @return 502 * @return
468 */ 503 */
469 - public static double getDistance(LatLng location1,LatLng location2) { 504 + public static double getDistance(LatLng location1, LatLng location2) {
470 double lat1 = location1.latitude; 505 double lat1 = location1.latitude;
471 double lat2 = location2.latitude; 506 double lat2 = location2.latitude;
472 double lng1 = location1.longitude; 507 double lng1 = location1.longitude;
@@ -480,7 +515,67 @@ public class MyMapUtil { @@ -480,7 +515,67 @@ public class MyMapUtil {
480 * Math.pow(Math.sin(b / 2), 2))); 515 * Math.pow(Math.sin(b / 2), 2)));
481 s = s * EARTH_RADIUS; 516 s = s * EARTH_RADIUS;
482 s = Math.round(s * 10000d) / 10000d; 517 s = Math.round(s * 10000d) / 10000d;
483 - s = s*1000; 518 + s = s * 1000;
484 return s; 519 return s;
485 } 520 }
  521 +
  522 +
  523 + /**
  524 + * 地图平滑算法
  525 + *
  526 + * @param inPoint
  527 + * @return
  528 + */
  529 + public static List<RoutePoint> optimizePoints(List<RoutePoint> inPoint) {
  530 + int size = inPoint.size();
  531 + List<RoutePoint> outPoint;
  532 +
  533 + int i;
  534 + if (size < 5) {
  535 + return inPoint;
  536 + } else {
  537 + // Latitude
  538 + inPoint.get(0)
  539 + .setLat((3.0 * inPoint.get(0).getLat() + 2.0
  540 + * inPoint.get(1).getLat() + inPoint.get(2).getLat() - inPoint
  541 + .get(4).getLat()) / 5.0);
  542 + inPoint.get(1)
  543 + .setLat((4.0 * inPoint.get(0).getLat() + 3.0
  544 + * inPoint.get(1).getLat() + 2
  545 + * inPoint.get(2).getLat() + inPoint.get(3).getLat()) / 10.0);
  546 +
  547 + inPoint.get(size - 2).setLat(
  548 + (4.0 * inPoint.get(size - 1).getLat() + 3.0
  549 + * inPoint.get(size - 2).getLat() + 2
  550 + * inPoint.get(size - 3).getLat() + inPoint.get(
  551 + size - 4).getLat()) / 10.0);
  552 + inPoint.get(size - 1).setLat(
  553 + (3.0 * inPoint.get(size - 1).getLat() + 2.0
  554 + * inPoint.get(size - 2).getLat()
  555 + + inPoint.get(size - 3).getLat() - inPoint.get(
  556 + size - 5).getLat()) / 5.0);
  557 +
  558 + // Longitude
  559 + inPoint.get(0)
  560 + .setLng((3.0 * inPoint.get(0).getLng() + 2.0
  561 + * inPoint.get(1).getLng() + inPoint.get(2).getLng() - inPoint
  562 + .get(4).getLng()) / 5.0);
  563 + inPoint.get(1)
  564 + .setLng((4.0 * inPoint.get(0).getLng() + 3.0
  565 + * inPoint.get(1).getLng() + 2
  566 + * inPoint.get(2).getLng() + inPoint.get(3).getLng()) / 10.0);
  567 +
  568 + inPoint.get(size - 2).setLng(
  569 + (4.0 * inPoint.get(size - 1).getLng() + 3.0
  570 + * inPoint.get(size - 2).getLng() + 2
  571 + * inPoint.get(size - 3).getLng() + inPoint.get(
  572 + size - 4).getLng()) / 10.0);
  573 + inPoint.get(size - 1).setLng(
  574 + (3.0 * inPoint.get(size - 1).getLng() + 2.0
  575 + * inPoint.get(size - 2).getLng()
  576 + + inPoint.get(size - 3).getLng() - inPoint.get(
  577 + size - 5).getLng()) / 5.0);
  578 + }
  579 + return inPoint;
  580 + }
486 } 581 }
moudle_pedometer/src/main/res/drawable-hdpi/icon_end.png 0 → 100644

6.57 KB

moudle_pedometer/src/main/res/drawable-hdpi/icon_end.webp deleted 100644 → 0
No preview for this file type
moudle_pedometer/src/main/res/drawable-hdpi/icon_start.png 0 → 100644

5.93 KB

moudle_pedometer/src/main/res/drawable-hdpi/icon_start.webp deleted 100644 → 0
No preview for this file type
moudle_pedometer/src/main/res/layout/fragment_run_main.xml
@@ -138,7 +138,7 @@ @@ -138,7 +138,7 @@
138 android:layout_height="wrap_content" 138 android:layout_height="wrap_content"
139 android:layout_marginTop="5dp" 139 android:layout_marginTop="5dp"
140 android:gravity="center" 140 android:gravity="center"
141 - android:text="速" 141 + android:text="速"
142 android:textColor="@color/text_gray" 142 android:textColor="@color/text_gray"
143 android:textSize="17sp" 143 android:textSize="17sp"
144 android:textStyle="bold" /> 144 android:textStyle="bold" />
@@ -205,7 +205,7 @@ @@ -205,7 +205,7 @@
205 android:layout_height="wrap_content" 205 android:layout_height="wrap_content"
206 android:layout_marginTop="5dp" 206 android:layout_marginTop="5dp"
207 android:gravity="center" 207 android:gravity="center"
208 - android:text="步" 208 + android:text="步"
209 android:textColor="@color/text_gray" 209 android:textColor="@color/text_gray"
210 android:textSize="17sp" 210 android:textSize="17sp"
211 android:textStyle="bold" /> 211 android:textStyle="bold" />
moudle_pedometer/src/main/res/layout/layout_finish_running_route.xml
@@ -48,6 +48,7 @@ @@ -48,6 +48,7 @@
48 android:textSize="14sp" /> 48 android:textSize="14sp" />
49 49
50 <TextView 50 <TextView
  51 + android:id="@+id/tv_start_point"
51 android:layout_width="wrap_content" 52 android:layout_width="wrap_content"
52 android:layout_height="wrap_content" 53 android:layout_height="wrap_content"
53 android:layout_marginLeft="10dp" 54 android:layout_marginLeft="10dp"
@@ -84,6 +85,7 @@ @@ -84,6 +85,7 @@
84 android:textSize="14sp" /> 85 android:textSize="14sp" />
85 86
86 <TextView 87 <TextView
  88 + android:id="@+id/tv_end_point"
87 android:layout_width="wrap_content" 89 android:layout_width="wrap_content"
88 android:layout_height="wrap_content" 90 android:layout_height="wrap_content"
89 android:layout_marginLeft="10dp" 91 android:layout_marginLeft="10dp"
@@ -102,7 +104,7 @@ @@ -102,7 +104,7 @@
102 <LinearLayout 104 <LinearLayout
103 android:layout_width="match_parent" 105 android:layout_width="match_parent"
104 android:layout_height="wrap_content" 106 android:layout_height="wrap_content"
105 - android:layout_marginTop="-17dp" 107 + android:layout_marginTop="-15dp"
106 android:gravity="center_vertical"> 108 android:gravity="center_vertical">
107 109
108 <View 110 <View
@@ -117,6 +119,7 @@ @@ -117,6 +119,7 @@
117 android:orientation="vertical"> 119 android:orientation="vertical">
118 120
119 <TextView 121 <TextView
  122 + android:id="@+id/tv_timer"
120 android:layout_width="wrap_content" 123 android:layout_width="wrap_content"
121 android:layout_height="wrap_content" 124 android:layout_height="wrap_content"
122 android:layout_marginLeft="10dp" 125 android:layout_marginLeft="10dp"
@@ -128,7 +131,7 @@ @@ -128,7 +131,7 @@
128 <TextView 131 <TextView
129 android:layout_width="wrap_content" 132 android:layout_width="wrap_content"
130 android:layout_height="wrap_content" 133 android:layout_height="wrap_content"
131 - android:layout_marginLeft="10dp" 134 + android:layout_marginLeft="11dp"
132 android:text="跑步记录时长" 135 android:text="跑步记录时长"
133 android:textColor="@color/text_gray" 136 android:textColor="@color/text_gray"
134 android:textSize="12sp" /> 137 android:textSize="12sp" />
moudle_pedometer/src/main/res/layout/layout_finish_step.xml
@@ -28,10 +28,11 @@ @@ -28,10 +28,11 @@
28 <LinearLayout 28 <LinearLayout
29 android:layout_width="match_parent" 29 android:layout_width="match_parent"
30 android:layout_height="match_parent" 30 android:layout_height="match_parent"
31 - android:paddingBottom="10dp"  
32 - android:gravity="center"> 31 + android:gravity="center"
  32 + android:paddingBottom="10dp">
33 33
34 <TextView 34 <TextView
  35 + android:id="@+id/tv_step"
35 android:layout_width="wrap_content" 36 android:layout_width="wrap_content"
36 android:layout_height="wrap_content" 37 android:layout_height="wrap_content"
37 android:text="1233" 38 android:text="1233"
moudle_pedometer/src/main/res/layout/layout_finish_user_info.xml
@@ -13,6 +13,7 @@ @@ -13,6 +13,7 @@
13 android:orientation="vertical"> 13 android:orientation="vertical">
14 14
15 <TextView 15 <TextView
  16 + android:id="@+id/tv_user_nickName"
16 android:layout_width="wrap_content" 17 android:layout_width="wrap_content"
17 android:layout_height="wrap_content" 18 android:layout_height="wrap_content"
18 android:layout_marginLeft="80dp" 19 android:layout_marginLeft="80dp"
@@ -33,6 +34,7 @@ @@ -33,6 +34,7 @@
33 android:orientation="vertical"> 34 android:orientation="vertical">
34 35
35 <TextView 36 <TextView
  37 + android:id="@+id/tv_street_name"
36 android:layout_width="wrap_content" 38 android:layout_width="wrap_content"
37 android:layout_height="wrap_content" 39 android:layout_height="wrap_content"
38 android:layout_marginLeft="15dp" 40 android:layout_marginLeft="15dp"
@@ -42,6 +44,7 @@ @@ -42,6 +44,7 @@
42 android:textSize="15sp" /> 44 android:textSize="15sp" />
43 45
44 <TextView 46 <TextView
  47 + android:id="@+id/tv_date"
45 android:layout_width="wrap_content" 48 android:layout_width="wrap_content"
46 android:layout_height="wrap_content" 49 android:layout_height="wrap_content"
47 android:layout_marginLeft="15dp" 50 android:layout_marginLeft="15dp"
@@ -57,6 +60,7 @@ @@ -57,6 +60,7 @@
57 android:gravity="right|bottom"> 60 android:gravity="right|bottom">
58 61
59 <TextView 62 <TextView
  63 + android:id="@+id/tv_distance"
60 android:layout_width="wrap_content" 64 android:layout_width="wrap_content"
61 android:layout_height="wrap_content" 65 android:layout_height="wrap_content"
62 android:layout_marginRight="10dp" 66 android:layout_marginRight="10dp"
@@ -95,6 +99,7 @@ @@ -95,6 +99,7 @@
95 android:orientation="vertical"> 99 android:orientation="vertical">
96 100
97 <TextView 101 <TextView
  102 + android:id="@+id/tv_speed"
98 android:layout_width="wrap_content" 103 android:layout_width="wrap_content"
99 android:layout_height="wrap_content" 104 android:layout_height="wrap_content"
100 android:text="34'33''" 105 android:text="34'33''"
@@ -119,6 +124,7 @@ @@ -119,6 +124,7 @@
119 android:orientation="vertical"> 124 android:orientation="vertical">
120 125
121 <TextView 126 <TextView
  127 + android:id="@+id/tv_timer"
122 android:layout_width="wrap_content" 128 android:layout_width="wrap_content"
123 android:layout_height="wrap_content" 129 android:layout_height="wrap_content"
124 android:text="00:00:00" 130 android:text="00:00:00"
@@ -140,7 +146,7 @@ @@ -140,7 +146,7 @@
140 </LinearLayout> 146 </LinearLayout>
141 147
142 <com.qmuiteam.qmui.widget.QMUIRadiusImageView 148 <com.qmuiteam.qmui.widget.QMUIRadiusImageView
143 - android:id="@+id/qm_iv1" 149 + android:id="@+id/qm_iv_icon"
144 android:layout_width="60dp" 150 android:layout_width="60dp"
145 android:layout_height="60dp" 151 android:layout_height="60dp"
146 android:layout_marginLeft="10dp" 152 android:layout_marginLeft="10dp"
moudle_pedometer/src/main/res/values/strings.xml
@@ -44,5 +44,8 @@ @@ -44,5 +44,8 @@
44 <string name="layout_run_detail_rank_person_finish">人已完成</string> 44 <string name="layout_run_detail_rank_person_finish">人已完成</string>
45 <string name="layout_run_detail_street_introduce_title">路线介绍</string> 45 <string name="layout_run_detail_street_introduce_title">路线介绍</string>
46 <string name="layout_run_detail_street_introduce_map">路线地图</string> 46 <string name="layout_run_detail_street_introduce_map">路线地图</string>
  47 + <string name="loc_check_internet">定位失败,请您检查您的网络状态!</string>
  48 + <string name="loc_open_gps">定位失败,建议您打开GPS!</string>
  49 + <string name="loc_open_wifi">定位失败,建议您打开Wi-Fi!</string>
47 <!----> 50 <!---->
48 </resources> 51 </resources>