Commit 7ea646bdca48097203f6365be9eee0b71ea74c33

Authored by 韩亚云
2 parents 0c5306b6 36fd6257

Merge branch 'master' of bj.gitlab.cnlive.com:cnlive-team/ModulePedometer

moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/commonInfo/CommonInfo.java
... ... @@ -276,11 +276,31 @@ public class CommonInfo {
276 276 return MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).getBoolean("IsFirstShowTimeTip", true);
277 277 }
278 278  
  279 + /**
  280 + * 是否暂停
  281 + *
  282 + * @param context
  283 + * @param isAllow
  284 + */
  285 + public static void setIsPauseState(Context context, boolean isAllow) {
  286 + MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).putBoolean("runIsPauseState", isAllow);
  287 + }
  288 +
  289 + /**
  290 + * 获取是否暂停
  291 + *
  292 + * @param context
  293 + */
  294 + public static boolean getIsPause(Context context) {
  295 + return MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).getBoolean("runIsPauseState", false);
  296 + }
279 297  
280 298 /*重置
281 299 * @param context
282 300 */
283 301 public static void reset(Context context) {
  302 +
  303 + MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("IsFirstShowTimeTip");
284 304 MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("writeUserStep");
285 305 MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("runStepService");
286 306 MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("KeepAliveService");
... ... @@ -295,6 +315,7 @@ public class CommonInfo {
295 315 * @param context
296 316 */
297 317 public static void resetRace(Context context) {
  318 + MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("IsFirstShowTimeTip");
298 319 MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("writeUserStep");
299 320 MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("runStepService");
300 321 MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("KeepAliveService");
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/presenter/RunningMapFragmentPresenter.java
... ... @@ -69,6 +69,7 @@ import com.cnlive.moudle.pedometer.utils.CommonUtil;
69 69 import com.cnlive.moudle.pedometer.utils.GsonUtil;
70 70 import com.cnlive.moudle.pedometer.utils.MapUtil;
71 71 import com.cnlive.moudle.pedometer.utils.MyMapUtil;
  72 +import com.cnlive.moudle.pedometer.utils.StepUtil;
72 73 import com.example.moudle_pedometer.R;
73 74 import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
74 75  
... ... @@ -105,144 +106,169 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter<RunningMapFrag
105 106 /**
106 107 * 轨迹点集合
107 108 */
108   - private List<LatLng> trackPoints;
109 109 private List<LatLng> realTimePoints;
110 110 private String imports = "[{\"latitude\":39.93395837223,\"latitudeE6\":3.993395837223E7,\"longitude\":116.30855458458,\"longitudeE6\":1.1630855458457999E8},{\"latitude\":39.93396326228,\"latitudeE6\":3.993396326228E7,\"longitude\":116.30861833018,\"longitudeE6\":1.1630861833017999E8},{\"latitude\":39.934156956749995,\"latitudeE6\":3.993415695675E7,\"longitude\":116.30869672329999,\"longitudeE6\":1.163086967233E8},{\"latitude\":39.934220163784,\"latitudeE6\":3.9934220163784E7,\"longitude\":116.3087100148,\"longitudeE6\":1.163087100148E8},{\"latitude\":39.934285263072,\"latitudeE6\":3.9934285263072E7,\"longitude\":116.30866498582,\"longitudeE6\":1.1630866498582E8},{\"latitude\":39.934351994321,\"latitudeE6\":3.9934351994320996E7,\"longitude\":116.30865820422,\"longitudeE6\":1.1630865820422E8},{\"latitude\":39.934393506188,\"latitudeE6\":3.9934393506188005E7,\"longitude\":116.3087268324,\"longitudeE6\":1.163087268324E8},{\"latitude\":39.934515310648,\"latitudeE6\":3.9934515310648E7,\"longitude\":116.30877023341,\"longitudeE6\":1.1630877023341E8},{\"latitude\":39.934576888398,\"latitudeE6\":3.9934576888398E7,\"longitude\":116.30876860572,\"longitudeE6\":1.1630876860572E8},{\"latitude\":39.934641987882,\"latitudeE6\":3.9934641987882E7,\"longitude\":116.30872520428,\"longitudeE6\":1.1630872520427999E8},{\"latitude\":39.934720386354,\"latitudeE6\":3.9934720386354E7,\"longitude\":116.30874175083,\"longitudeE6\":1.1630874175083E8},{\"latitude\":39.934703845843,\"latitudeE6\":3.9934703845843E7,\"longitude\":116.30880197017,\"longitudeE6\":1.1630880197016999E8},{\"latitude\":39.934719055573,\"latitudeE6\":3.9934719055573E7,\"longitude\":116.30896553874,\"longitudeE6\":1.1630896553874E8},{\"latitude\":39.93482461107,\"latitudeE6\":3.993482461107E7,\"longitude\":116.30924466304002,\"longitudeE6\":1.1630924466304001E8},{\"latitude\":39.934804821527,\"latitudeE6\":3.9934804821527004E7,\"longitude\":116.30935804892,\"longitudeE6\":1.1630935804892E8},{\"latitude\":39.934856643274,\"latitudeE6\":3.9934856643274E7,\"longitude\":116.30943996874,\"longitudeE6\":1.1630943996874E8},{\"latitude\":39.934844987999,\"latitudeE6\":3.9934844987999E7,\"longitude\":116.30952026112,\"longitudeE6\":1.1630952026112E8},{\"latitude\":39.934722121282,\"latitudeE6\":3.9934722121282004E7,\"longitude\":116.30967542086,\"longitudeE6\":1.1630967542086E8},{\"latitude\":39.934828721701,\"latitudeE6\":3.9934828721701E7,\"longitude\":116.30960516489,\"longitudeE6\":1.1630960516489E8},{\"latitude\":39.934408798988,\"latitudeE6\":3.9934408798988E7,\"longitude\":116.30961357453,\"longitudeE6\":1.1630961357453E8},{\"latitude\":39.934345321571,\"latitudeE6\":3.9934345321571E7,\"longitude\":116.30960842073,\"longitudeE6\":1.1630960842073E8},{\"latitude\":39.93436159016,\"latitudeE6\":3.9934361590160005E7,\"longitude\":116.30954331882,\"longitudeE6\":1.1630954331882E8},{\"latitude\":39.934295133241,\"latitudeE6\":3.9934295133241E7,\"longitude\":116.30957668364,\"longitudeE6\":1.1630957668364E8},{\"latitude\":39.934188525341,\"latitudeE6\":3.9934188525341E7,\"longitude\":116.30958183769,\"longitudeE6\":1.1630958183769001E8},{\"latitude\":39.933976660469,\"latitudeE6\":3.9933976660469E7,\"longitude\":116.30954494693,\"longitudeE6\":1.1630954494693E8},{\"latitude\":39.933993190121,\"latitudeE6\":3.9933993190121E7,\"longitude\":116.30939114375,\"longitudeE6\":1.1630939114375001E8},{\"latitude\":39.933938115564,\"latitudeE6\":3.9933938115563996E7,\"longitude\":116.30932956832,\"longitudeE6\":1.1630932956831999E8},{\"latitude\":39.933916130555,\"latitudeE6\":3.9933916130555E7,\"longitude\":116.30922269279,\"longitudeE6\":1.1630922269279E8},{\"latitude\":39.933836097011,\"latitudeE6\":3.9933836097011E7,\"longitude\":116.30914077307,\"longitudeE6\":1.1630914077307E8}]\n";
111 111 private HashMap<Integer, Boolean> importHash;
112 112 private static int matchIndex = 0;
113 113  
114   - /**
115   - * 查询历史轨迹
116   - *
117   - * @param startTime
118   - * @param endTime
119   - */
120   - public void queryHistoryTrace(Context context, String entityName, long startTime, long endTime) {
121   - Log.e(TAG, "queryHistoryTrace: 时间:" + startTime);
122   - importHash = new HashMap<>();
123   - matchIndex = 0;
124   - //打的重要点
125   - List<LatLng> importPoints = GsonUtil.jsonToList(imports, LatLng.class);
126   - for (int i = 0; i < importPoints.size(); i++) {
127   - if (i % 3 != 0) {
128   - importPoints.remove(i);
129   - }
130   - }
131   -
132   - for (int i = 0; i < importPoints.size(); i++) {
133   - importHash.put(i, false);
134   - }
135   -
136   - if (historyTrackRequest == null) {
137   - historyTrackRequest = new HistoryTrackRequest(tag, Constant.SERVICE_ID, entityName);
138   - //设置查询设备名称
139   - historyTrackRequest.setEntityName(entityName);
140   - //历史轨迹开始时间
141   - historyTrackRequest.setStartTime(startTime);
142   - //历史轨迹结束时间
143   - historyTrackRequest.setEndTime(endTime);
144   - //分页索引
145   - historyTrackRequest.setPageIndex(pageIndex);
146   - //分页大小
147   - historyTrackRequest.setPageSize(pageSize);
148   - //设置是否进行纠偏
149   - historyTrackRequest.setProcessed(true);
150   - //设置返回坐标系
151   - historyTrackRequest.setCoordTypeOutput(CoordType.gcj02);
152   - //其他设置
153   - ProcessOption processOption = new ProcessOption();
154   - //去噪:可设置是否需要去除角度、速度和方向异常的轨迹点
155   - processOption.setNeedDenoise(true);
156   - //绑路:设置是否将轨迹点绑定至路网道路
157   - processOption.setNeedMapMatch(false);
158   - //抽稀:设置是否进行抽稀处理,对冗余的轨迹点进行抽稀去除处理,如一条直线上除起终点外的多个轨迹点
159   - processOption.setNeedVacuate(true);
160   - //自动判断交通方式
161   - processOption.setTransportMode(TransportMode.walking);
162   - // 设置精度过滤值(定位精度大于100米的过滤掉)
163   - processOption.setRadiusThreshold(9);
164   - // 设置纠偏选项
165   - historyTrackRequest.setProcessOption(processOption);
166   - // 设置里程填充方式为驾车
167   - historyTrackRequest.setSupplementMode(SupplementMode.walking);
168   -
169   - }
170   - //创建里程查询
171   - if (distanceRequest == null) {
172   - // 创建里程查询请求实例
173   - distanceRequest = new DistanceRequest(tag, Constant.SERVICE_ID, entityName);
174   - // 设置开始时间
175   - distanceRequest.setStartTime(startTime);
176   - // 设置结束时间
177   - distanceRequest.setEndTime(endTime);
178   - // 设置需要纠偏
179   - distanceRequest.setProcessed(true);
180   -
181   - // 创建纠偏选项实例
182   - ProcessOption processOption = new ProcessOption();
183   - // 设置需要去噪
184   - processOption.setNeedDenoise(true);
185   - // 设置需要绑路
186   - processOption.setNeedMapMatch(false);
187   - //抽稀:设置是否进行抽稀处理,对冗余的轨迹点进行抽稀去除处理,如一条直线上除起终点外的多个轨迹点
188   - processOption.setNeedVacuate(true);
189   - // 设置精度过滤值(定位精度大于100米的过滤掉)
190   - processOption.setRadiusThreshold(9);
191   - // 设置交通方式为不行
192   - processOption.setTransportMode(TransportMode.walking);
193   - // 设置纠偏选项
194   - distanceRequest.setProcessOption(processOption);
195   - // 设置里程填充方式为步行
196   - distanceRequest.setSupplementMode(SupplementMode.walking);
197   -
198   - }
199   - if (trackPoints == null) {
200   - trackPoints = new ArrayList<>();
201   - }
202   - //轨迹查询监听器
203   - OnTrackListener historyTrackListener = new OnTrackListener() {
204   - @Override
205   - public void onHistoryTrackCallback(HistoryTrackResponse response) {
206   - super.onHistoryTrackCallback(response);
207   - int total = response.getTotal();
208   -
209   - if (StatusCodes.SUCCESS != response.getStatus()) {
210   - Toast.makeText(context, "获取轨迹失败!" + response.getStatus(), Toast.LENGTH_SHORT).show();
211   - } else if (0 == total) {
212   - Toast.makeText(context, "暂未查到您的轨迹,请稍后重试!", Toast.LENGTH_SHORT).show();
213   - } else {
214   - //查询到轨迹
215   - List<TrackPoint> points = response.getTrackPoints();
216   - if (null != points) {
217   - for (TrackPoint trackPoint : points) {
218   - if (!CommonUtil.isZeroPoint(trackPoint.getLocation().getLatitude(),
219   - trackPoint.getLocation().getLongitude())) {
220   - //将轨迹点转换为地图坐标点
221   - trackPoints.add(MyMapUtil.convertTrace2Map(trackPoint.getLocation()));
222   - }
223   - }
224   - }
225   - }
226   - if (total > pageSize * pageIndex) {
227   - historyTrackRequest.setPageIndex(++pageIndex);
228   - queryHistoryTrace(context, entityName, startTime, endTime);
229   - } else {
230   - if (getView() != null) {
231   - if (trackPoints.size() == 1) {
232   - getView().setHistoryLastPoint(trackPoints.get(0));
233   - } else if (trackPoints.size() > 1) {
234   - getView().setHistoryLastPoint(trackPoints.get(trackPoints.size() - 1));
235   - }
236   - //开始比较(杨帅的思路)
237   -// for (int i = 0; i < trackPoints.size(); i++) {
238   -// if (matchIndex < importPoints.size() - 1) {
239   -// LatLng matchLatLng = importPoints.get(matchIndex);
240   -// LatLng historyLatLng = trackPoints.get(i);
241   -// Log.e(TAG, "距离: " + DistanceUtil.getDistance(matchLatLng, historyLatLng));
242   -// double distance = DistanceUtil.getDistance(matchLatLng, historyLatLng);
243   -// if (distance < 200) {
244   -// importHash.put(matchIndex, true);
245   -// matchIndex++;
  114 +// /**
  115 +// * 查询历史轨迹
  116 +// *
  117 +// * @param startTime
  118 +// * @param endTime
  119 +// */
  120 +// public void queryHistoryTrace(Context context, String entityName, long startTime, long endTime) {
  121 +// Log.e(TAG, "queryHistoryTrace: 时间:" + startTime);
  122 +// importHash = new HashMap<>();
  123 +// matchIndex = 0;
  124 +// //打的重要点
  125 +// List<LatLng> importPoints = GsonUtil.jsonToList(imports, LatLng.class);
  126 +// for (int i = 0; i < importPoints.size(); i++) {
  127 +// if (i % 3 != 0) {
  128 +// importPoints.remove(i);
  129 +// }
  130 +// }
  131 +//
  132 +// for (int i = 0; i < importPoints.size(); i++) {
  133 +// importHash.put(i, false);
  134 +// }
  135 +//
  136 +// if (historyTrackRequest == null) {
  137 +// historyTrackRequest = new HistoryTrackRequest(tag, Constant.SERVICE_ID, entityName);
  138 +// //设置查询设备名称
  139 +// historyTrackRequest.setEntityName(entityName);
  140 +// //历史轨迹开始时间
  141 +// historyTrackRequest.setStartTime(startTime);
  142 +// //历史轨迹结束时间
  143 +// historyTrackRequest.setEndTime(endTime);
  144 +// //分页索引
  145 +// historyTrackRequest.setPageIndex(pageIndex);
  146 +// //分页大小
  147 +// historyTrackRequest.setPageSize(pageSize);
  148 +// //设置是否进行纠偏
  149 +// historyTrackRequest.setProcessed(true);
  150 +// //设置返回坐标系
  151 +// historyTrackRequest.setCoordTypeOutput(CoordType.gcj02);
  152 +// //其他设置
  153 +// ProcessOption processOption = new ProcessOption();
  154 +// //去噪:可设置是否需要去除角度、速度和方向异常的轨迹点
  155 +// processOption.setNeedDenoise(true);
  156 +// //绑路:设置是否将轨迹点绑定至路网道路
  157 +// processOption.setNeedMapMatch(false);
  158 +// //抽稀:设置是否进行抽稀处理,对冗余的轨迹点进行抽稀去除处理,如一条直线上除起终点外的多个轨迹点
  159 +// processOption.setNeedVacuate(true);
  160 +// //自动判断交通方式
  161 +// processOption.setTransportMode(TransportMode.walking);
  162 +// // 设置精度过滤值(定位精度大于100米的过滤掉)
  163 +// processOption.setRadiusThreshold(9);
  164 +// // 设置纠偏选项
  165 +// historyTrackRequest.setProcessOption(processOption);
  166 +// // 设置里程填充方式为驾车
  167 +// historyTrackRequest.setSupplementMode(SupplementMode.walking);
  168 +//
  169 +// }
  170 +// //创建里程查询
  171 +// if (distanceRequest == null) {
  172 +// // 创建里程查询请求实例
  173 +// distanceRequest = new DistanceRequest(tag, Constant.SERVICE_ID, entityName);
  174 +// // 设置开始时间
  175 +// distanceRequest.setStartTime(startTime);
  176 +// // 设置结束时间
  177 +// distanceRequest.setEndTime(endTime);
  178 +// // 设置需要纠偏
  179 +// distanceRequest.setProcessed(true);
  180 +//
  181 +// // 创建纠偏选项实例
  182 +// ProcessOption processOption = new ProcessOption();
  183 +// // 设置需要去噪
  184 +// processOption.setNeedDenoise(true);
  185 +// // 设置需要绑路
  186 +// processOption.setNeedMapMatch(false);
  187 +// //抽稀:设置是否进行抽稀处理,对冗余的轨迹点进行抽稀去除处理,如一条直线上除起终点外的多个轨迹点
  188 +// processOption.setNeedVacuate(true);
  189 +// // 设置精度过滤值(定位精度大于100米的过滤掉)
  190 +// processOption.setRadiusThreshold(9);
  191 +// // 设置交通方式为不行
  192 +// processOption.setTransportMode(TransportMode.walking);
  193 +// // 设置纠偏选项
  194 +// distanceRequest.setProcessOption(processOption);
  195 +// // 设置里程填充方式为步行
  196 +// distanceRequest.setSupplementMode(SupplementMode.walking);
  197 +//
  198 +// }
  199 +// if (trackPoints == null) {
  200 +// trackPoints = new ArrayList<>();
  201 +// }
  202 +// //轨迹查询监听器
  203 +// OnTrackListener historyTrackListener = new OnTrackListener() {
  204 +// @Override
  205 +// public void onHistoryTrackCallback(HistoryTrackResponse response) {
  206 +// super.onHistoryTrackCallback(response);
  207 +// int total = response.getTotal();
  208 +//
  209 +// if (StatusCodes.SUCCESS != response.getStatus()) {
  210 +// Toast.makeText(context, "获取轨迹失败!" + response.getStatus(), Toast.LENGTH_SHORT).show();
  211 +// } else if (0 == total) {
  212 +// Toast.makeText(context, "暂未查到您的轨迹,请稍后重试!", Toast.LENGTH_SHORT).show();
  213 +// } else {
  214 +// //查询到轨迹
  215 +// List<TrackPoint> points = response.getTrackPoints();
  216 +// if (null != points) {
  217 +// for (TrackPoint trackPoint : points) {
  218 +// if (!CommonUtil.isZeroPoint(trackPoint.getLocation().getLatitude(),
  219 +// trackPoint.getLocation().getLongitude())) {
  220 +// //将轨迹点转换为地图坐标点
  221 +// trackPoints.add(MyMapUtil.convertTrace2Map(trackPoint.getLocation()));
  222 +// }
  223 +// }
  224 +// }
  225 +// }
  226 +// if (total > pageSize * pageIndex) {
  227 +// historyTrackRequest.setPageIndex(++pageIndex);
  228 +// queryHistoryTrace(context, entityName, startTime, endTime);
  229 +// } else {
  230 +// if (getView() != null) {
  231 +// if (trackPoints.size() == 1) {
  232 +// getView().setHistoryLastPoint(trackPoints.get(0));
  233 +// } else if (trackPoints.size() > 1) {
  234 +// getView().setHistoryLastPoint(trackPoints.get(trackPoints.size() - 1));
  235 +// }
  236 +// //开始比较(杨帅的思路)
  237 +//// for (int i = 0; i < trackPoints.size(); i++) {
  238 +//// if (matchIndex < importPoints.size() - 1) {
  239 +//// LatLng matchLatLng = importPoints.get(matchIndex);
  240 +//// LatLng historyLatLng = trackPoints.get(i);
  241 +//// Log.e(TAG, "距离: " + DistanceUtil.getDistance(matchLatLng, historyLatLng));
  242 +//// double distance = DistanceUtil.getDistance(matchLatLng, historyLatLng);
  243 +//// if (distance < 200) {
  244 +//// importHash.put(matchIndex, true);
  245 +//// matchIndex++;
  246 +//// }
  247 +//// }
  248 +//// }
  249 +//// //输出
  250 +//// int result = 0;
  251 +//// for (int i = 0; i < importHash.size(); i++) {
  252 +//// if (!importHash.get(i)) {
  253 +//// result++;
  254 +//// Log.e(TAG, "onHistoryTrackCallback: 没过:" + i + importHash.get(i));
  255 +//// }
  256 +//// }
  257 +//// if (result > importPoints.size() * 0.4) {
  258 +//// Toast.makeText(context, "没有完成", Toast.LENGTH_LONG).show();
  259 +////
  260 +//// } else {
  261 +//// Toast.makeText(context, "已完成", Toast.LENGTH_LONG).show();
  262 +//// }
  263 +// //郭瑞鹏的思路
  264 +// int index = 0;
  265 +// for (int i = 0; i < importPoints.size(); i++) {
  266 +// LatLng importLatLng = importPoints.get(i);
  267 +// for (int j = index; j < trackPoints.size(); j++) {
  268 +// double distance = DistanceUtil.getDistance(importLatLng, trackPoints.get(j));
  269 +// if (distance < 50) {
  270 +// importHash.put(i, true);
  271 +// index = j;
246 272 // }
247 273 // }
248 274 // }
... ... @@ -251,7 +277,7 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter&lt;RunningMapFrag
251 277 // for (int i = 0; i < importHash.size(); i++) {
252 278 // if (!importHash.get(i)) {
253 279 // result++;
254   -// Log.e(TAG, "onHistoryTrackCallback: 没过:" + i + importHash.get(i));
  280 +//// Log.e(TAG, "onHistoryTrackCallback: 没过:" + i + importHash.get(i));
255 281 // }
256 282 // }
257 283 // if (result > importPoints.size() * 0.4) {
... ... @@ -260,134 +286,71 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter&lt;RunningMapFrag
260 286 // } else {
261 287 // Toast.makeText(context, "已完成", Toast.LENGTH_LONG).show();
262 288 // }
263   - //郭瑞鹏的思路
264   - int index = 0;
265   - for (int i = 0; i < importPoints.size(); i++) {
266   - LatLng importLatLng = importPoints.get(i);
267   - for (int j = index; j < trackPoints.size(); j++) {
268   - double distance = DistanceUtil.getDistance(importLatLng, trackPoints.get(j));
269   - if (distance < 50) {
270   - importHash.put(i, true);
271   - index = j;
272   - }
273   - }
274   - }
275   - //输出
276   - int result = 0;
277   - for (int i = 0; i < importHash.size(); i++) {
278   - if (!importHash.get(i)) {
279   - result++;
280   -// Log.e(TAG, "onHistoryTrackCallback: 没过:" + i + importHash.get(i));
281   - }
282   - }
283   - if (result > importPoints.size() * 0.4) {
284   - Toast.makeText(context, "没有完成", Toast.LENGTH_LONG).show();
  289 +// Log.e(TAG, "结果: " + result);
  290 +// Log.e(TAG, "onHistoryTrackCallback: 轨迹点:" + trackPoints.size() + ",详情" + GsonUtil.GsonString(trackPoints));
  291 +//
  292 +// MyMapUtil.drawHistoryTrack(context, getView().baiduMap, trackPoints, SortType.asc, R.color.red, R.drawable.icon_start, R.drawable.icon_end);
  293 +//// MyMapUtil.drawMapLineRoutePoint(context, getView().baiduMap, MyMapUtil.optimizePoints(routePoints), R.color.red);
  294 +// }
  295 +// }
  296 +// }
  297 +//
  298 +// @Override
  299 +// public void onDistanceCallback(DistanceResponse distanceResponse) {
  300 +// super.onDistanceCallback(distanceResponse);
  301 +//// Toast.makeText(context, "查询的里程数:" + (int) distanceResponse.getDistance() + "米", Toast.LENGTH_SHORT).show();
  302 +// Log.e(TAG, "onDistanceCallback: " + distanceResponse.getDistance());
  303 +// }
  304 +// };
  305 +// //开始查询历史轨迹
  306 +// if (StepService.mClient != null) {
  307 +// StepService.mClient.queryHistoryTrack(historyTrackRequest, historyTrackListener);
  308 +// // 查询里程
  309 +// StepService.mClient.queryDistance(distanceRequest, historyTrackListener);
  310 +// }
  311 +//
  312 +// }
  313 +
285 314  
286   - } else {
287   - Toast.makeText(context, "已完成", Toast.LENGTH_LONG).show();
  315 + /**
  316 + * 查询历史轨迹
  317 + *
  318 + * @param startTime
  319 + * @param endTime
  320 + */
  321 + public void queryHistoryTrace(Context context, String entityName, long startTime, long endTime) {
  322 + Log.e(TAG, "queryHistoryTrace: 时间:" + startTime);
  323 + //打的重要点
  324 + List<LatLng> importPoints = GsonUtil.jsonToList(imports, LatLng.class);
  325 + MyMapUtil.queryHistoryTrace(context, StepService.mClient, entityName, startTime, endTime, new MyMapUtil.CallBack() {
  326 + @Override
  327 + public void success(List<LatLng> resultPoints) {
  328 + if (resultPoints != null&&resultPoints.size()>1) {
  329 + if (getView() != null && resultPoints != null) {
  330 + if (resultPoints.size() == 1) {
  331 + getView().setHistoryLastPoint(resultPoints.get(0));
  332 + } else if (resultPoints.size() > 1) {
  333 + getView().setHistoryLastPoint(resultPoints.get(resultPoints.size() - 1));
288 334 }
289   - Log.e(TAG, "结果: " + result);
290   - Log.e(TAG, "onHistoryTrackCallback: 轨迹点:" + trackPoints.size() + ",详情" + GsonUtil.GsonString(trackPoints));
  335 + if (importPoints != null && resultPoints != null) {
  336 + boolean isFinish = MyMapUtil.checkIsFinishTrace(importPoints, resultPoints, 0.6);
  337 + if (isFinish) {
  338 + Toast.makeText(context, "已完成", Toast.LENGTH_LONG).show();
  339 +
  340 + } else {
  341 + Toast.makeText(context, "没有完成", Toast.LENGTH_LONG).show();
291 342  
292   - MyMapUtil.drawHistoryTrack(context, getView().baiduMap, trackPoints, SortType.asc, R.color.red, R.drawable.icon_start, R.drawable.icon_end);
293   -// MyMapUtil.drawMapLineRoutePoint(context, getView().baiduMap, MyMapUtil.optimizePoints(routePoints), R.color.red);
  343 + }
  344 + MyMapUtil.drawHistoryTrack(context, getView().baiduMap, resultPoints, SortType.asc, R.color.red, R.drawable.icon_start, R.drawable.icon_end);
  345 + }
294 346 }
295 347 }
296 348 }
297   -
298   - @Override
299   - public void onDistanceCallback(DistanceResponse distanceResponse) {
300   - super.onDistanceCallback(distanceResponse);
301   -// Toast.makeText(context, "查询的里程数:" + (int) distanceResponse.getDistance() + "米", Toast.LENGTH_SHORT).show();
302   - Log.e(TAG, "onDistanceCallback: " + distanceResponse.getDistance());
303   - }
304   - };
305   - //开始查询历史轨迹
306   - if (StepService.mClient != null) {
307   - StepService.mClient.queryHistoryTrack(historyTrackRequest, historyTrackListener);
308   - // 查询里程
309   - StepService.mClient.queryDistance(distanceRequest, historyTrackListener);
310   - }
  349 + });
311 350  
312 351 }
313 352  
314 353  
315   - public void queryRealTimeTrace(Context context, String entityName, long activeTime) {
316   - if (realTimeListRequest == null) {
317   - List<String> names = new ArrayList<>();
318   - names.add(entityName);
319   - realTimeListRequest = new LocRequest();
320   - realTimeListRequest.setServiceId(Constant.SERVICE_ID);
321   - realTimeListRequest.setTag(1);
322   - }
323   - if (realTimePoints == null) {
324   - realTimePoints = new ArrayList<>();
325   - }
326   -
327   - OnEntityListener onEntityListener = new OnEntityListener() {
328   - Overlay realTimeOverlay = null;
329   -
330   - @Override
331   - public void onEntityListCallback(EntityListResponse entityListResponse) {
332   - super.onEntityListCallback(entityListResponse);
333   - Log.e(TAG, "onEntityListCallback");
334   -// Toast.makeText(context, "onEntityListCallback", Toast.LENGTH_SHORT).show();
335   - }
336   -
337   - @Override
338   - public void onSearchEntityCallback(SearchResponse searchResponse) {
339   - super.onSearchEntityCallback(searchResponse);
340   - Log.e(TAG, "onSearchEntityCallback");
341   - Toast.makeText(context, "onSearchEntityCallback", Toast.LENGTH_SHORT).show();
342   -
343   - }
344   -
345   - @Override
346   - public void onBoundSearchCallback(BoundSearchResponse boundSearchResponse) {
347   - super.onBoundSearchCallback(boundSearchResponse);
348   - Log.e(TAG, "onBoundSearchCallback");
349   - Toast.makeText(context, "onBoundSearchCallback", Toast.LENGTH_SHORT).show();
350   -
351   - }
352   -
353   - @Override
354   - public void onAroundSearchCallback(AroundSearchResponse aroundSearchResponse) {
355   - super.onAroundSearchCallback(aroundSearchResponse);
356   - Log.e(TAG, "onAroundSearchCallback");
357   - Toast.makeText(context, "onAroundSearchCallback", Toast.LENGTH_SHORT).show();
358   -
359   - }
360   -
361   - @Override
362   - public void onPolygonSearchCallback(PolygonSearchResponse polygonSearchResponse) {
363   - super.onPolygonSearchCallback(polygonSearchResponse);
364   - Log.e(TAG, "onPolygonSearchCallback");
365   - Toast.makeText(context, "onPolygonSearchCallback", Toast.LENGTH_SHORT).show();
366   - }
367   -
368   - @Override
369   - public void onDistrictSearchCallback(DistrictSearchResponse districtSearchResponse) {
370   - super.onDistrictSearchCallback(districtSearchResponse);
371   - Log.e(TAG, "onDistrictSearchCallback");
372   - Toast.makeText(context, "onDistrictSearchCallback", Toast.LENGTH_SHORT).show();
373   -
374   - }
375   -
376   - /**实时定位回调接口
377   - * @param traceLocation
378   - */
379   - @Override
380   - public void onReceiveLocation(TraceLocation traceLocation) {
381   - super.onReceiveLocation(traceLocation);
382   - }
383   - };
384   - //查询实时轨迹
385   - if (StepService.mClient != null) {
386   - StepService.mClient.queryRealTimeLoc(realTimeListRequest, onEntityListener);
387   - }
388   -
389   - }
390   -
391 354 //创建地理围栏
392 355 public void createFence(Context context, List<com.baidu.trace.model.LatLng> latLngs) {
393 356 CreateFenceRequest createFenceRequest = null;
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/view/RunMainFragmentView.java
... ... @@ -116,6 +116,7 @@ public class RunMainFragmentView implements MvpView {
116 116 * 初始化相关视图
117 117 */
118 118 public void initView() {
  119 + Log.e(TAG, "initView: +时间" + SystemClock.elapsedRealtime());
119 120 uid = CommonInfo.getUserId(getContext());
120 121 initLocationClient();
121 122 fragment.binding.llRunMainRoot.setVisibility(View.GONE);
... ... @@ -149,6 +150,8 @@ public class RunMainFragmentView implements MvpView {
149 150 fragment.binding.chronometer.setFormat("00:00:01");
150 151 fragment.binding.chronometer.setBase(SystemClock.elapsedRealtime());
151 152 fragment.binding.chronometer.start();
  153 + //设置计步开始时间
  154 + StepUtil.setChronometerBase(getContext(), uid, fragment.binding.chronometer.getBase());
152 155 }
153 156 }
154 157 }, 10);
... ... @@ -194,11 +197,30 @@ public class RunMainFragmentView implements MvpView {
194 197 if (firstTimeFlag) {
195 198 firstTimeFlag = false;
196 199 if (userStepEntity != null) {
197   - if ((userStepEntity.getPauseTimeStamp() != 0) && (userStepEntity.getRecordTime() != 0)) {
198   - fragment.binding.chronometer.setBase(userStepEntity.getPauseTimeStamp() + (SystemClock.elapsedRealtime() - userStepEntity.getRecordTime()));
199   - } else {
200   - fragment.binding.chronometer.setFormat("00:00:01");
201   - fragment.binding.chronometer.setBase(SystemClock.elapsedRealtime());
  200 + //判断显示时间
  201 + boolean isPasue = CommonInfo.getIsPause(getContext());
  202 + Log.e(TAG, "run: 是否暂停" + isPasue);
  203 + //如果暂停则从暂停那一刻开始
  204 + if (isPasue) {
  205 + if ((userStepEntity.getPauseTimeStamp() != 0) && (userStepEntity.getRecordTime() != 0)) {
  206 + fragment.binding.chronometer.setBase(userStepEntity.getPauseTimeStamp() + (SystemClock.elapsedRealtime() - userStepEntity.getRecordTime()));
  207 + } else {
  208 + fragment.binding.chronometer.setFormat("00:00:01");
  209 + fragment.binding.chronometer.setBase(SystemClock.elapsedRealtime());
  210 + }
  211 + //因为进来以后就运动了,所以需要改变状态
  212 + CommonInfo.setIsPauseState(getContext(), false);
  213 + //重新设置开始时间
  214 + userStepEntity.setChronometerBase(fragment.binding.chronometer.getBase());
  215 + }
  216 + //没有暂停,从初始时间开始
  217 + else {
  218 + if (userStepEntity.getChronometerBase() != 0) {
  219 + fragment.binding.chronometer.setBase(userStepEntity.getChronometerBase());
  220 + } else {
  221 + fragment.binding.chronometer.setFormat("00:00:01");
  222 + fragment.binding.chronometer.setBase(SystemClock.elapsedRealtime());
  223 + }
202 224 }
203 225 //设置步数
204 226 if (!TextUtils.isEmpty(userStepEntity.getStepCount())) {
... ... @@ -237,6 +259,8 @@ public class RunMainFragmentView implements MvpView {
237 259 fragment.binding.flContinue.setOnClickListener(new View.OnClickListener() {
238 260 @Override
239 261 public void onClick(View view) {
  262 + //设置继续标志
  263 + CommonInfo.setIsPauseState(getContext(), false);
240 264 //继续记录轨迹
241 265 if (StepService.mClient != null && StepService.traceListener != null) {
242 266 CommonInfo.setTsRunBaiduTraceService(getContext(), true);
... ... @@ -371,13 +395,15 @@ public class RunMainFragmentView implements MvpView {
371 395 fragment.binding.flPause.setOnClickListener(new View.OnClickListener() {
372 396 @Override
373 397 public void onClick(View view) {
  398 + //将当前计时器时间戳写入数据库
  399 + setSQLPauseTime(uid);
  400 + //设置暂停标志
  401 + CommonInfo.setIsPauseState(getContext(), true);
374 402 //暂停轨迹记录
375 403 if (StepService.mClient != null && StepService.traceListener != null) {
376 404 CommonInfo.setTsRunBaiduTraceService(getContext(), false);
377 405 StepService.mClient.stopGather(StepService.traceListener);
378 406 }
379   - //将当前计时器时间戳写入数据库
380   - setSQLPauseTime(uid);
381 407 needWriteDataFlag = false;
382 408 ButtonAnimUtil.setViewHideZoomOut(fragment.binding.llPause);
383 409 handler.postDelayed(new Runnable() {
... ... @@ -468,37 +494,39 @@ public class RunMainFragmentView implements MvpView {
468 494 }
469 495  
470 496 public void setSQLPauseTime(String id) {
471   - if (needWriteDataFlag) {
  497 + Log.e(TAG, "setSQLPauseTime: " );
  498 +// if (needWriteDataFlag) {
472 499 //将当前计时器时间戳写入数据库
473   -// String id = MySpHelper.getInstance(getContext(), Context.MODE_MULTI_PROCESS).getString("userId", "");
474 500 if (!TextUtils.isEmpty(id)) {
475 501 UserStepEntity userStepEntity = StepUtil.getUserStepData(fragment.getActivity(), uid);
476 502 if (userStepEntity != null) {
477 503 userStepEntity.setPauseTimeStamp(fragment.binding.chronometer.getBase());
478 504 //设置当前暂停的时间戳
479 505 userStepEntity.setRecordTime(SystemClock.elapsedRealtime());
  506 + //设置当前用户暂停的时间戳
  507 + userStepEntity.setUserPauseTimeStamp(TimeUtil.getNowTimeStamp());
480 508 //设置暂停次数
481 509 userStepEntity.setPauseCount(userStepEntity.getPauseCount() + 1);
482 510 //更新数据
483 511 StepUtil.updateStepData(fragment.getActivity(), userStepEntity);
484 512 }
485 513 }
486   - }
  514 +// }
487 515 }
488 516  
489   - public void setFragmentPauseTime(String id) {
490   - if (!TextUtils.isEmpty(id)) {
491   - UserStepEntity userStepEntity = StepUtil.getUserStepData(fragment.getActivity(), uid);
492   - if (userStepEntity != null) {
493   - userStepEntity.setPauseTimeStamp(fragment.binding.chronometer.getBase());
494   - userStepEntity.setRecordTime(SystemClock.elapsedRealtime());
495   - //设置当前暂停的时间戳
496   - userStepEntity.setUserPauseTimeStamp(TimeUtil.getNowTimeStamp());
497   - //更新数据
498   - StepUtil.updateStepData(fragment.getActivity(), userStepEntity);
499   - }
500   - }
501   - }
  517 +// public void setFragmentPauseTime(String id) {
  518 +// if (!TextUtils.isEmpty(id)) {
  519 +// UserStepEntity userStepEntity = StepUtil.getUserStepData(fragment.getActivity(), uid);
  520 +// if (userStepEntity != null) {
  521 +// userStepEntity.setPauseTimeStamp(fragment.binding.chronometer.getBase());
  522 +// userStepEntity.setRecordTime(SystemClock.elapsedRealtime());
  523 +// //设置当前暂停的时间戳
  524 +// userStepEntity.setUserPauseTimeStamp(TimeUtil.getNowTimeStamp());
  525 +// //更新数据
  526 +// StepUtil.updateStepData(fragment.getActivity(), userStepEntity);
  527 +// }
  528 +// }
  529 +// }
502 530  
503 531  
504 532 /**
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/view/RunRaceDetailFragmentView.java
... ... @@ -8,6 +8,7 @@ import android.hardware.Sensor;
8 8 import android.hardware.SensorEvent;
9 9 import android.hardware.SensorEventListener;
10 10 import android.hardware.SensorManager;
  11 +import android.os.SystemClock;
11 12 import android.support.v4.content.ContextCompat;
12 13 import android.text.TextUtils;
13 14 import android.util.Log;
... ... @@ -24,6 +25,7 @@ import com.baidu.mapapi.map.BaiduMap;
24 25 import com.baidu.mapapi.map.BitmapDescriptor;
25 26 import com.baidu.mapapi.map.BitmapDescriptorFactory;
26 27 import com.baidu.mapapi.map.MapStatus;
  28 +import com.baidu.mapapi.map.MapStatusUpdate;
27 29 import com.baidu.mapapi.map.MapStatusUpdateFactory;
28 30 import com.baidu.mapapi.map.MapView;
29 31 import com.baidu.mapapi.map.MarkerOptions;
... ... @@ -34,6 +36,7 @@ import com.baidu.mapapi.map.OverlayOptions;
34 36 import com.baidu.mapapi.map.PolylineOptions;
35 37 import com.baidu.mapapi.map.UiSettings;
36 38 import com.baidu.mapapi.model.LatLng;
  39 +import com.baidu.mapapi.model.LatLngBounds;
37 40 import com.baidu.mapapi.search.core.SearchResult;
38 41 import com.baidu.mapapi.search.route.BikingRouteResult;
39 42 import com.baidu.mapapi.search.route.DrivingRouteResult;
... ... @@ -46,9 +49,13 @@ import com.baidu.mapapi.search.route.TransitRouteResult;
46 49 import com.baidu.mapapi.search.route.WalkingRoutePlanOption;
47 50 import com.baidu.mapapi.search.route.WalkingRouteResult;
48 51 import com.baidu.mapapi.utils.DistanceUtil;
  52 +import com.baidu.trace.LBSTraceClient;
  53 +import com.baidu.trace.Trace;
  54 +import com.baidu.trace.model.LocationMode;
49 55 import com.baidu.trace.model.SortType;
50 56 import com.cnlive.moudle.pedometer.commonInfo.CollCommonInfo;
51 57 import com.cnlive.moudle.pedometer.commonInfo.CommonInfo;
  58 +import com.cnlive.moudle.pedometer.model.Constant;
52 59 import com.cnlive.moudle.pedometer.net.bean.RunRaceDetailInfo;
53 60 import com.cnlive.moudle.pedometer.service.KeepLiveService;
54 61 import com.cnlive.moudle.pedometer.service.StepService;
... ... @@ -115,10 +122,10 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
115 122 // 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}]";
116 123 private LinkedList<LatLng> importLatLngs;//关键点
117 124 private LatLng startLatLng = new LatLng(39.934733, 116.308646);//起始点
118   - private List<LatLng> trackPoints;
119 125 private RunRaceDetailInfo runRaceDetailInfo;
120 126 private UserStepEntity userStepEntity;
121 127 private boolean isDifferentStreet = false;
  128 + private LBSTraceClient mClient = null;
122 129  
123 130 public RunRaceDetailFragmentView(RunRaceDetailFragment fragment) {
124 131 this.fragment = fragment;
... ... @@ -135,22 +142,60 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
135 142 }
136 143 this.runRaceDetailInfo = runRaceDetailInfo;
137 144 // //初始化地图点位
138   - if (runRaceDetailInfo.getLatLongitude() != null) {
139   - Log.e(TAG, "initView: 长度:" + runRaceDetailInfo.getLatLongitude().length());
140   - trackPoints = GsonUtil.jsonToList(runRaceDetailInfo.getLatLongitude().trim(), LatLng.class);
141   - Log.e(TAG, "initView: trackPoints" + trackPoints.size());
142   - MyMapUtil.drawServerLineTrack(getContext(), baiduMap, trackPoints, SortType.asc, R.color.green_round, R.drawable.icon_start, R.drawable.icon_end);
143   - //自动计算地图缩放
144   - MapStatus.Builder builder = new MapStatus.Builder();
145   - builder.target(MyMapUtil.getCenterZoomPosition(trackPoints));
146   - builder.zoom(MyMapUtil.getZoom(trackPoints));
147   - baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
  145 +// if (runRaceDetailInfo.getLatLongitude() != null) {
  146 +// Log.e(TAG, "initView: 长度:" + runRaceDetailInfo.getLatLongitude().length());
  147 +// trackPoints = GsonUtil.jsonToList(runRaceDetailInfo.getLatLongitude().trim(), LatLng.class);
  148 +// Log.e(TAG, "initView: trackPoints" + trackPoints.size());
  149 +// MyMapUtil.drawServerLineTrack(getContext(), baiduMap, trackPoints, SortType.asc, R.color.green_round, R.drawable.icon_start, R.drawable.icon_end);
  150 +// //自动计算地图缩放
  151 +// MapStatus.Builder builder = new MapStatus.Builder();
  152 +// builder.target(MyMapUtil.getCenterZoomPosition(trackPoints));
  153 +// builder.zoom(MyMapUtil.getZoom(trackPoints));
  154 +// baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
  155 +// }
  156 + //轨迹开始时间
  157 + long startTime = 0;
  158 + //轨迹结束时间
  159 + long endTime = 0;
  160 + if (!TextUtils.isEmpty(runRaceDetailInfo.getStartTime()) && !TextUtils.isEmpty(runRaceDetailInfo.getEndTime())&&!TextUtils.isEmpty(runRaceDetailInfo.getEntityName())) {
  161 + startTime = Long.parseLong(runRaceDetailInfo.getStartTime());
  162 + endTime = Long.parseLong(runRaceDetailInfo.getEndTime());
  163 + mClient = new LBSTraceClient(getContext());
  164 + //获取轨迹
  165 + if (mClient != null) {
  166 + MyMapUtil.queryHistoryTrace(getContext(), mClient, runRaceDetailInfo.getEntityName(), startTime, endTime, new MyMapUtil.CallBack() {
  167 + @Override
  168 + public void success(List<LatLng> resultPoints) {
  169 + if (resultPoints != null && resultPoints.size() > 1) {
  170 + Log.e(TAG, "resultPoints: " + resultPoints.size());
  171 + MyMapUtil.drawServerLineTrack(getContext(), baiduMap, resultPoints, SortType.asc, R.color.green_round, R.drawable.icon_start, R.drawable.icon_end);
  172 +// //自动计算地图缩放
  173 +// MapStatus.Builder builder = new MapStatus.Builder();
  174 +// builder.target(MyMapUtil.getCenterZoomPosition(resultPoints));
  175 +// builder.zoom(MyMapUtil.getZoom(resultPoints));
  176 +// baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
  177 +
  178 + LatLngBounds.Builder builder = new LatLngBounds.Builder();
  179 + for (LatLng latLng : resultPoints) {
  180 + builder.include(latLng);
  181 + }
  182 + MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngBounds(builder.build());
  183 + baiduMap.setMapStatus(mapStatusUpdate);
  184 + MapStatusUpdate msu = MapStatusUpdateFactory.zoomBy(-0.8f);
  185 + baiduMap.setMapStatus(msu);
  186 +
  187 + }
  188 + }
  189 + });
  190 +
  191 + }
  192 + //
148 193 }
149 194  
150 195 //显示地图
151 196 fragment.binding.mapView.setVisibility(View.VISIBLE);
152   - //隐藏底部滑动卡片
153   - fragment.binding.slidingLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
  197 + //显示底部滑动卡片
  198 +// fragment.binding.slidingLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
154 199 //隐藏空视图
155 200 fragment.binding.emptyLayout.setVisibility(View.GONE);
156 201 //显示立即报名按钮
... ... @@ -202,6 +247,7 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
202 247 }
203 248 });
204 249 /*************************设置相关页面数据***************************/
  250 +
205 251 //设置围栏ID
206 252 if (!TextUtils.isEmpty(runRaceDetailInfo.getFenceId())) {
207 253 CommonInfo.setFenceId(getContext(), Integer.parseInt(runRaceDetailInfo.getFenceId()));
... ... @@ -209,6 +255,13 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
209 255 //设置标题
210 256 if (!TextUtils.isEmpty(runRaceDetailInfo.getTitle())) {
211 257 fragment.binding.includeStreet.tvRaceTitle.setText(runRaceDetailInfo.getTitle());
  258 + //根据标题字数动态设置卡片高度
  259 + if (runRaceDetailInfo.getTitle().length() > 19) {
  260 + fragment.binding.slidingLayout.setPanelHeight(ScreenUtil.dip2px(getContext(), 149));
  261 + } else {
  262 + fragment.binding.slidingLayout.setPanelHeight(ScreenUtil.dip2px(getContext(), 141));
  263 + }
  264 + fragment.binding.slidingLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
212 265 }
213 266 //设置活动地点
214 267 if (!TextUtils.isEmpty(runRaceDetailInfo.getAddress())) {
... ... @@ -448,7 +501,7 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
448 501 public void onClick(View view) {
449 502 ARouter.getInstance().build("/web/WebViewColorActivity")
450 503 .withString("url", "http://wjjh5test.cnlive.com/cnSportList.html")
451   - .withString("title",runRaceDetailInfo.getTitle()+"排行榜")
  504 + .withString("title", runRaceDetailInfo.getTitle() + "排行榜")
452 505 .navigation(fragment.getActivity());
453 506 }
454 507 });
... ... @@ -811,16 +864,24 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
811 864 //数据库保存的id
812 865 String dbStreetId = userStepEntity.getStreetId();
813 866 //获取当前时间戳
814   - long currnetTime = TimeUtil.getNowTimeStamp();
  867 + long currnetTime = SystemClock.elapsedRealtime();
815 868 //获取用户暂停的时间戳
816   - long userPauseTime = userStepEntity.getUserPauseTimeStamp();
  869 + long userPauseTime = userStepEntity.getChronometerBase();
817 870 //判断时间是否小于9小时
  871 + Log.e(TAG, "checkStartBtnState: " + currnetTime + ",userPauseTime:" + userPauseTime);
818 872 if ((currnetTime - userPauseTime) <= (9 * 60 * 60 * 1000)) {
  873 + Log.e(TAG, "小于9小时");
819 874 fragment.binding.tvRunNow.setText("继续运动");
820 875 fragment.binding.rlScrollViewStartBtn.setTag("2");
821 876 } else {
  877 + Log.e(TAG, "大于9小时");
  878 + //重置数据
  879 + CommonInfo.resetRace(getContext());
  880 + //清空数据库
  881 + StepUtil.clearRunData(getContext(), CommonInfo.getUserId(getContext()));
822 882 fragment.binding.tvRunNow.setText("立即开始");
823 883 fragment.binding.rlScrollViewStartBtn.setTag("1");
  884 +
824 885 }
825 886  
826 887 if (currentStreetId.equals(dbStreetId)) {
... ... @@ -997,5 +1058,4 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
997 1058 fragment.binding.tvGoTip.setVisibility(View.VISIBLE);
998 1059 }
999 1060  
1000   -
1001 1061 }
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/sql/dao/UserStepEntityDao.java
... ... @@ -38,6 +38,7 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; {
38 38 public final static Property StreetId = new Property(11, String.class, "streetId", false, "STREET_ID");
39 39 public final static Property PauseCount = new Property(12, int.class, "pauseCount", false, "PAUSE_COUNT");
40 40 public final static Property UserPauseTimeStamp = new Property(13, long.class, "userPauseTimeStamp", false, "USER_PAUSE_TIME_STAMP");
  41 + public final static Property ChronometerBase = new Property(14, long.class, "chronometerBase", false, "CHRONOMETER_BASE");
41 42 }
42 43  
43 44  
... ... @@ -66,7 +67,8 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; {
66 67 "\"FINISH_TIME_STAMP\" INTEGER NOT NULL ," + // 10: finishTimeStamp
67 68 "\"STREET_ID\" TEXT," + // 11: streetId
68 69 "\"PAUSE_COUNT\" INTEGER NOT NULL ," + // 12: pauseCount
69   - "\"USER_PAUSE_TIME_STAMP\" INTEGER NOT NULL );"); // 13: userPauseTimeStamp
  70 + "\"USER_PAUSE_TIME_STAMP\" INTEGER NOT NULL ," + // 13: userPauseTimeStamp
  71 + "\"CHRONOMETER_BASE\" INTEGER NOT NULL );"); // 14: chronometerBase
70 72 }
71 73  
72 74 /** Drops the underlying database table. */
... ... @@ -120,6 +122,7 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; {
120 122 }
121 123 stmt.bindLong(13, entity.getPauseCount());
122 124 stmt.bindLong(14, entity.getUserPauseTimeStamp());
  125 + stmt.bindLong(15, entity.getChronometerBase());
123 126 }
124 127  
125 128 @Override
... ... @@ -167,6 +170,7 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; {
167 170 }
168 171 stmt.bindLong(13, entity.getPauseCount());
169 172 stmt.bindLong(14, entity.getUserPauseTimeStamp());
  173 + stmt.bindLong(15, entity.getChronometerBase());
170 174 }
171 175  
172 176 @Override
... ... @@ -190,7 +194,8 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; {
190 194 cursor.getLong(offset + 10), // finishTimeStamp
191 195 cursor.isNull(offset + 11) ? null : cursor.getString(offset + 11), // streetId
192 196 cursor.getInt(offset + 12), // pauseCount
193   - cursor.getLong(offset + 13) // userPauseTimeStamp
  197 + cursor.getLong(offset + 13), // userPauseTimeStamp
  198 + cursor.getLong(offset + 14) // chronometerBase
194 199 );
195 200 return entity;
196 201 }
... ... @@ -211,6 +216,7 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; {
211 216 entity.setStreetId(cursor.isNull(offset + 11) ? null : cursor.getString(offset + 11));
212 217 entity.setPauseCount(cursor.getInt(offset + 12));
213 218 entity.setUserPauseTimeStamp(cursor.getLong(offset + 13));
  219 + entity.setChronometerBase(cursor.getLong(offset + 14));
214 220 }
215 221  
216 222 @Override
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/sql/entity/UserStepEntity.java
... ... @@ -21,11 +21,12 @@ public class UserStepEntity {
21 21 private String streetId;//赛事ID
22 22 private int pauseCount;//暂停次数
23 23 private long userPauseTimeStamp;//暂停时间戳
  24 + private long chronometerBase;//计时器设置基础时间
24 25  
25   - @Generated(hash = 446594441)
26   - public UserStepEntity(String userId, String date, String stepCount, long pauseTimeStamp, long recordTime, double caloriesCount,
27   - String serverTraceData, String startPoint, String endPoint, long startTimeStamp, long finishTimeStamp, String streetId, int pauseCount,
28   - long userPauseTimeStamp) {
  26 + @Generated(hash = 562353866)
  27 + public UserStepEntity(String userId, String date, String stepCount, long pauseTimeStamp, long recordTime, double caloriesCount, String serverTraceData,
  28 + String startPoint, String endPoint, long startTimeStamp, long finishTimeStamp, String streetId, int pauseCount, long userPauseTimeStamp,
  29 + long chronometerBase) {
29 30 this.userId = userId;
30 31 this.date = date;
31 32 this.stepCount = stepCount;
... ... @@ -40,6 +41,7 @@ public class UserStepEntity {
40 41 this.streetId = streetId;
41 42 this.pauseCount = pauseCount;
42 43 this.userPauseTimeStamp = userPauseTimeStamp;
  44 + this.chronometerBase = chronometerBase;
43 45 }
44 46  
45 47 @Generated(hash = 273857141)
... ... @@ -158,5 +160,13 @@ public class UserStepEntity {
158 160 this.userPauseTimeStamp = userPauseTimeStamp;
159 161 }
160 162  
  163 + public long getChronometerBase() {
  164 + return this.chronometerBase;
  165 + }
  166 +
  167 + public void setChronometerBase(long chronometerBase) {
  168 + this.chronometerBase = chronometerBase;
  169 + }
  170 +
161 171  
162 172 }
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/fragment/RunMainFragment.java
... ... @@ -60,11 +60,11 @@ public class RunMainFragment extends QMUIFragment&lt;RunMainFragmentView, RunMainFr
60 60 super.onPause();
61 61 //todo 第二期在用
62 62 //记录当前计时器相关数据
63   - if (getMvpView() != null) {
64   - if (!TextUtils.isEmpty(CommonInfo.getUserId(getActivity()))) {
65   - getMvpView().setFragmentPauseTime(userId);
66   - }
67   - }
  63 +// if (getMvpView() != null) {
  64 +// if (!TextUtils.isEmpty(CommonInfo.getUserId(getActivity()))) {
  65 +// getMvpView().setFragmentPauseTime(userId);
  66 +// }
  67 +// }
68 68 }
69 69  
70 70 @Override
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/fragment/RunningMapFragment.java
... ... @@ -113,18 +113,16 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run
113 113 // CommonInfo.getStepStartTime(getActivity());
114 114 Log.e(TAG, "onViewCreated: 时间"+stepStartTime );
115 115 long startTime = 0;
116   - if (stepStartTime != 0) {
117   - startTime = stepStartTime;
118   - } else {
119   - startTime = (int) (System.currentTimeMillis() / 1000 -12 * 60 * 60);
120   - }
  116 +// if (stepStartTime != 0) {
  117 +// startTime = stepStartTime;
  118 +// } else {
  119 + startTime = (int) (System.currentTimeMillis() / 1000 -12);
  120 +// }
121 121 long current = TimeUtil.getNowTimeStamp();
122 122 // long startTime = current - hour * 3600 * 1000 - minute * 60 * 1000 - second * 1000;
123 123 long endTime = current;
124 124 // Log.e(TAG, "onViewCreated: " + "hour:" + hour + ",minute" + minute + ",second:" + second);
125   - getPresenter().queryHistoryTrace(getActivity(), StepService.entityName, 1560859257, endTime);
126   - //查询实时轨迹
127   - getPresenter().queryRealTimeTrace(getActivity(), StepService.entityName, startTime);
  125 + getPresenter().queryHistoryTrace(getActivity(), StepService.entityName, startTime, endTime);
128 126  
129 127 }
130 128  
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/MyMapUtil.java
... ... @@ -4,6 +4,9 @@ import android.content.Context;
4 4 import android.graphics.Bitmap;
5 5 import android.graphics.BitmapFactory;
6 6 import android.location.LocationManager;
  7 +import android.os.Handler;
  8 +import android.util.Log;
  9 +import android.widget.Toast;
7 10  
8 11 import com.baidu.mapapi.map.BaiduMap;
9 12 import com.baidu.mapapi.map.BitmapDescriptorFactory;
... ... @@ -13,17 +16,205 @@ import com.baidu.mapapi.map.OverlayOptions;
13 16 import com.baidu.mapapi.map.PolylineOptions;
14 17 import com.baidu.mapapi.model.LatLng;
15 18 import com.baidu.mapapi.utils.DistanceUtil;
  19 +import com.baidu.trace.LBSTraceClient;
  20 +import com.baidu.trace.api.track.DistanceRequest;
  21 +import com.baidu.trace.api.track.DistanceResponse;
  22 +import com.baidu.trace.api.track.HistoryTrackRequest;
  23 +import com.baidu.trace.api.track.HistoryTrackResponse;
  24 +import com.baidu.trace.api.track.OnTrackListener;
  25 +import com.baidu.trace.api.track.SupplementMode;
  26 +import com.baidu.trace.api.track.TrackPoint;
  27 +import com.baidu.trace.model.CoordType;
  28 +import com.baidu.trace.model.ProcessOption;
16 29 import com.baidu.trace.model.SortType;
  30 +import com.baidu.trace.model.StatusCodes;
  31 +import com.baidu.trace.model.TransportMode;
  32 +import com.cnlive.moudle.pedometer.model.Constant;
17 33 import com.cnlive.moudle.pedometer.model.RoutePoint;
  34 +import com.cnlive.moudle.pedometer.service.StepService;
18 35 import com.example.moudle_pedometer.R;
19 36  
20 37 import java.util.ArrayList;
  38 +import java.util.HashMap;
21 39 import java.util.List;
22 40  
23 41 /**
24 42 * @author ShinnyYang
25 43 */
26 44 public class MyMapUtil {
  45 + private static final String TAG = "MyMapUtil";
  46 + //分页大小
  47 + private static int pageSize = 1000;
  48 + //分页索引
  49 + private static int pageIndex = 1;
  50 + private static List<LatLng> trackPoints;
  51 +
  52 + /**
  53 + * 判断用户是否完成比赛
  54 + *
  55 + * @param importPoints
  56 + * @param trackPoints
  57 + * @param passRate 及格率,如60%----0.6
  58 + * @return
  59 + */
  60 + public static boolean checkIsFinishTrace(List<LatLng> importPoints, List<LatLng> trackPoints, double passRate) {
  61 + HashMap<Integer, Boolean> importHash = new HashMap<>();
  62 + for (int i = 0; i < importPoints.size(); i++) {
  63 + if (i % 3 != 0) {
  64 + importPoints.remove(i);
  65 + }
  66 + }
  67 + for (int i = 0; i < importPoints.size(); i++) {
  68 + importHash.put(i, false);
  69 + }
  70 + //开始比较数据
  71 + int index = 0;
  72 + for (int i = 0; i < importPoints.size(); i++) {
  73 + LatLng importLatLng = importPoints.get(i);
  74 + for (int j = index; j < trackPoints.size(); j++) {
  75 + double distance = DistanceUtil.getDistance(importLatLng, trackPoints.get(j));
  76 + if (distance < 50) {
  77 + importHash.put(i, true);
  78 + index = j;
  79 + }
  80 + }
  81 + }
  82 + //输出
  83 + int result = 0;
  84 + for (int i = 0; i < importHash.size(); i++) {
  85 + if (!importHash.get(i)) {
  86 + result++;
  87 + }
  88 + }
  89 + if (result > importPoints.size() * (1 - passRate)) {
  90 +// Toast.makeText(context, "没有完成", Toast.LENGTH_LONG).show();
  91 + return false;
  92 +
  93 + } else {
  94 +// Toast.makeText(context, "已完成", Toast.LENGTH_LONG).show();
  95 + return true;
  96 + }
  97 + }
  98 +
  99 + /**
  100 + * 查询历史轨迹
  101 + *
  102 + * @param startTime
  103 + * @param endTime
  104 + */
  105 + private static int queryNum = 0;//查询次数
  106 +
  107 + public static void queryHistoryTrace(Context context, LBSTraceClient mClient, String entityName, long startTime, long endTime, CallBack callBack) {
  108 + Log.e(TAG, "queryHistoryTrace: 时间:" + startTime);
  109 + HistoryTrackRequest historyTrackRequest = new HistoryTrackRequest(Constant.TAG, Constant.SERVICE_ID, entityName);
  110 + //设置查询设备名称
  111 + historyTrackRequest.setEntityName(entityName);
  112 + //历史轨迹开始时间
  113 + historyTrackRequest.setStartTime(startTime);
  114 + //历史轨迹结束时间
  115 + historyTrackRequest.setEndTime(endTime);
  116 + //分页索引
  117 + historyTrackRequest.setPageIndex(pageIndex);
  118 + //分页大小
  119 + historyTrackRequest.setPageSize(pageSize);
  120 + //设置是否进行纠偏
  121 + historyTrackRequest.setProcessed(true);
  122 + //设置返回坐标系
  123 + historyTrackRequest.setCoordTypeOutput(CoordType.gcj02);
  124 + //其他设置
  125 + ProcessOption processOption = new ProcessOption();
  126 + //去噪:可设置是否需要去除角度、速度和方向异常的轨迹点
  127 + processOption.setNeedDenoise(true);
  128 + //绑路:设置是否将轨迹点绑定至路网道路
  129 + processOption.setNeedMapMatch(false);
  130 + //抽稀:设置是否进行抽稀处理,对冗余的轨迹点进行抽稀去除处理,如一条直线上除起终点外的多个轨迹点
  131 + processOption.setNeedVacuate(true);
  132 + //自动判断交通方式
  133 + processOption.setTransportMode(TransportMode.walking);
  134 + // 设置精度过滤值(定位精度大于100米的过滤掉)
  135 + processOption.setRadiusThreshold(9);
  136 + // 设置纠偏选项
  137 + historyTrackRequest.setProcessOption(processOption);
  138 + // 设置里程填充方式为驾车
  139 + historyTrackRequest.setSupplementMode(SupplementMode.walking);
  140 +
  141 + if (trackPoints == null) {
  142 + trackPoints = new ArrayList<>();
  143 + }
  144 + //轨迹查询监听器
  145 + OnTrackListener historyTrackListener = new OnTrackListener() {
  146 + @Override
  147 + public void onHistoryTrackCallback(HistoryTrackResponse response) {
  148 + super.onHistoryTrackCallback(response);
  149 + int total = response.getTotal();
  150 + Log.e(TAG, "onHistoryTrackCallback: " + response.getMessage());
  151 + if (StatusCodes.SUCCESS != response.getStatus()) {
  152 + if (response.getStatus() == 14004) {
  153 + //给3次重新查询的机会
  154 + if (queryNum < 4) {
  155 + //重新查询
  156 +// new Handler().postDelayed(new Runnable() {
  157 +// @Override
  158 +// public void run() {
  159 +// //间隔3秒查一次
  160 + queryHistoryTrace(context, mClient, entityName, startTime, endTime, callBack);
  161 + queryNum++;
  162 +// }
  163 +// }, 1000);
  164 +
  165 + } else {
  166 + callBack.success(null);
  167 + }
  168 +
  169 + } else {
  170 + Toast.makeText(context, "获取轨迹失败!" + response.getMessage() + "," + response.getStatus(), Toast.LENGTH_SHORT).show();
  171 + }
  172 + } else if (0 == total) {
  173 + if (callBack != null) {
  174 + callBack.success(new ArrayList<>());
  175 + trackPoints.clear();
  176 + }
  177 + queryNum = 0;
  178 + Toast.makeText(context, "暂未查到您的轨迹,请稍后重试!", Toast.LENGTH_SHORT).show();
  179 + } else {
  180 + queryNum = 0;
  181 + //查询到轨迹
  182 + List<TrackPoint> points = response.getTrackPoints();
  183 + if (null != points) {
  184 + for (TrackPoint trackPoint : points) {
  185 + if (!CommonUtil.isZeroPoint(trackPoint.getLocation().getLatitude(),
  186 + trackPoint.getLocation().getLongitude())) {
  187 + //将轨迹点转换为地图坐标点
  188 + trackPoints.add(MyMapUtil.convertTrace2Map(trackPoint.getLocation()));
  189 + }
  190 + }
  191 + }
  192 + }
  193 + if (total > pageSize * pageIndex) {
  194 + historyTrackRequest.setPageIndex(++pageIndex);
  195 + queryHistoryTrace(context, mClient, entityName, startTime, endTime, callBack);
  196 + } else {
  197 + if (callBack != null) {
  198 + callBack.success(trackPoints);
  199 + trackPoints.clear();
  200 + }
  201 + }
  202 +
  203 + }
  204 + };
  205 + //开始查询历史轨迹
  206 + if (mClient != null) {
  207 + mClient.queryHistoryTrack(historyTrackRequest, historyTrackListener);
  208 + }
  209 +// if (trackPoints != null && trackPoints.size() > 0) {
  210 +// Log.e(TAG, "queryHistoryTrace: " + trackPoints.size());
  211 +// return trackPoints;
  212 +// } else {
  213 +// Log.e(TAG, "queryHistoryTrace: trackPoints:null");
  214 +// return null;
  215 +// }
  216 + }
  217 +
27 218 /**
28 219 * 判断GPS是否开启,GPS或者AGPS开启一个就认为是开启的
29 220 *
... ... @@ -649,4 +840,8 @@ public class MyMapUtil {
649 840 }
650 841 return inPoint;
651 842 }
  843 +
  844 + public interface CallBack {
  845 + public void success(List<LatLng> resultPoints);
  846 + }
652 847 }
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/StepUtil.java
... ... @@ -134,6 +134,14 @@ public class StepUtil {
134 134 }
135 135 }
136 136  
  137 + /**
  138 + * 初始化计步相关数据
  139 + *
  140 + * @param context
  141 + * @param uid
  142 + * @param startStamp
  143 + * @param streetId
  144 + */
137 145 public static void setStepStartData(Context context, String uid, long startStamp, String streetId) {
138 146 if (getUserStepData(context, uid) != null) {
139 147 UserStepEntity entity = getUserStepData(context, uid);
... ... @@ -151,6 +159,34 @@ public class StepUtil {
151 159 }
152 160 }
153 161  
  162 + /**
  163 + * 设置计步开始时间
  164 + *
  165 + * @param context
  166 + * @param uid
  167 + * @param time
  168 + */
  169 + public static void setChronometerBase(Context context, String uid, long time) {
  170 + if (getUserStepData(context, uid) != null) {
  171 + UserStepEntity entity = getUserStepData(context, uid);
  172 + entity.setChronometerBase(time);
  173 + //更新数据
  174 + updateStepData(context, entity);
  175 + } else {
  176 + //创建数据
  177 + UserStepEntity userStepEntity = new UserStepEntity();
  178 + userStepEntity.setUserId(uid);
  179 + userStepEntity.setChronometerBase(time);
  180 + insertStepData(context, userStepEntity);
  181 + }
  182 + }
  183 +
  184 + /**
  185 + * 插入计步数据
  186 + *
  187 + * @param context
  188 + * @param userStepEntity
  189 + */
154 190 public static void insertStepData(Context context, UserStepEntity userStepEntity) {
155 191 DbCore.init(context, dbName);
156 192 DbCore.getDaoSession().getUserStepEntityDao().insert(userStepEntity);
... ...
moudle_pedometer/src/main/res/layout/fragment_run_main.xml
... ... @@ -63,8 +63,9 @@
63 63  
64 64 <ImageView
65 65 android:id="@+id/iv_back"
66   - android:layout_width="20dp"
67   - android:layout_height="40dp"
  66 + android:layout_width="15dp"
  67 + android:layout_height="20dp"
  68 + android:layout_margin="10dp"
68 69 android:background="@drawable/back" />
69 70 </FrameLayout>
70 71 <!--GPS信息-->
... ...
moudle_pedometer/src/main/res/layout/fragment_run_race_detail.xml
... ... @@ -14,7 +14,7 @@
14 14 sothree:umanoDragView="@+id/dragView"
15 15 sothree:umanoFadeColor="@color/black_20"
16 16 sothree:umanoOverlay="true"
17   - sothree:umanoPanelHeight="141dp"
  17 +
18 18 sothree:umanoParallaxOffset="250dp"
19 19 sothree:umanoScrollableView="@+id/scrollView"
20 20 sothree:umanoShadowHeight="0dp">
... ...