Commit 8072d95a6dca1e990cf7870102247ed6ee751ee7

Authored by 杨帅
1 parent 8409813c

1、完成活动赛事详情页面搭建

Showing 42 changed files with 1920 additions and 246 deletions
app/src/main/AndroidManifest.xml
@@ -23,13 +23,8 @@ @@ -23,13 +23,8 @@
23 23
24 <meta-data 24 <meta-data
25 android:name="com.baidu.lbsapi.API_KEY" 25 android:name="com.baidu.lbsapi.API_KEY"
26 - android:value="Q7y9SGcZVs0tmhbNTiaz0jHm4S1xGzE2" /> 26 + android:value="${BAIDU_MAP_APP_KEY}" />
27 27
28 - <!--跑步-->  
29 - <service  
30 - android:name="com.baidu.location.f"  
31 - android:enabled="true"  
32 - android:process=":remote" />  
33 28
34 </application> 29 </application>
35 30
app/src/main/java/com/example/modulepedometer/MainActivity.java
@@ -8,6 +8,7 @@ import android.view.View; @@ -8,6 +8,7 @@ import android.view.View;
8 8
9 import com.alibaba.android.arouter.launcher.ARouter; 9 import com.alibaba.android.arouter.launcher.ARouter;
10 import com.cnlive.moudle.pedometer.ui.activity.PedometerMainActivity; 10 import com.cnlive.moudle.pedometer.ui.activity.PedometerMainActivity;
  11 +import com.cnlive.moudle.pedometer.ui.activity.RunRaceDetailActivity;
11 12
12 13
13 public class MainActivity extends AppCompatActivity { 14 public class MainActivity extends AppCompatActivity {
@@ -17,7 +18,8 @@ public class MainActivity extends AppCompatActivity { @@ -17,7 +18,8 @@ public class MainActivity extends AppCompatActivity {
17 super.onCreate(savedInstanceState); 18 super.onCreate(savedInstanceState);
18 setContentView(R.layout.activity_main); 19 setContentView(R.layout.activity_main);
19 ARouter.getInstance() 20 ARouter.getInstance()
20 - .build("/moudle_pedometer/InterestActivity") 21 +// .build("/moudle_pedometer/InterestActivity")
  22 + .build("/moudle_pedometer/RunRaceDetailActivity")
21 .navigation(this); 23 .navigation(this);
22 finish(); 24 finish();
23 // BottomSheetDialog bottomSheetDialog=new BottomSheetDialog(this); 25 // BottomSheetDialog bottomSheetDialog=new BottomSheetDialog(this);
moudle_pedometer/src/main/AndroidManifest.xml
@@ -3,10 +3,6 @@ @@ -3,10 +3,6 @@
3 xmlns:tools="http://schemas.android.com/tools" 3 xmlns:tools="http://schemas.android.com/tools"
4 package="com.example.moudle_pedometer"> 4 package="com.example.moudle_pedometer">
5 5
6 - <permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />  
7 - <permission android:name="android.permission.FORCE_STOP_PACKAGES" />  
8 -  
9 -  
10 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 6 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
11 <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> 7 <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
12 <uses-permission android:name="android.permission.WAKE_LOCK" /> 8 <uses-permission android:name="android.permission.WAKE_LOCK" />
@@ -14,7 +10,28 @@ @@ -14,7 +10,28 @@
14 <uses-permission android:name="android.permission.VIBRATE" /> 10 <uses-permission android:name="android.permission.VIBRATE" />
15 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 11 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
16 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 12 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
17 - <uses-permission android:name="android.permission.BROADCAST_STICKY" /> 13 + <!--//获取设备网络状态,禁用后无法获取网络状态-->
  14 + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  15 + <!--//网络权限,当禁用后,无法进行检索等相关业务-->
  16 + <uses-permission android:name="android.permission.INTERNET" />
  17 + <!--//读取设备硬件信息,统计数据-->
  18 + <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  19 + <!--//读取系统信息,包含系统版本等信息,用作统计-->
  20 + <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
  21 + <!--//获取设备的网络状态,鉴权所需网络代理-->
  22 + <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  23 + <!--//允许sd卡写权限,需写入地图数据,禁用后无法显示地图-->
  24 + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  25 + <!--//这个权限用于进行网络定位-->
  26 + <uses-permission
  27 + android:name="android.permission.WRITE_SETTINGS"
  28 + tools:ignore="ProtectedPermissions" />
  29 + <!--//这个权限用于访问GPS定位-->
  30 + <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  31 + <!--//获取统计数据-->
  32 + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  33 + <!--//使用步行AR导航,配置Camera权限-->
  34 + <uses-permission android:name="android.permission.CAMERA" />
18 <uses-permission 35 <uses-permission
19 android:name="android.permission.SET_ALWAYS_FINISH" 36 android:name="android.permission.SET_ALWAYS_FINISH"
20 tools:ignore="ProtectedPermissions" /> 37 tools:ignore="ProtectedPermissions" />
@@ -45,7 +62,10 @@ @@ -45,7 +62,10 @@
45 android:required="true" /> 62 android:required="true" />
46 63
47 <application android:persistent="true"> 64 <application android:persistent="true">
48 - 65 + <service
  66 + android:name="com.baidu.location.f"
  67 + android:enabled="true"
  68 + android:process=":remote" />
49 <service 69 <service
50 70
51 android:name="com.cnlive.moudle.pedometer.service.StepService" 71 android:name="com.cnlive.moudle.pedometer.service.StepService"
@@ -89,6 +109,10 @@ @@ -89,6 +109,10 @@
89 <activity 109 <activity
90 android:name="com.cnlive.moudle.pedometer.ui.activity.RunningMapActivity" 110 android:name="com.cnlive.moudle.pedometer.ui.activity.RunningMapActivity"
91 android:process=":step" /> 111 android:process=":step" />
  112 +
  113 + <activity
  114 + android:name="com.cnlive.moudle.pedometer.ui.activity.RunRaceDetailActivity"
  115 + android:process=":step" />
92 </application> 116 </application>
93 117
94 </manifest> 118 </manifest>
95 \ No newline at end of file 119 \ No newline at end of file
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/presenter/RunRaceDetailFragmentPresenter.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.frame.presenter;
  2 +
  3 +import com.cnlive.moudle.pedometer.frame.view.RunRaceDetailFragmentView;
  4 +import com.cnlive.moudle.pedometer.frame.view.RunningMapFragmentView;
  5 +import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
  6 +
  7 +public class RunRaceDetailFragmentPresenter extends MvpBasePresenter<RunRaceDetailFragmentView> {
  8 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/view/RunMainFragmentView.java
1 package com.cnlive.moudle.pedometer.frame.view; 1 package com.cnlive.moudle.pedometer.frame.view;
2 2
3 -import android.animation.Animator;  
4 -import android.animation.AnimatorSet;  
5 -import android.animation.ObjectAnimator;  
6 import android.content.Context; 3 import android.content.Context;
7 import android.content.Intent; 4 import android.content.Intent;
8 -import android.os.Build;  
9 import android.os.Handler; 5 import android.os.Handler;
10 import android.os.SystemClock; 6 import android.os.SystemClock;
11 import android.support.v4.content.ContextCompat; 7 import android.support.v4.content.ContextCompat;
12 import android.util.Log; 8 import android.util.Log;
13 import android.view.MotionEvent; 9 import android.view.MotionEvent;
14 import android.view.View; 10 import android.view.View;
15 -import android.view.ViewAnimationUtils;  
16 -import android.view.animation.DecelerateInterpolator;  
17 import android.widget.Chronometer; 11 import android.widget.Chronometer;
18 12
  13 +import com.cnlive.moudle.pedometer.model.RunningMapBean;
19 import com.cnlive.moudle.pedometer.model.Constant; 14 import com.cnlive.moudle.pedometer.model.Constant;
20 import com.cnlive.moudle.pedometer.model.MessageEvent; 15 import com.cnlive.moudle.pedometer.model.MessageEvent;
21 import com.cnlive.moudle.pedometer.service.StepService; 16 import com.cnlive.moudle.pedometer.service.StepService;
@@ -23,6 +18,7 @@ import com.cnlive.moudle.pedometer.sql.entity.UserStepEntity; @@ -23,6 +18,7 @@ import com.cnlive.moudle.pedometer.sql.entity.UserStepEntity;
23 import com.cnlive.moudle.pedometer.ui.activity.RunningMapActivity; 18 import com.cnlive.moudle.pedometer.ui.activity.RunningMapActivity;
24 import com.cnlive.moudle.pedometer.ui.fragment.RunMainFragment; 19 import com.cnlive.moudle.pedometer.ui.fragment.RunMainFragment;
25 import com.cnlive.moudle.pedometer.ui.widget.SelectDialog; 20 import com.cnlive.moudle.pedometer.ui.widget.SelectDialog;
  21 +import com.cnlive.moudle.pedometer.utils.ButtonAnimUtil;
26 import com.cnlive.moudle.pedometer.utils.StepUtil; 22 import com.cnlive.moudle.pedometer.utils.StepUtil;
27 import com.example.moudle_pedometer.R; 23 import com.example.moudle_pedometer.R;
28 import com.hannesdorfmann.mosby3.mvp.MvpView; 24 import com.hannesdorfmann.mosby3.mvp.MvpView;
@@ -31,10 +27,6 @@ import org.greenrobot.eventbus.EventBus; @@ -31,10 +27,6 @@ import org.greenrobot.eventbus.EventBus;
31 27
32 public class RunMainFragmentView implements MvpView { 28 public class RunMainFragmentView implements MvpView {
33 private final String TAG = "RunMainFragmentView"; 29 private final String TAG = "RunMainFragmentView";
34 - private final int DEFAULT_ZOOM_DURATION = 50;//默认缩放动画时间间隔  
35 - private final int SHOW_VIEW_ZOOM_DURATION = 150;//显示控件缩放动画时间间隔  
36 - private final int HIDE_VIEW_ZOOM_DURATION = 100;//隐藏控件缩放动画时间间隔  
37 -  
38 private RunMainFragment fragment; 30 private RunMainFragment fragment;
39 private boolean stopStartFlag = false; 31 private boolean stopStartFlag = false;
40 private boolean continueStartFlag = false; 32 private boolean continueStartFlag = false;
@@ -48,7 +40,7 @@ public class RunMainFragmentView implements MvpView { @@ -48,7 +40,7 @@ public class RunMainFragmentView implements MvpView {
48 private int timeCountDown;//时间倒计时 40 private int timeCountDown;//时间倒计时
49 41
50 private String uid; 42 private String uid;
51 - 43 + private boolean needWriteDataFlag = true;//是否需要将计时器基值写入到数据库
52 44
53 public RunMainFragmentView(RunMainFragment fragment) { 45 public RunMainFragmentView(RunMainFragment fragment) {
54 this.fragment = fragment; 46 this.fragment = fragment;
@@ -68,7 +60,7 @@ public class RunMainFragmentView implements MvpView { @@ -68,7 +60,7 @@ public class RunMainFragmentView implements MvpView {
68 public void initView() { 60 public void initView() {
69 uid = "123"; 61 uid = "123";
70 fragment.binding.llRunMainRoot.setVisibility(View.GONE); 62 fragment.binding.llRunMainRoot.setVisibility(View.GONE);
71 - startAnimation(fragment.binding.llStartTimeTip, false); 63 + ButtonAnimUtil.startAnimation(fragment.binding.llStartTimeTip, false);
72 firstTimeFlag = true; 64 firstTimeFlag = true;
73 handler = new Handler(); 65 handler = new Handler();
74 timeCountDown = 4; 66 timeCountDown = 4;
@@ -80,11 +72,11 @@ public class RunMainFragmentView implements MvpView { @@ -80,11 +72,11 @@ public class RunMainFragmentView implements MvpView {
80 timeCountDown--; 72 timeCountDown--;
81 fragment.binding.tvTimeCountDown.setVisibility(View.VISIBLE); 73 fragment.binding.tvTimeCountDown.setVisibility(View.VISIBLE);
82 fragment.binding.tvTimeCountDown.setText(timeCountDown + ""); 74 fragment.binding.tvTimeCountDown.setText(timeCountDown + "");
83 - setTimeShowZoomIn(fragment.binding.tvTimeCountDown); 75 + ButtonAnimUtil.setTimeShowZoomIn(fragment.binding.tvTimeCountDown);
84 //依次倒计时 76 //依次倒计时
85 handler.postDelayed(runnable, 1000); 77 handler.postDelayed(runnable, 1000);
86 } else { 78 } else {
87 - startAnimation(fragment.binding.llStartTimeTip, true); 79 + ButtonAnimUtil.startAnimation(fragment.binding.llStartTimeTip, true);
88 fragment.binding.llRunMainRoot.setVisibility(View.VISIBLE); 80 fragment.binding.llRunMainRoot.setVisibility(View.VISIBLE);
89 new Handler().postDelayed(new Runnable() { 81 new Handler().postDelayed(new Runnable() {
90 @Override 82 @Override
@@ -121,6 +113,7 @@ public class RunMainFragmentView implements MvpView { @@ -121,6 +113,7 @@ public class RunMainFragmentView implements MvpView {
121 } else { 113 } else {
122 chronometer.setFormat("%s"); 114 chronometer.setFormat("%s");
123 } 115 }
  116 +
124 } 117 }
125 }); 118 });
126 UserStepEntity userStepEntity = StepUtil.getUserStepData(fragment.getActivity(), uid); 119 UserStepEntity userStepEntity = StepUtil.getUserStepData(fragment.getActivity(), uid);
@@ -163,12 +156,12 @@ public class RunMainFragmentView implements MvpView { @@ -163,12 +156,12 @@ public class RunMainFragmentView implements MvpView {
163 } 156 }
164 if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 157 if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
165 if (!continueStartFlag) { 158 if (!continueStartFlag) {
166 - setViewZoomIn(fragment.binding.flContinue); 159 + ButtonAnimUtil.setViewZoomIn(fragment.binding.flContinue);
167 continueStartFlag = true; 160 continueStartFlag = true;
168 161
169 } 162 }
170 } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { 163 } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
171 - setViewZoomOut(fragment.binding.flContinue); 164 + ButtonAnimUtil.setViewZoomOut(fragment.binding.flContinue);
172 continueStartFlag = false; 165 continueStartFlag = false;
173 } 166 }
174 return false; 167 return false;
@@ -178,6 +171,7 @@ public class RunMainFragmentView implements MvpView { @@ -178,6 +171,7 @@ public class RunMainFragmentView implements MvpView {
178 fragment.binding.flContinue.setOnClickListener(new View.OnClickListener() { 171 fragment.binding.flContinue.setOnClickListener(new View.OnClickListener() {
179 @Override 172 @Override
180 public void onClick(View view) { 173 public void onClick(View view) {
  174 + needWriteDataFlag = true;
181 //将当前计时器时间戳写入数据库 175 //将当前计时器时间戳写入数据库
182 setSQLPauseTime(); 176 setSQLPauseTime();
183 //为了点击时可以显示缩放动画,这里延迟一个动画时间进行(包括放大和缩小) 177 //为了点击时可以显示缩放动画,这里延迟一个动画时间进行(包括放大和缩小)
@@ -188,12 +182,12 @@ public class RunMainFragmentView implements MvpView { @@ -188,12 +182,12 @@ public class RunMainFragmentView implements MvpView {
188 //隐藏两个按钮 182 //隐藏两个按钮
189 fragment.binding.flStopTip.setVisibility(View.INVISIBLE); 183 fragment.binding.flStopTip.setVisibility(View.INVISIBLE);
190 fragment.binding.llTwoBottomButton.setVisibility(View.GONE); 184 fragment.binding.llTwoBottomButton.setVisibility(View.GONE);
191 - setViewShowZoomIn(fragment.binding.llPause); 185 + ButtonAnimUtil.setViewShowZoomIn(fragment.binding.llPause);
192 //显示暂停按钮 186 //显示暂停按钮
193 fragment.binding.llPause.setVisibility(View.VISIBLE); 187 fragment.binding.llPause.setVisibility(View.VISIBLE);
194 // 188 //
195 } 189 }
196 - }, DEFAULT_ZOOM_DURATION * 2); 190 + }, ButtonAnimUtil.DEFAULT_ZOOM_DURATION * 2);
197 //继续计步 191 //继续计步
198 EventBus.getDefault().post(new MessageEvent(Constant.SERVICE_STEP_COUNT_CONTINUE, "")); 192 EventBus.getDefault().post(new MessageEvent(Constant.SERVICE_STEP_COUNT_CONTINUE, ""));
199 //开始计时 193 //开始计时
@@ -215,7 +209,13 @@ public class RunMainFragmentView implements MvpView { @@ -215,7 +209,13 @@ public class RunMainFragmentView implements MvpView {
215 } 209 }
216 if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 210 if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
217 if (!stopStartFlag) { 211 if (!stopStartFlag) {
218 - setViewZoomIn(fragment.binding.flStop); 212 + fragment.binding.cpCurrent.setProgress(0);
  213 + fragment.binding.cpCurrent.setMax(100);
  214 + fragment.binding.cpCurrent.setCircleWidth(5);
  215 + fragment.binding.cpCurrent.setBackgroundColor(getContext().getResources().getColor(R.color.circle_stop));
  216 + fragment.binding.cpCurrent.setVisibility(View.VISIBLE);
  217 +
  218 + ButtonAnimUtil.setViewZoomIn(fragment.binding.flStop);
219 stopStartFlag = true; 219 stopStartFlag = true;
220 runnable = new Runnable() { 220 runnable = new Runnable() {
221 @Override 221 @Override
@@ -254,15 +254,11 @@ public class RunMainFragmentView implements MvpView { @@ -254,15 +254,11 @@ public class RunMainFragmentView implements MvpView {
254 } 254 }
255 } 255 }
256 }; 256 };
257 - fragment.binding.cpCurrent.setProgress(0);  
258 - fragment.binding.cpCurrent.setMax(100);  
259 - fragment.binding.cpCurrent.setCircleWidth(5);  
260 - fragment.binding.cpCurrent.setBackgroundColor(getContext().getResources().getColor(R.color.circle_stop));  
261 - fragment.binding.cpCurrent.setVisibility(View.VISIBLE);  
262 handler.postDelayed(runnable, 20); 257 handler.postDelayed(runnable, 20);
  258 +
263 } 259 }
264 } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { 260 } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
265 - setViewZoomOut(fragment.binding.flStop); 261 + ButtonAnimUtil.setViewZoomOut(fragment.binding.flStop);
266 stopStartFlag = false; 262 stopStartFlag = false;
267 fragment.binding.cpCurrent.setVisibility(View.GONE); 263 fragment.binding.cpCurrent.setVisibility(View.GONE);
268 stopIndex = 0; 264 stopIndex = 0;
@@ -276,12 +272,12 @@ public class RunMainFragmentView implements MvpView { @@ -276,12 +272,12 @@ public class RunMainFragmentView implements MvpView {
276 public boolean onTouch(View view, MotionEvent motionEvent) { 272 public boolean onTouch(View view, MotionEvent motionEvent) {
277 if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 273 if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
278 if (!pauseStartFlag) { 274 if (!pauseStartFlag) {
279 - setViewZoomIn(fragment.binding.flPause); 275 + ButtonAnimUtil.setViewZoomIn(fragment.binding.flPause);
280 pauseStartFlag = true; 276 pauseStartFlag = true;
281 277
282 } 278 }
283 } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { 279 } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
284 - setViewZoomOut(fragment.binding.flPause); 280 + ButtonAnimUtil.setViewZoomOut(fragment.binding.flPause);
285 pauseStartFlag = false; 281 pauseStartFlag = false;
286 } 282 }
287 return false; 283 return false;
@@ -293,18 +289,19 @@ public class RunMainFragmentView implements MvpView { @@ -293,18 +289,19 @@ public class RunMainFragmentView implements MvpView {
293 public void onClick(View view) { 289 public void onClick(View view) {
294 //将当前计时器时间戳写入数据库 290 //将当前计时器时间戳写入数据库
295 setSQLPauseTime(); 291 setSQLPauseTime();
296 - setViewHideZoomOut(fragment.binding.llPause); 292 + needWriteDataFlag = false;
  293 + ButtonAnimUtil.setViewHideZoomOut(fragment.binding.llPause);
297 handler.postDelayed(new Runnable() { 294 handler.postDelayed(new Runnable() {
298 @Override 295 @Override
299 public void run() { 296 public void run() {
300 //隐藏本身 297 //隐藏本身
301 fragment.binding.llPause.setVisibility(View.GONE); 298 fragment.binding.llPause.setVisibility(View.GONE);
302 } 299 }
303 - }, HIDE_VIEW_ZOOM_DURATION); 300 + }, ButtonAnimUtil.HIDE_VIEW_ZOOM_DURATION);
304 //显示继续按钮 301 //显示继续按钮
305 fragment.binding.llTwoBottomButton.setVisibility(View.VISIBLE); 302 fragment.binding.llTwoBottomButton.setVisibility(View.VISIBLE);
306 - setViewShowZoomIn(fragment.binding.flContinue);  
307 - setViewShowZoomIn(fragment.binding.flStop); 303 + ButtonAnimUtil.setViewShowZoomIn(fragment.binding.flContinue);
  304 + ButtonAnimUtil.setViewShowZoomIn(fragment.binding.flStop);
308 //停止计时 305 //停止计时
309 fragment.binding.chronometer.stop(); 306 fragment.binding.chronometer.stop();
310 mRecordTime = SystemClock.elapsedRealtime(); 307 mRecordTime = SystemClock.elapsedRealtime();
@@ -318,21 +315,37 @@ public class RunMainFragmentView implements MvpView { @@ -318,21 +315,37 @@ public class RunMainFragmentView implements MvpView {
318 fragment.binding.rlGps.setOnClickListener(new View.OnClickListener() { 315 fragment.binding.rlGps.setOnClickListener(new View.OnClickListener() {
319 @Override 316 @Override
320 public void onClick(View view) { 317 public void onClick(View view) {
321 - RunningMapActivity.startActivity(fragment.getActivity()); 318 + RunningMapBean runningMapBean = new RunningMapBean();
  319 + runningMapBean.setTimeBase(fragment.binding.chronometer.getBase());
  320 + //判断用户是否点击暂停按钮
  321 + if (needWriteDataFlag) {
  322 + runningMapBean.setPause(false);
  323 + runningMapBean.setRecordTime(SystemClock.elapsedRealtime());
  324 + }
  325 + //点击暂停
  326 + else {
  327 + runningMapBean.setPause(true);
  328 + runningMapBean.setPauseShowTime(fragment.binding.chronometer.getText().toString());
  329 + runningMapBean.setRecordTime(mRecordTime);
  330 + }
  331 + runningMapBean.setDistance(fragment.binding.tvRunDistance.getText().toString());
  332 + runningMapBean.setCurrentSpeed(fragment.binding.tvSpeed.getText().toString());
  333 + RunningMapActivity.startActivity(fragment.getActivity(), runningMapBean);
322 } 334 }
323 }); 335 });
324 } 336 }
325 337
326 public void setSQLPauseTime() { 338 public void setSQLPauseTime() {
327 - //将当前计时器时间戳写入数据库  
328 - UserStepEntity userStepEntity = StepUtil.getUserStepData(fragment.getActivity(), uid);  
329 - if (userStepEntity != null) {  
330 - userStepEntity.setPauseTimeStamp(fragment.binding.chronometer.getBase());  
331 - //设置当前暂停的时间戳  
332 - userStepEntity.setRecordTime(SystemClock.elapsedRealtime());  
333 - //更新数据  
334 - StepUtil.updateStepData(fragment.getActivity(), userStepEntity);  
335 - 339 + if (needWriteDataFlag) {
  340 + //将当前计时器时间戳写入数据库
  341 + UserStepEntity userStepEntity = StepUtil.getUserStepData(fragment.getActivity(), uid);
  342 + if (userStepEntity != null) {
  343 + userStepEntity.setPauseTimeStamp(fragment.binding.chronometer.getBase());
  344 + //设置当前暂停的时间戳
  345 + userStepEntity.setRecordTime(SystemClock.elapsedRealtime());
  346 + //更新数据
  347 + StepUtil.updateStepData(fragment.getActivity(), userStepEntity);
  348 + }
336 } 349 }
337 } 350 }
338 351
@@ -361,7 +374,8 @@ public class RunMainFragmentView implements MvpView { @@ -361,7 +374,8 @@ public class RunMainFragmentView implements MvpView {
361 //设置S速度 374 //设置S速度
362 int second = (int) ((SystemClock.elapsedRealtime() - fragment.binding.chronometer.getBase()) / 1000); 375 int second = (int) ((SystemClock.elapsedRealtime() - fragment.binding.chronometer.getBase()) / 1000);
363 if (second != 0) { 376 if (second != 0) {
364 - fragment.binding.tvSpeed.setText(StepUtil.getCurrentSpeed(second, StepUtil.getWalkDistanceKM(step) * 1000) + "m/s"); 377 +// fragment.binding.tvSpeed.setText(StepUtil.getCurrentSpeed(second, StepUtil.getWalkDistanceKM(step) * 1000)+"");
  378 + fragment.binding.tvSpeed.setText(StepUtil.getPaceSpeed(second, StepUtil.getWalkDistanceKM(step)));
365 } else { 379 } else {
366 fragment.binding.tvSpeed.setText("--"); 380 fragment.binding.tvSpeed.setText("--");
367 381
@@ -372,147 +386,6 @@ public class RunMainFragmentView implements MvpView { @@ -372,147 +386,6 @@ public class RunMainFragmentView implements MvpView {
372 fragment.binding.tvSpeed.setText("--"); 386 fragment.binding.tvSpeed.setText("--");
373 } 387 }
374 388
375 - //设置控件放大动画  
376 - private void setViewZoomIn(View view) {  
377 - AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画  
378 - ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1, 1.2f);  
379 - ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1, 1.2f);  
380 - animatorSetsuofang.setDuration(DEFAULT_ZOOM_DURATION);  
381 - animatorSetsuofang.setInterpolator(new DecelerateInterpolator());  
382 - animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始  
383 - animatorSetsuofang.start();  
384 - }  
385 -  
386 - //设置控件缩小动画  
387 - private void setViewZoomOut(View view) {  
388 - AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画  
389 - ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1.2f, 1);  
390 - ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1.2f, 1);  
391 - animatorSetsuofang.setDuration(DEFAULT_ZOOM_DURATION);  
392 - animatorSetsuofang.setInterpolator(new DecelerateInterpolator());  
393 - animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始  
394 - animatorSetsuofang.start();  
395 - }  
396 -  
397 - //设置控件显示放大动画  
398 - private void setViewShowZoomIn(View view) {  
399 - AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画  
400 - ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 0, 1.2f);  
401 - ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 0, 1.2f);  
402 - animatorSetsuofang.setDuration(SHOW_VIEW_ZOOM_DURATION);  
403 - animatorSetsuofang.setInterpolator(new DecelerateInterpolator());  
404 - animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始  
405 - animatorSetsuofang.start();  
406 - new Handler().postDelayed(new Runnable() {  
407 - @Override  
408 - public void run() {  
409 - AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画  
410 - ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1.2f, 1);  
411 - ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1.2f, 1);  
412 - animatorSetsuofang.setDuration(SHOW_VIEW_ZOOM_DURATION);  
413 - animatorSetsuofang.setInterpolator(new DecelerateInterpolator());  
414 - animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始  
415 - animatorSetsuofang.start();  
416 - }  
417 - }, SHOW_VIEW_ZOOM_DURATION);  
418 - }  
419 -  
420 - //设置控件隐藏缩小动画  
421 - private void setViewHideZoomOut(View view) {  
422 - AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画  
423 - ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1, 0);  
424 - ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1, 0);  
425 - animatorSetsuofang.setDuration(HIDE_VIEW_ZOOM_DURATION);  
426 - animatorSetsuofang.setInterpolator(new DecelerateInterpolator());  
427 - animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始  
428 - animatorSetsuofang.start();  
429 - }  
430 -  
431 - //设置时间显示放大动画  
432 - private void setTimeShowZoomIn(View view) {  
433 - ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 0, 1.4f);  
434 - ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 0, 1.4f);  
435 - ObjectAnimator scaleX1 = ObjectAnimator.ofFloat(view, "scaleX", 1.4f, 1);  
436 - ObjectAnimator scaleY1 = ObjectAnimator.ofFloat(view, "scaleY", 1.4f, 1);  
437 - ObjectAnimator scaleX2 = ObjectAnimator.ofFloat(view, "scaleX", 1, 0);  
438 - ObjectAnimator scaleY2 = ObjectAnimator.ofFloat(view, "scaleY", 1, 0);  
439 - AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画  
440 - animatorSetsuofang.setDuration(100);  
441 - animatorSetsuofang.setInterpolator(new DecelerateInterpolator());  
442 - animatorSetsuofang.play(scaleX).with(scaleY);  
443 - animatorSetsuofang.start();  
444 - new Handler().postDelayed(new Runnable() {  
445 - @Override  
446 - public void run() {  
447 - AnimatorSet animatorSetsuofang2 = new AnimatorSet();//组合动画  
448 - animatorSetsuofang2.setDuration(100);  
449 - animatorSetsuofang2.setInterpolator(new DecelerateInterpolator());  
450 - animatorSetsuofang2.play(scaleX1).with(scaleY1);  
451 - animatorSetsuofang2.start();  
452 - }  
453 - }, 100);  
454 -  
455 - new Handler().postDelayed(new Runnable() {  
456 - @Override  
457 - public void run() {  
458 - AnimatorSet animatorSetsuofang3 = new AnimatorSet();//组合动画  
459 - animatorSetsuofang3.setDuration(10);  
460 - animatorSetsuofang3.setInterpolator(new DecelerateInterpolator());  
461 - animatorSetsuofang3.play(scaleX2).with(scaleY2);  
462 - animatorSetsuofang3.start();  
463 - }  
464 - }, 300);  
465 -  
466 - }  
467 -  
468 - /**  
469 - * 设置控件展开特效  
470 - *  
471 - * @param view  
472 - * @param closeFlag  
473 - */  
474 - private void startAnimation(View view, boolean closeFlag) {  
475 - //因为CircularReveal动画是api21之后才有的,所以加个判断语句,免得崩溃  
476 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {  
477 - int cicular_R = view.getHeight() / 2 > view.getWidth() / 2 ? view.getHeight() / 2 : view.getWidth() / 2;  
478 - Animator animator = null;  
479 - if (!closeFlag) {  
480 - animator = ViewAnimationUtils.createCircularReveal(view, (int) view.getWidth() / 2, (int) view.getHeight() / 2, 0, cicular_R);  
481 - } else {  
482 - animator = ViewAnimationUtils.createCircularReveal(view, (int) view.getWidth() / 2, (int) view.getHeight() / 2, cicular_R, 0);  
483 - }  
484 - animator.addListener(new Animator.AnimatorListener() {  
485 - @Override  
486 - public void onAnimationStart(Animator animator) {  
487 -  
488 - }  
489 -  
490 - @Override  
491 - public void onAnimationEnd(Animator animator) {  
492 - if (closeFlag) {  
493 - view.setVisibility(View.GONE);  
494 - }  
495 - }  
496 -  
497 - @Override  
498 - public void onAnimationCancel(Animator animator) {  
499 -  
500 - }  
501 -  
502 - @Override  
503 - public void onAnimationRepeat(Animator animator) {  
504 -  
505 - }  
506 - });  
507 - animator.setDuration(350);  
508 - animator.start();  
509 - } else {  
510 - if (closeFlag) {  
511 - view.setVisibility(View.GONE);  
512 - }  
513 - }  
514 -  
515 - }  
516 389
517 } 390 }
518 391
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/view/RunRaceDetailFragmentView.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.frame.view;
  2 +
  3 +import android.content.Context;
  4 +
  5 +import com.cnlive.moudle.pedometer.ui.fragment.RunMainFragment;
  6 +import com.cnlive.moudle.pedometer.ui.fragment.RunRaceDetailFragment;
  7 +import com.hannesdorfmann.mosby3.mvp.MvpView;
  8 +
  9 +public class RunRaceDetailFragmentView implements MvpView {
  10 + private RunRaceDetailFragment fragment;
  11 +
  12 + public RunRaceDetailFragmentView(RunRaceDetailFragment fragment) {
  13 + this.fragment = fragment;
  14 + }
  15 +
  16 + public Context getContext() {
  17 + return fragment == null ? null : fragment.getActivity();
  18 + }
  19 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/view/RunningMapFragmentView.java
1 package com.cnlive.moudle.pedometer.frame.view; 1 package com.cnlive.moudle.pedometer.frame.view;
2 2
3 import android.content.Context; 3 import android.content.Context;
  4 +import android.graphics.Bitmap;
  5 +import android.graphics.BitmapFactory;
  6 +import android.hardware.Sensor;
  7 +import android.hardware.SensorEvent;
  8 +import android.hardware.SensorEventListener;
  9 +import android.hardware.SensorManager;
  10 +import android.os.SystemClock;
  11 +import android.util.Log;
  12 +import android.view.MotionEvent;
  13 +import android.view.View;
  14 +import android.widget.Chronometer;
4 15
  16 +import com.baidu.location.BDAbstractLocationListener;
  17 +import com.baidu.location.BDLocation;
  18 +import com.baidu.location.LocationClient;
  19 +import com.baidu.location.LocationClientOption;
  20 +import com.baidu.mapapi.map.BaiduMap;
  21 +import com.baidu.mapapi.map.BitmapDescriptor;
  22 +import com.baidu.mapapi.map.BitmapDescriptorFactory;
  23 +import com.baidu.mapapi.map.MapStatus;
  24 +import com.baidu.mapapi.map.MapStatusUpdateFactory;
  25 +import com.baidu.mapapi.map.MapView;
  26 +import com.baidu.mapapi.map.MarkerOptions;
  27 +import com.baidu.mapapi.map.MyLocationConfiguration;
  28 +import com.baidu.mapapi.map.MyLocationData;
  29 +import com.baidu.mapapi.map.UiSettings;
  30 +import com.baidu.mapapi.model.LatLng;
  31 +import com.cnlive.moudle.pedometer.model.RunningMapBean;
5 import com.cnlive.moudle.pedometer.ui.fragment.RunMainFragment; 32 import com.cnlive.moudle.pedometer.ui.fragment.RunMainFragment;
6 import com.cnlive.moudle.pedometer.ui.fragment.RunningMapFragment; 33 import com.cnlive.moudle.pedometer.ui.fragment.RunningMapFragment;
  34 +import com.cnlive.moudle.pedometer.utils.BitmapUtil;
  35 +import com.cnlive.moudle.pedometer.utils.ButtonAnimUtil;
  36 +import com.cnlive.moudle.pedometer.utils.StepUtil;
  37 +import com.example.moudle_pedometer.R;
7 import com.hannesdorfmann.mosby3.mvp.MvpView; 38 import com.hannesdorfmann.mosby3.mvp.MvpView;
8 39
9 -public class RunningMapFragmentView implements MvpView { 40 +import org.greenrobot.eventbus.EventBus;
  41 +
  42 +public class RunningMapFragmentView implements MvpView, SensorEventListener {
  43 + private static final String TAG = "RunningMapFragmentView";
10 private RunningMapFragment fragment; 44 private RunningMapFragment fragment;
  45 + private BaiduMap baiduMap;
  46 + private MapView mMapView;
  47 + private UiSettings mUiSettings;
  48 + private MyLocationConfiguration.LocationMode mCurrentMode;//定位模式
  49 + private BitmapDescriptor mCurrentMarker;//定位图标
  50 + private static int accuracyCircleFillColor;
  51 + private static int accuracyCircleStrokeColor;
  52 + private static MyLocationData mylocation;
  53 + boolean isFirstLoc = true; // 是否首次定位
  54 + private MarkerOptions currentMark;
  55 + private LatLng firstLatLng;
  56 + private Double lastX = 0.0;
  57 + private int mCurrentDirection = 0;
  58 + private double mCurrentLat = 0.0;
  59 + private double mCurrentLon = 0.0;
  60 + private float mCurrentAccracy;
  61 + // 定位相关
  62 + private LocationClient mLocClient;
  63 + public MyLocationListenner myListener = new MyLocationListenner();
11 64
12 public RunningMapFragmentView(RunningMapFragment fragment) { 65 public RunningMapFragmentView(RunningMapFragment fragment) {
13 this.fragment = fragment; 66 this.fragment = fragment;
@@ -18,5 +71,238 @@ public class RunningMapFragmentView implements MvpView { @@ -18,5 +71,238 @@ public class RunningMapFragmentView implements MvpView {
18 } 71 }
19 72
20 public void initView() { 73 public void initView() {
  74 + this.mMapView = fragment.binding.mapView;
  75 + if (baiduMap == null) {
  76 + baiduMap = mMapView.getMap();
  77 + }
  78 + if (mUiSettings == null) {
  79 + mUiSettings = baiduMap.getUiSettings();
  80 + }
  81 + //设置定位模式, 默认为 LocationMode.NORMAL 普通态
  82 + mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;
  83 + // 设置定位图标修改为自定义marker
  84 + Bitmap pointBitmap = BitmapUtil.getBitmapFromDp(getContext(), BitmapFactory.decodeResource(getContext().getResources(), R.drawable.rt_ic_location), 40, 40);
  85 + mCurrentMarker = BitmapDescriptorFactory.fromBitmap(pointBitmap);
  86 + //设置定位蓝点精度圆圈的填充颜色为透明色
  87 + accuracyCircleFillColor = getContext().getResources().getColor(R.color.transparent);
  88 + //设置定位蓝点精度圆圈的边框颜色的为透明色
  89 + accuracyCircleStrokeColor = getContext().getResources().getColor(R.color.transparent);
  90 + MyLocationConfiguration locationConfiguration = new MyLocationConfiguration(mCurrentMode,
  91 + true, mCurrentMarker, accuracyCircleFillColor, accuracyCircleStrokeColor);
  92 + //设置样式
  93 + baiduMap.setMyLocationConfiguration(locationConfiguration);
  94 + //启动所有手势
  95 + mUiSettings.setAllGesturesEnabled(true);
  96 + //通过设置enable为true或false 选择是否显示缩放按钮
  97 + mMapView.showZoomControls(false);
  98 + mUiSettings.setEnlargeCenterWithDoubleClickEnable(true);
  99 + //隐藏自带的指南针,改用自定义指南针 杨帅
  100 + baiduMap.getUiSettings().setCompassEnabled(true);
  101 + //显示定位图层
  102 + baiduMap.setMyLocationEnabled(true);
  103 + // 定位初始化
  104 + mLocClient = new LocationClient(getContext());
  105 + mLocClient.registerLocationListener(myListener);
  106 + LocationClientOption option = new LocationClientOption();
  107 + option.setOpenGps(true); // 打开gps
  108 + option.setCoorType("gcj02"); // 设置坐标类型
  109 + option.setScanSpan(3000);
  110 + mLocClient.setLocOption(option);
  111 + mLocClient.start();
  112 +
  113 + //返回键
  114 + fragment.binding.flBack.setOnTouchListener(new View.OnTouchListener() {
  115 + @Override
  116 + public boolean onTouch(View view, MotionEvent motionEvent) {
  117 + Log.e(TAG, "onTouch: " + motionEvent.getAction());
  118 + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
  119 + ButtonAnimUtil.setViewZoomIn(fragment.binding.flBack);
  120 + } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
  121 + ButtonAnimUtil.setViewZoomOut(fragment.binding.flBack);
  122 + }
  123 + return false;
  124 + }
  125 + });
  126 + //返回键点击事件
  127 + fragment.binding.flBack.setOnClickListener(new View.OnClickListener() {
  128 + @Override
  129 + public void onClick(View view) {
  130 + fragment.getActivity().finish();
  131 + }
  132 + });
  133 +//重新定位
  134 + fragment.binding.flLocation.setOnTouchListener(new View.OnTouchListener() {
  135 + @Override
  136 + public boolean onTouch(View view, MotionEvent motionEvent) {
  137 + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
  138 + ButtonAnimUtil.setViewZoomIn(fragment.binding.flLocation);
  139 + } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
  140 + ButtonAnimUtil.setViewZoomOut(fragment.binding.flLocation);
  141 + }
  142 + return false;
  143 + }
  144 + });
  145 + fragment.binding.flLocation.setOnClickListener(new View.OnClickListener() {
  146 + @Override
  147 + public void onClick(View view) {
  148 + mLocClient.restart();
  149 + isFirstLoc = true;
  150 + }
  151 + });
  152 +
  153 + }
  154 +
  155 +
  156 + /**
  157 + * //设置定位监听器,获取到用户当前位置 杨帅
  158 + * 定位SDK监听函数
  159 + */
  160 + public class MyLocationListenner extends BDAbstractLocationListener {
  161 +
  162 + @Override
  163 + public void onReceiveLocation(BDLocation location) {
  164 + // map view 销毁后不在处理新接收的位置
  165 + if (location == null || mMapView == null) {
  166 + return;
  167 + }
  168 +// mCurrentLat = location.getLatitude();
  169 +// mCurrentLon = location.getLongitude();
  170 + mCurrentAccracy = location.getRadius();
  171 + mylocation = new MyLocationData.Builder()
  172 + .accuracy(location.getRadius())
  173 + // 此处设置开发者获取到的方向信息,顺时针0-360
  174 + .direction(location.getDirection()).latitude(location.getLatitude())
  175 + .longitude(location.getLongitude()).build();
  176 + if (mylocation == null) {
  177 + return;
  178 + }
  179 +
  180 + MapStatus.Builder builder = new MapStatus.Builder();
  181 +
  182 + if (isFirstLoc) {
  183 + isFirstLoc = false;
  184 + firstLatLng = new LatLng(location.getLatitude(),
  185 + location.getLongitude());
  186 + baiduMap.setMyLocationData(mylocation);
  187 + builder.target(firstLatLng).zoom(17.0f);
  188 + baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
  189 +// //显示当前位置图标
  190 +// Bitmap pointBitmap = BitmapUtil.getBitmapFromDp(getContext(), BitmapFactory.decodeResource(getContext().getResources(), R.drawable.rt_ic_location), 40, 40);
  191 +// currentMark = new MarkerOptions().position(firstLatLng).icon(BitmapDescriptorFactory.fromBitmap(pointBitmap));
  192 +// baiduMap.addOverlay(currentMark);
  193 +
  194 +
  195 + }
  196 + }
  197 + }
  198 +
  199 +
  200 + /**
  201 + * 同步计时器
  202 + */
  203 + public void updateChronometer(RunningMapBean runningMapBean) {
  204 + //设置计时监听
  205 + fragment.binding.chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
  206 + @Override
  207 + public void onChronometerTick(Chronometer chronometer) {
  208 + int hour = (int) ((SystemClock.elapsedRealtime() - chronometer.getBase()) / 1000 / 60 / 60);
  209 + int minute = (int) ((SystemClock.elapsedRealtime() - chronometer.getBase()) / 1000 / 60) % 60;
  210 + int second = (int) ((SystemClock.elapsedRealtime() - chronometer.getBase()) / 1000) % 60;
  211 + if (hour < 1) {
  212 + if (minute == 59 && second == 59) {
  213 + chronometer.setFormat("0" + "%s");
  214 + } else {
  215 + chronometer.setFormat("0" + String.valueOf(hour) + ":%s");
  216 + }
  217 + } else if (hour < 10) {
  218 + chronometer.setFormat("0" + "%s");
  219 + } else {
  220 + chronometer.setFormat("%s");
  221 + }
  222 +
  223 + }
  224 + });
  225 + fragment.binding.chronometer.setBase(runningMapBean.getTimeBase() + (SystemClock.elapsedRealtime() - runningMapBean.getRecordTime()));
  226 + //判断是否点击暂停按钮
  227 + if (runningMapBean.isPause()) {
  228 + //点击暂停按钮,那么就只显示文本
  229 + fragment.binding.chronometer.setText(runningMapBean.getPauseShowTime());
  230 + } else {
  231 + fragment.binding.chronometer.start();
  232 + }
  233 + //设置速度
  234 + fragment.binding.tvCurrentSpeed.setText(runningMapBean.getCurrentSpeed());
  235 + //设置距离
  236 + fragment.binding.tvCurrentDiatance.setText(runningMapBean.getDistance());
  237 + }
  238 +
  239 + /**
  240 + * 更新行走距离
  241 + *
  242 + * @param step
  243 + */
  244 + public void updateRunDistance(int step) {
  245 + //设置行走公里
  246 + fragment.binding.tvCurrentDiatance.setText(StepUtil.getWalkDistanceKM(step) + "");
  247 + //设置行走步数
  248 + fragment.binding.tvCurrentSpeed.setText(step + "步");
  249 + //设置S速度
  250 + int second = (int) ((SystemClock.elapsedRealtime() - fragment.binding.chronometer.getBase()) / 1000);
  251 + if (second != 0) {
  252 +// fragment.binding.tvCurrentSpeed.setText(StepUtil.getCurrentSpeed(second, StepUtil.getWalkDistanceKM(step) * 1000) + "");
  253 + fragment.binding.tvCurrentSpeed.setText(StepUtil.getPaceSpeed(second, StepUtil.getWalkDistanceKM(step)));
  254 + } else {
  255 + fragment.binding.tvCurrentSpeed.setText("--");
  256 + }
  257 + }
  258 +
  259 + public void resetSpeed() {
  260 + fragment.binding.tvCurrentSpeed.setText("--");
  261 + }
  262 +
  263 + @Override
  264 + public void onSensorChanged(SensorEvent sensorEvent) {
  265 + double x = sensorEvent.values[SensorManager.DATA_X];
  266 + if (Math.abs(x - lastX) > 1.0) {
  267 + mCurrentDirection = (int) x;
  268 + if (firstLatLng != null) {
  269 + mylocation = new MyLocationData.Builder()
  270 + .accuracy(mCurrentAccracy)
  271 + // 此处设置开发者获取到的方向信息,顺时针0-360
  272 + .direction(mCurrentDirection).latitude(firstLatLng.latitude)
  273 + .longitude(firstLatLng.longitude).build();
  274 + baiduMap.setMyLocationData(mylocation);
  275 + }
  276 + }
  277 + lastX = x;
  278 + }
  279 +
  280 + @Override
  281 + public void onAccuracyChanged(Sensor sensor, int i) {
  282 +
21 } 283 }
  284 +
  285 + public void onResume() {
  286 + if (mMapView != null) {
  287 + mMapView.onResume();
  288 + }
  289 + }
  290 +
  291 + public void onPause() {
  292 + if (mMapView != null) {
  293 + mMapView.onPause();
  294 + }
  295 + }
  296 +
  297 + public void onDestroy() {
  298 + if (mMapView != null) {
  299 + mMapView.onDestroy();
  300 + mMapView = null;
  301 + }
  302 + if (mLocClient != null) {
  303 + mLocClient.stop();
  304 + }
  305 + }
  306 +
  307 +
22 } 308 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/model/Constant.java
@@ -5,6 +5,7 @@ public class Constant { @@ -5,6 +5,7 @@ public class Constant {
5 public static final int SERVICE_STEP_COUNT_PAUSE = 1;//步数暂停 5 public static final int SERVICE_STEP_COUNT_PAUSE = 1;//步数暂停
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 9
9 10
10 } 11 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/model/RunningMapBean.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.model;
  2 +
  3 +import java.io.Serializable;
  4 +
  5 +/**
  6 + * 计时器相关数据
  7 + *
  8 + * @author ShinnyYang
  9 + */
  10 +public class RunningMapBean implements Serializable {
  11 + public RunningMapBean() {
  12 + }
  13 +
  14 +// public RunningMapBean(long timeBase, String formatTime) {
  15 +// this.timeBase = timeBase;
  16 +// this.formatTime = formatTime;
  17 +// }
  18 +
  19 + private long timeBase;
  20 + private long recordTime;
  21 + private String formatTime;
  22 + private String currentSpeed;
  23 + private String distance;
  24 + private String pauseShowTime;
  25 + private boolean pause;
  26 +
  27 + public long getRecordTime() {
  28 + return recordTime;
  29 + }
  30 +
  31 + public void setRecordTime(long recordTime) {
  32 + this.recordTime = recordTime;
  33 + }
  34 +
  35 + public long getTimeBase() {
  36 + return timeBase;
  37 + }
  38 +
  39 + public void setTimeBase(long timeBase) {
  40 + this.timeBase = timeBase;
  41 + }
  42 +
  43 + public String getFormatTime() {
  44 + return formatTime;
  45 + }
  46 +
  47 + public void setFormatTime(String formatTime) {
  48 + this.formatTime = formatTime;
  49 + }
  50 +
  51 + public String getCurrentSpeed() {
  52 + return currentSpeed;
  53 + }
  54 +
  55 + public void setCurrentSpeed(String currentSpeed) {
  56 + this.currentSpeed = currentSpeed;
  57 + }
  58 +
  59 + public String getDistance() {
  60 + return distance;
  61 + }
  62 +
  63 + public void setDistance(String distance) {
  64 + this.distance = distance;
  65 + }
  66 +
  67 + public boolean isPause() {
  68 + return pause;
  69 + }
  70 +
  71 + public void setPause(boolean pause) {
  72 + this.pause = pause;
  73 + }
  74 +
  75 + public String getPauseShowTime() {
  76 + return pauseShowTime;
  77 + }
  78 +
  79 + public void setPauseShowTime(String pauseShowTime) {
  80 + this.pauseShowTime = pauseShowTime;
  81 + }
  82 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/service/StepService.java
@@ -140,8 +140,8 @@ public class StepService extends Service implements SensorEventListener { @@ -140,8 +140,8 @@ public class StepService extends Service implements SensorEventListener {
140 @SuppressLint("WrongConstant") 140 @SuppressLint("WrongConstant")
141 @Override 141 @Override
142 public int onStartCommand(Intent intent, int flags, int startId) { 142 public int onStartCommand(Intent intent, int flags, int startId) {
143 - userId = intent.getExtras().getString("userId");  
144 - if (userId != null) { 143 + if (intent.getExtras().getString("userId") != null) {
  144 + userId = intent.getExtras().getString("userId");
145 if (!EventBus.getDefault().isRegistered(this)) { 145 if (!EventBus.getDefault().isRegistered(this)) {
146 EventBus.getDefault().register(this); 146 EventBus.getDefault().register(this);
147 } 147 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/activity/PedometerMainActivity.java
1 package com.cnlive.moudle.pedometer.ui.activity; 1 package com.cnlive.moudle.pedometer.ui.activity;
2 2
3 import android.Manifest; 3 import android.Manifest;
  4 +import android.content.Context;
4 import android.content.Intent; 5 import android.content.Intent;
5 import android.content.pm.PackageInfo; 6 import android.content.pm.PackageInfo;
6 import android.content.pm.PackageManager; 7 import android.content.pm.PackageManager;
  8 +import android.location.LocationManager;
7 import android.os.Build; 9 import android.os.Build;
8 import android.provider.Settings; 10 import android.provider.Settings;
9 import android.os.Bundle; 11 import android.os.Bundle;
  12 +import android.support.annotation.NonNull;
10 import android.support.v4.app.NotificationManagerCompat; 13 import android.support.v4.app.NotificationManagerCompat;
11 import android.support.v4.content.ContextCompat; 14 import android.support.v4.content.ContextCompat;
12 import android.util.Log; 15 import android.util.Log;
@@ -19,6 +22,8 @@ import com.cnlive.libs.base.ui.QMUIFragment; @@ -19,6 +22,8 @@ import com.cnlive.libs.base.ui.QMUIFragment;
19 import com.cnlive.libs.base.ui.QMUIFragmentActivity; 22 import com.cnlive.libs.base.ui.QMUIFragmentActivity;
20 import com.cnlive.libs.base.util.StatusBarUtil2; 23 import com.cnlive.libs.base.util.StatusBarUtil2;
21 import com.cnlive.moudle.pedometer.ui.fragment.RunMainFragment; 24 import com.cnlive.moudle.pedometer.ui.fragment.RunMainFragment;
  25 +import com.cnlive.moudle.pedometer.utils.lib_permisshelper.PermissionsListener;
  26 +import com.cnlive.moudle.pedometer.utils.lib_permisshelper.PermissionsUtils;
22 import com.example.moudle_pedometer.R; 27 import com.example.moudle_pedometer.R;
23 28
24 29
@@ -30,8 +35,11 @@ import static android.provider.Settings.EXTRA_APP_PACKAGE; @@ -30,8 +35,11 @@ import static android.provider.Settings.EXTRA_APP_PACKAGE;
30 */ 35 */
31 @Route(path = "/moudle_pedometer/InterestActivity") 36 @Route(path = "/moudle_pedometer/InterestActivity")
32 public class PedometerMainActivity extends QMUIFragmentActivity { 37 public class PedometerMainActivity extends QMUIFragmentActivity {
  38 + private static final String TAG = "PedometerMainActivity";
  39 +
33 private NotificationManagerCompat notificationManagerCompat; 40 private NotificationManagerCompat notificationManagerCompat;
34 private boolean isOpen; 41 private boolean isOpen;
  42 + private PermissionsUtils mPermissionsUtils = new PermissionsUtils();//权限申请
35 43
36 @Override 44 @Override
37 protected int getContextViewId() { 45 protected int getContextViewId() {
@@ -49,7 +57,7 @@ public class PedometerMainActivity extends QMUIFragmentActivity { @@ -49,7 +57,7 @@ public class PedometerMainActivity extends QMUIFragmentActivity {
49 //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。 57 //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
50 SDKInitializer.setCoordType(CoordType.GCJ02); 58 SDKInitializer.setCoordType(CoordType.GCJ02);
51 // setContentView(R.layout.activity_pedometer_main); 59 // setContentView(R.layout.activity_pedometer_main);
52 - addFragment(); 60 + getPermissionsWithTip();
53 } 61 }
54 62
55 63
@@ -155,5 +163,83 @@ public class PedometerMainActivity extends QMUIFragmentActivity { @@ -155,5 +163,83 @@ public class PedometerMainActivity extends QMUIFragmentActivity {
155 } 163 }
156 164
157 165
  166 + /**
  167 + * 一次申请一组权限(使用拒绝弹框)点击事件
  168 + */
  169 + public void getPermissionsWithTip() {
  170 + mPermissionsUtils
  171 + .setPermissionsListener(new PermissionsListener() {
  172 + @Override
  173 + public void onDenied(String[] deniedPermissions) {
  174 + getPermissionsWithTip();
  175 + Log.e(TAG, "onDenied: ");
  176 + }
  177 +
  178 + @Override
  179 + public void onGranted() {
  180 +
  181 + //判断GPS是否开启
  182 + if (!isOPen(getApplicationContext())) {
  183 +// KLog.e("gps未开启");
  184 +// //开启GPS
  185 + Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
  186 + startActivityForResult(intent, 10);
  187 + } else {
  188 + addFragment();
  189 + }
  190 + }
  191 + })
  192 + .withActivity(PedometerMainActivity.this)
  193 + .getPermissions(PedometerMainActivity.this
  194 + , 100
  195 + , Manifest.permission.INTERNET
  196 + , Manifest.permission.READ_EXTERNAL_STORAGE
  197 + , Manifest.permission.WRITE_EXTERNAL_STORAGE
  198 + , Manifest.permission.ACCESS_FINE_LOCATION
  199 + , Manifest.permission.ACCESS_COARSE_LOCATION
  200 + );
  201 +// .getPermissionsWithTips(MainActivity.this
  202 +// ,100
  203 +// , new String[]{"人家要录音","我们需要读取你的信息,磨磨唧唧的","我要上网","我要读内存卡","我要看日历","我要定位"}
  204 +// , Manifest.permission.RECORD_AUDIO
  205 +// , Manifest.permission.READ_SMS
  206 +// , Manifest.permission.INTERNET
  207 +// , Manifest.permission.READ_EXTERNAL_STORAGE
  208 +// , Manifest.permission.READ_CALENDAR
  209 +// , Manifest.permission.ACCESS_FINE_LOCATION);
  210 + }
  211 +
  212 + /**
  213 + * 判断GPS是否开启,GPS或者AGPS开启一个就认为是开启的
  214 + *
  215 + * @param context
  216 + * @return true 表示开启
  217 + */
  218 + public static final boolean isOPen(final Context context) {
  219 + LocationManager locationManager
  220 + = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
  221 + // 通过GPS卫星定位,定位级别可以精确到街(通过24颗卫星定位,在室外和空旷的地方定位准确、速度快)
  222 + boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
  223 + // 通过WLAN或移动网络(3G/2G)确定的位置(也称作AGPS,辅助GPS定位。主要用于在室内或遮盖物(建筑群或茂密的深林等)密集的地方定位)
  224 + boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
  225 + if (gps || network) {
  226 + return true;
  227 + }
  228 +
  229 + return false;
  230 + }
158 231
  232 + /**
  233 + * 权限回调
  234 + *
  235 + * @param requestCode
  236 + * @param permissions
  237 + * @param grantResults
  238 + */
  239 + @Override
  240 + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
  241 + @NonNull int[] grantResults) {
  242 + super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  243 + mPermissionsUtils.dealResult(requestCode, permissions, grantResults);
  244 + }
159 } 245 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/activity/RunRaceDetailActivity.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.ui.activity;
  2 +
  3 +import android.os.Bundle;
  4 +import android.support.design.widget.BottomSheetDialog;
  5 +import android.view.View;
  6 +
  7 +import com.alibaba.android.arouter.facade.annotation.Route;
  8 +import com.baidu.mapapi.CoordType;
  9 +import com.baidu.mapapi.SDKInitializer;
  10 +import com.cnlive.libs.base.ui.QMUIFragment;
  11 +import com.cnlive.libs.base.ui.QMUIFragmentActivity;
  12 +import com.cnlive.libs.base.util.StatusBarUtil2;
  13 +import com.cnlive.moudle.pedometer.model.RunningMapBean;
  14 +import com.cnlive.moudle.pedometer.ui.fragment.RunRaceDetailFragment;
  15 +import com.cnlive.moudle.pedometer.ui.fragment.RunningMapFragment;
  16 +import com.example.moudle_pedometer.R;
  17 +
  18 +/**
  19 + * 活动赛事详情页
  20 + *
  21 + * @author ShinnyYang
  22 + */
  23 +@Route(path = "/moudle_pedometer/RunRaceDetailActivity")
  24 +public class RunRaceDetailActivity extends QMUIFragmentActivity {
  25 + @Override
  26 + protected int getContextViewId() {
  27 + return R.id.fragment_run_trace_detail;
  28 + }
  29 +
  30 + @Override
  31 + protected void onCreate(Bundle savedInstanceState) {
  32 + super.onCreate(savedInstanceState);
  33 + StatusBarUtil2.setColor(this, getResources().getColor(R.color.run_main_bg), 0);
  34 + //在使用SDK各组件之前初始化context信息,传入ApplicationContext
  35 + SDKInitializer.initialize(getApplicationContext());
  36 + //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
  37 + //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
  38 + SDKInitializer.setCoordType(CoordType.GCJ02);
  39 + addFragment();
  40 + BottomSheetDialog bottomSheetDialog=new BottomSheetDialog(this);
  41 + View view=getLayoutInflater().inflate(R.layout.bottom_sheet_dialog_run_race_detail,null);
  42 + bottomSheetDialog.setContentView(view);
  43 + bottomSheetDialog.show();
  44 + bottomSheetDialog.setCancelable(false);
  45 + }
  46 +
  47 + private void addFragment() {
  48 + QMUIFragment fragment = new RunRaceDetailFragment();
  49 + getSupportFragmentManager().beginTransaction()
  50 + .add(getContextViewId(), fragment, fragment.getClass().getSimpleName())
  51 + .addToBackStack(fragment.getClass().getSimpleName())
  52 + .commit();
  53 + }
  54 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/activity/RunningMapActivity.java
@@ -10,20 +10,31 @@ import android.view.View; @@ -10,20 +10,31 @@ import android.view.View;
10 import android.view.Window; 10 import android.view.Window;
11 import android.view.WindowManager; 11 import android.view.WindowManager;
12 12
  13 +import com.baidu.mapapi.CoordType;
  14 +import com.baidu.mapapi.SDKInitializer;
13 import com.cnlive.libs.base.ui.QMUIFragment; 15 import com.cnlive.libs.base.ui.QMUIFragment;
14 import com.cnlive.libs.base.ui.QMUIFragmentActivity; 16 import com.cnlive.libs.base.ui.QMUIFragmentActivity;
15 import com.cnlive.libs.base.util.StatusBarUtil2; 17 import com.cnlive.libs.base.util.StatusBarUtil2;
16 -import com.cnlive.moudle.pedometer.ui.fragment.RunMainFragment; 18 +import com.cnlive.moudle.pedometer.model.RunningMapBean;
17 import com.cnlive.moudle.pedometer.ui.fragment.RunningMapFragment; 19 import com.cnlive.moudle.pedometer.ui.fragment.RunningMapFragment;
18 import com.example.moudle_pedometer.R; 20 import com.example.moudle_pedometer.R;
19 -import com.qmuiteam.qmui.util.QMUIStatusBarHelper;  
20 21
21 public class RunningMapActivity extends QMUIFragmentActivity { 22 public class RunningMapActivity extends QMUIFragmentActivity {
  23 + private static final String TAG = "RunningMapActivity";
  24 +
22 @Override 25 @Override
23 protected void onCreate(Bundle savedInstanceState) { 26 protected void onCreate(Bundle savedInstanceState) {
24 super.onCreate(savedInstanceState); 27 super.onCreate(savedInstanceState);
  28 + //在使用SDK各组件之前初始化context信息,传入ApplicationContext
  29 + SDKInitializer.initialize(getApplicationContext());
  30 + //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
  31 + //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
  32 + SDKInitializer.setCoordType(CoordType.GCJ02);
25 StatusBarUtil2.setColor(this, getResources().getColor(R.color.run_main_bg), 0); 33 StatusBarUtil2.setColor(this, getResources().getColor(R.color.run_main_bg), 0);
26 - addFragment(); 34 + RunningMapBean chronometerBean = (RunningMapBean) getIntent().getExtras().getSerializable("runningMapBean");
  35 + if (chronometerBean != null) {
  36 + addFragment(chronometerBean);
  37 + }
27 } 38 }
28 39
29 /** 40 /**
@@ -59,16 +70,17 @@ public class RunningMapActivity extends QMUIFragmentActivity { @@ -59,16 +70,17 @@ public class RunningMapActivity extends QMUIFragmentActivity {
59 return R.id.fragment_running_map; 70 return R.id.fragment_running_map;
60 } 71 }
61 72
62 - private void addFragment() {  
63 - QMUIFragment fragment = new RunningMapFragment(); 73 + private void addFragment(RunningMapBean chronometerBean) {
  74 + QMUIFragment fragment = RunningMapFragment.getInstance(chronometerBean);
64 getSupportFragmentManager().beginTransaction() 75 getSupportFragmentManager().beginTransaction()
65 .add(getContextViewId(), fragment, fragment.getClass().getSimpleName()) 76 .add(getContextViewId(), fragment, fragment.getClass().getSimpleName())
66 .addToBackStack(fragment.getClass().getSimpleName()) 77 .addToBackStack(fragment.getClass().getSimpleName())
67 .commit(); 78 .commit();
68 } 79 }
69 80
70 - public static void startActivity(Activity activity) { 81 + public static void startActivity(Activity activity, RunningMapBean runningMapBean) {
71 Intent intent = new Intent(activity, RunningMapActivity.class); 82 Intent intent = new Intent(activity, RunningMapActivity.class);
  83 + intent.putExtra("runningMapBean", runningMapBean);
72 activity.startActivity(intent); 84 activity.startActivity(intent);
73 } 85 }
74 } 86 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/fragment/RunMainFragment.java
@@ -26,27 +26,6 @@ public class RunMainFragment extends QMUIFragment&lt;RunMainFragmentView, RunMainFr @@ -26,27 +26,6 @@ public class RunMainFragment extends QMUIFragment&lt;RunMainFragmentView, RunMainFr
26 26
27 27
28 @Override 28 @Override
29 - protected int getToolbarId() {  
30 - return 0;  
31 - }  
32 -  
33 - @Override  
34 - public String getTitle() {  
35 - return null;  
36 - }  
37 -  
38 - @Override  
39 - protected int getLayoutId() {  
40 - return R.layout.fragment_run_main;  
41 - }  
42 -  
43 - @Override  
44 - public void onActivityCreated(@Nullable Bundle savedInstanceState) {  
45 - super.onActivityCreated(savedInstanceState);  
46 -  
47 - }  
48 -  
49 - @Override  
50 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 29 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
51 super.onViewCreated(view, savedInstanceState); 30 super.onViewCreated(view, savedInstanceState);
52 EventBus.getDefault().register(this); 31 EventBus.getDefault().register(this);
@@ -65,6 +44,21 @@ public class RunMainFragment extends QMUIFragment&lt;RunMainFragmentView, RunMainFr @@ -65,6 +44,21 @@ public class RunMainFragment extends QMUIFragment&lt;RunMainFragmentView, RunMainFr
65 } 44 }
66 45
67 @Override 46 @Override
  47 + public void onActivityCreated(@Nullable Bundle savedInstanceState) {
  48 + super.onActivityCreated(savedInstanceState);
  49 +
  50 + }
  51 +
  52 + @Override
  53 + public void onPause() {
  54 + super.onPause();
  55 + //记录当前计时器相关数据
  56 + if (getMvpView() != null) {
  57 + getMvpView().setSQLPauseTime();
  58 + }
  59 + }
  60 +
  61 + @Override
68 public void onDestroy() { 62 public void onDestroy() {
69 63
70 super.onDestroy(); 64 super.onDestroy();
@@ -73,6 +67,21 @@ public class RunMainFragment extends QMUIFragment&lt;RunMainFragmentView, RunMainFr @@ -73,6 +67,21 @@ public class RunMainFragment extends QMUIFragment&lt;RunMainFragmentView, RunMainFr
73 } 67 }
74 } 68 }
75 69
  70 + @Override
  71 + protected int getToolbarId() {
  72 + return 0;
  73 + }
  74 +
  75 + @Override
  76 + public String getTitle() {
  77 + return null;
  78 + }
  79 +
  80 + @Override
  81 + protected int getLayoutId() {
  82 + return R.layout.fragment_run_main;
  83 + }
  84 +
76 @Subscribe(threadMode = ThreadMode.MAIN) 85 @Subscribe(threadMode = ThreadMode.MAIN)
77 public void Event(MessageEvent messageEvent) { 86 public void Event(MessageEvent messageEvent) {
78 //更新步数 87 //更新步数
@@ -89,12 +98,4 @@ public class RunMainFragment extends QMUIFragment&lt;RunMainFragmentView, RunMainFr @@ -89,12 +98,4 @@ public class RunMainFragment extends QMUIFragment&lt;RunMainFragmentView, RunMainFr
89 } 98 }
90 } 99 }
91 100
92 - @Override  
93 - public void onPause() {  
94 - super.onPause();  
95 - //记录当前计时器相关数据  
96 - if (getMvpView() != null) {  
97 - getMvpView().setSQLPauseTime();  
98 - }  
99 - }  
100 } 101 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/fragment/RunRaceDetailFragment.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.ui.fragment;
  2 +
  3 +import com.cnlive.libs.base.ui.QMUIFragment;
  4 +import com.cnlive.moudle.pedometer.frame.presenter.RunRaceDetailFragmentPresenter;
  5 +import com.cnlive.moudle.pedometer.frame.view.RunRaceDetailFragmentView;
  6 +import com.example.moudle_pedometer.R;
  7 +import com.example.moudle_pedometer.databinding.FragmentRunRaceDetailBinding;
  8 +
  9 +/**
  10 + * 活动赛事详情页
  11 + *
  12 + * @author ShinnyYang
  13 + */
  14 +public class RunRaceDetailFragment extends QMUIFragment<RunRaceDetailFragmentView, RunRaceDetailFragmentPresenter, FragmentRunRaceDetailBinding> {
  15 + @Override
  16 + protected int getToolbarId() {
  17 + return 0;
  18 + }
  19 +
  20 + @Override
  21 + public String getTitle() {
  22 + return null;
  23 + }
  24 +
  25 + @Override
  26 + protected int getLayoutId() {
  27 + return R.layout.fragment_run_race_detail;
  28 + }
  29 +}
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.hardware.Sensor;
  4 +import android.hardware.SensorManager;
3 import android.os.Bundle; 5 import android.os.Bundle;
4 import android.support.annotation.Nullable; 6 import android.support.annotation.Nullable;
  7 +import android.util.Log;
  8 +import android.view.View;
5 9
6 import com.cnlive.libs.base.ui.QMUIFragment; 10 import com.cnlive.libs.base.ui.QMUIFragment;
7 import com.cnlive.libs.base.util.StatusBarUtil2; 11 import com.cnlive.libs.base.util.StatusBarUtil2;
8 import com.cnlive.moudle.pedometer.frame.presenter.RunningMapFragmentPresenter; 12 import com.cnlive.moudle.pedometer.frame.presenter.RunningMapFragmentPresenter;
9 import com.cnlive.moudle.pedometer.frame.view.RunningMapFragmentView; 13 import com.cnlive.moudle.pedometer.frame.view.RunningMapFragmentView;
  14 +import com.cnlive.moudle.pedometer.model.RunningMapBean;
  15 +import com.cnlive.moudle.pedometer.model.Constant;
  16 +import com.cnlive.moudle.pedometer.model.MessageEvent;
10 import com.example.moudle_pedometer.R; 17 import com.example.moudle_pedometer.R;
11 import com.example.moudle_pedometer.databinding.FragmentRunningMapBinding; 18 import com.example.moudle_pedometer.databinding.FragmentRunningMapBinding;
12 -import com.qmuiteam.qmui.util.QMUIStatusBarHelper;  
13 19
  20 +import org.greenrobot.eventbus.EventBus;
  21 +import org.greenrobot.eventbus.Subscribe;
  22 +import org.greenrobot.eventbus.ThreadMode;
  23 +
  24 +import static android.content.Context.SENSOR_SERVICE;
  25 +
  26 +/**
  27 + * 正在跑步的地图界面
  28 + *
  29 + * @author ShinnyYang
  30 + */
14 public class RunningMapFragment extends QMUIFragment<RunningMapFragmentView, RunningMapFragmentPresenter, FragmentRunningMapBinding> { 31 public class RunningMapFragment extends QMUIFragment<RunningMapFragmentView, RunningMapFragmentPresenter, FragmentRunningMapBinding> {
  32 + private static final String TAG = "RunningMapFragment";
  33 + private RunningMapBean runningMapBean;
  34 + private SensorManager mSensorManager;
  35 +
15 @Override 36 @Override
16 protected int getToolbarId() { 37 protected int getToolbarId() {
17 return 0; 38 return 0;
@@ -27,10 +48,92 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run @@ -27,10 +48,92 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run
27 return R.layout.fragment_running_map; 48 return R.layout.fragment_running_map;
28 } 49 }
29 50
  51 + public static RunningMapFragment getInstance(RunningMapBean runningMapBean) {
  52 + RunningMapFragment fragment = new RunningMapFragment();
  53 + Bundle bundle = new Bundle();
  54 + if (runningMapBean != null) {
  55 + bundle.putSerializable("runningMapBean", runningMapBean);
  56 + }
  57 + fragment.setArguments(bundle);
  58 + return fragment;
  59 + }
  60 +
30 @Override 61 @Override
31 public void onActivityCreated(@Nullable Bundle savedInstanceState) { 62 public void onActivityCreated(@Nullable Bundle savedInstanceState) {
32 super.onActivityCreated(savedInstanceState); 63 super.onActivityCreated(savedInstanceState);
33 StatusBarUtil2.setColor(getActivity(), getResources().getColor(R.color.run_main_bg), 0); 64 StatusBarUtil2.setColor(getActivity(), getResources().getColor(R.color.run_main_bg), 0);
  65 + }
  66 +
  67 + @Override
  68 + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
  69 + super.onViewCreated(view, savedInstanceState);
  70 + EventBus.getDefault().register(this);
  71 + mSensorManager = (SensorManager) getActivity().getSystemService(SENSOR_SERVICE);//获取传感器管理服务
  72 + if (getArguments() != null) {
  73 + runningMapBean = (RunningMapBean) getArguments().getSerializable("runningMapBean");
  74 + }
  75 + if (getMvpView() != null) {
  76 + getMvpView().initView();
  77 + if (runningMapBean != null) {
  78 + getMvpView().updateChronometer(runningMapBean);
  79 + }
  80 + }
  81 + }
  82 +
  83 + @Override
  84 + public void onResume() {
  85 + super.onResume();
  86 + if (getMvpView() != null) {
  87 + getMvpView().onResume();
  88 + }
  89 + if (getMvpView() != null) {
  90 + //为系统的方向传感器注册监听器
  91 + mSensorManager.registerListener(getMvpView(), mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
  92 + SensorManager.SENSOR_DELAY_UI);
  93 + }
  94 + }
  95 +
  96 + @Override
  97 + public void onStop() {
  98 + super.onStop();
  99 + if (getMvpView() != null) {
  100 + //取消注册传感器监听
  101 + mSensorManager.unregisterListener(getMvpView());
  102 + }
  103 + }
  104 +
  105 + @Override
  106 + public void onPause() {
  107 + super.onPause();
  108 + if (getMvpView() != null) {
  109 + getMvpView().onPause();
  110 + }
  111 + }
  112 +
  113 + @Override
  114 + public void onDestroy() {
  115 + super.onDestroy();
  116 + if (getMvpView() != null) {
  117 + getMvpView().onDestroy();
  118 + }
  119 + if (EventBus.getDefault().isRegistered(this)) {
  120 + EventBus.getDefault().unregister(this);
  121 + }
  122 + }
34 123
  124 + @Subscribe(threadMode = ThreadMode.MAIN)
  125 + public void Event(MessageEvent messageEvent) {
  126 + //更新步数
  127 + if (messageEvent.getMessageType() == Constant.SERVICE_STEP_COUNT_UPDATE) {
  128 + if (getMvpView() != null) {
  129 + getMvpView().updateRunDistance((Integer) messageEvent.getMessageContent());
  130 + }
  131 + }
  132 + //重置速度
  133 + else if (messageEvent.getMessageType() == Constant.SERVICE_STEP_COUNT_RESET_SPEED) {
  134 + if (getMvpView() != null) {
  135 + getMvpView().resetSpeed();
  136 + }
  137 + }
35 } 138 }
36 } 139 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/widget/FivePersonIconView.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.ui.widget;
  2 +
  3 +import android.content.Context;
  4 +import android.os.Build;
  5 +import android.support.annotation.Nullable;
  6 +import android.util.AttributeSet;
  7 +import android.util.Log;
  8 +import android.view.LayoutInflater;
  9 +import android.view.View;
  10 +import android.widget.ImageView;
  11 +import android.widget.LinearLayout;
  12 +
  13 +import com.example.moudle_pedometer.R;
  14 +import com.qmuiteam.qmui.widget.QMUIRadiusImageView;
  15 +
  16 +/**
  17 + * 5个连续的用户头像
  18 + *
  19 + * @author ShinnyYang
  20 + */
  21 +public class FivePersonIconView extends LinearLayout {
  22 + private static final String TAG = "FivePersonIconView";
  23 + private Context context;
  24 + private QMUIRadiusImageView qr1;
  25 + private QMUIRadiusImageView qr2;
  26 + private QMUIRadiusImageView qr3;
  27 + private QMUIRadiusImageView qr4;
  28 + private QMUIRadiusImageView qr5;
  29 + private ImageView iv_right;
  30 + private int index = 0;
  31 + private final int MAX_ICON = 5;//一共有多少个icon
  32 + private final int DEFAULT_LEFT_MARGIN = 10;//默认左侧缩进多少(单位dp)
  33 + private boolean isShowRight;
  34 +// public FivePersonIconView(Context context) {
  35 +// super(context);
  36 +// this.context = context;
  37 +//
  38 +// }
  39 +
  40 + public FivePersonIconView(Context context, AttributeSet attrs) {
  41 + super(context, attrs);
  42 + this.context = context;
  43 + //加载布局文件
  44 + LayoutInflater.from(context).inflate(R.layout.five_persion_icon, this);
  45 + qr1 = findViewById(R.id.qm_iv1);
  46 + qr2 = findViewById(R.id.qm_iv2);
  47 + qr3 = findViewById(R.id.qm_iv3);
  48 + qr4 = findViewById(R.id.qm_iv4);
  49 + qr5 = findViewById(R.id.qm_iv5);
  50 + iv_right = findViewById(R.id.iv_right);
  51 + isShowRight = true;
  52 + if (!isShowRight) {
  53 + iv_right.setVisibility(GONE);
  54 + } else {
  55 + iv_right.setVisibility(VISIBLE);
  56 + }
  57 + }
  58 +
  59 +// public FivePersonIconView(Context context, AttributeSet attrs, int defStyleAttr) {
  60 +// super(context, attrs, defStyleAttr);
  61 +// this.context = context;
  62 +//
  63 +// }
  64 +
  65 +
  66 + @Override
  67 + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  68 + super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  69 + index++;
  70 + if (index == 1) {
  71 + Log.e(TAG, "onMeasure:");
  72 + //根据xml中我们编码时给的宽和高,动态设置这5个图标的距离
  73 + //计算不进行左侧缩进时,总体宽度
  74 + int noMargin = 0;
  75 + if (isShowRight) {
  76 + int ivRightWidth = getMeasuredHeight() / 4;
  77 + int ivRightHeight = getMeasuredHeight() / 3;
  78 + LayoutParams params3 = new LayoutParams(ivRightWidth, ivRightHeight);
  79 + params3.setMargins(dip2px(context, 5), 0, 0, 0);
  80 + iv_right.setLayoutParams(params3);
  81 + noMargin = getMeasuredHeight() * MAX_ICON + dip2px(context, DEFAULT_LEFT_MARGIN) + ivRightWidth;
  82 + } else {
  83 + noMargin = getMeasuredHeight() * MAX_ICON + dip2px(context, DEFAULT_LEFT_MARGIN);
  84 +
  85 + }
  86 +
  87 + //获取当前用户设定的总长度
  88 + int userSetViewWidth = getMeasuredWidth();
  89 + //先试试设置默认缩进行不行
  90 + int defaultMargin = getMeasuredHeight() * MAX_ICON - dip2px(context, DEFAULT_LEFT_MARGIN);
  91 + if (defaultMargin <= userSetViewWidth) {
  92 + return;
  93 + }
  94 +
  95 + Log.e(TAG + index, "noMargin: " + noMargin + ",userSetViewWidth:" + userSetViewWidth);
  96 + //需要进一步缩放的距离(默认10dp)
  97 + int needMargin = dip2px(context, DEFAULT_LEFT_MARGIN);
  98 + //判断是否需要进一步缩放
  99 + if (noMargin > userSetViewWidth) {
  100 + int leftMargin = noMargin - userSetViewWidth;
  101 + //平分需要设置的间隔
  102 + needMargin = leftMargin / (MAX_ICON - 1);
  103 + Log.e(TAG, "onMeasure: 平分后" + needMargin);
  104 + if (needMargin <= dip2px(context, DEFAULT_LEFT_MARGIN)) {
  105 + needMargin = dip2px(context, DEFAULT_LEFT_MARGIN);
  106 + }
  107 + } else {
  108 + Log.e(TAG, "onMeasure: 不平分" + needMargin);
  109 + needMargin = dip2px(context, DEFAULT_LEFT_MARGIN);
  110 + }
  111 +
  112 +
  113 + LayoutParams params1 = new LayoutParams(getMeasuredHeight(), getMeasuredHeight());
  114 + params1.setMargins(0, 0, 0, 0);
  115 + qr1.setLayoutParams(params1);
  116 +
  117 + LayoutParams params2 = new LayoutParams(getMeasuredHeight(), getMeasuredHeight());
  118 + params2.setMargins(-needMargin, 0, 0, 0);
  119 + qr2.setLayoutParams(params2);
  120 + qr3.setLayoutParams(params2);
  121 + qr4.setLayoutParams(params2);
  122 + qr5.setLayoutParams(params2);
  123 + }
  124 + }
  125 +
  126 +
  127 + /**
  128 + * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
  129 + */
  130 + public int dip2px(Context context, float dpValue) {
  131 + final float scale = context.getResources().getDisplayMetrics().density;
  132 + return (int) (dpValue * scale + 0.5f);
  133 + }
  134 +
  135 + /**
  136 + * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
  137 + */
  138 + public int px2dip(Context context, float pxValue) {
  139 + final float scale = context.getResources().getDisplayMetrics().density;
  140 + return (int) (pxValue / scale + 0.5f);
  141 + }
  142 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/BitmapUtil.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.utils;
  2 +
  3 +/**
  4 + * @Package dcpollution.upenv.com.dcpollution.util
  5 + * @Description: (用一句话描述该文件做什么)
  6 + * @Author:杨帅
  7 + * @Date 2018/5/16,0016 下午 05:10
  8 + * @Version V1.0
  9 + */
  10 +
  11 +import android.annotation.SuppressLint;
  12 +import android.content.Context;
  13 +import android.graphics.Bitmap;
  14 +import android.graphics.Matrix;
  15 +import android.telephony.TelephonyManager;
  16 +import android.view.WindowManager;
  17 +import android.widget.Toast;
  18 +
  19 +/**
  20 + * @Package com.upenv.util
  21 + * @Description: 工具类
  22 + * @Author:杨帅
  23 + * @Date 2018/5/7,0007 下午 02:03
  24 + * @Version V1.0
  25 + */
  26 +public class BitmapUtil {
  27 + private static final String TAG = "BitmapUtil";
  28 +
  29 + /**
  30 + * 获取设备串号
  31 + *
  32 + * @param context
  33 + * @return
  34 + */
  35 + public static String getImei(Context context) {
  36 + TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE);
  37 + @SuppressLint("MissingPermission") String imei = telephonyManager.getDeviceId();//报错不用管,可以正常运行(手机型号+串号)
  38 + return imei;
  39 + }
  40 +
  41 + /**
  42 + * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
  43 + */
  44 + public static int dip2px(Context context, float dpValue) {
  45 + final float scale = context.getResources().getDisplayMetrics().density;
  46 + return (int) (dpValue * scale + 0.5f);
  47 + }
  48 +
  49 + /**
  50 + * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
  51 + */
  52 + public static int px2dip(Context context, float pxValue) {
  53 + final float scale = context.getResources().getDisplayMetrics().density;
  54 + return (int) (pxValue / scale + 0.5f);
  55 + }
  56 +
  57 + /**
  58 + * 获取到指定大小的bitmap,单位dp
  59 + *
  60 + * @return
  61 + */
  62 + public static Bitmap getBitmapFromDp(Context context, Bitmap bitmap, int width, int height) {
  63 + int w = bitmap.getWidth();
  64 + int h = bitmap.getHeight();
  65 + // 设置想要的大小
  66 + int newWidth = dip2px(context, width);
  67 + int newHeight = dip2px(context, height);
  68 + // 计算缩放比例
  69 + float scaleWidth = ((float) newWidth) / w;
  70 + float scaleHeight = ((float) newHeight) / h;
  71 + Matrix matrix = new Matrix();
  72 + matrix.postScale(scaleWidth, scaleHeight);
  73 + Bitmap mbitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
  74 + return mbitmap;
  75 + }
  76 +
  77 + /**
  78 + * 显示toast提示
  79 + *
  80 + * @param context
  81 + * @param message
  82 + */
  83 + public static void showToast(Context context, String message) {
  84 + Toast.makeText(context, message, Toast.LENGTH_LONG).show();
  85 + }
  86 +
  87 + public static int getScreenWidth(Context context) {
  88 + WindowManager wm = (WindowManager) context
  89 + .getSystemService(Context.WINDOW_SERVICE);
  90 + int width = wm.getDefaultDisplay().getWidth();
  91 + int height = wm.getDefaultDisplay().getHeight();
  92 + return width;
  93 + }
  94 +
  95 + /**
  96 + * 获取屏幕高度
  97 + *
  98 + * @param context
  99 + * @return
  100 + */
  101 + public static int getScreenHeight(Context context) {
  102 + WindowManager wm = (WindowManager) context
  103 + .getSystemService(Context.WINDOW_SERVICE);
  104 + int height = wm.getDefaultDisplay().getHeight();
  105 + return height;
  106 + }
  107 +
  108 +}
  109 +
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/ButtonAnimUtil.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.utils;
  2 +
  3 +import android.animation.Animator;
  4 +import android.animation.AnimatorSet;
  5 +import android.animation.ObjectAnimator;
  6 +import android.os.Build;
  7 +import android.os.Handler;
  8 +import android.view.View;
  9 +import android.view.ViewAnimationUtils;
  10 +import android.view.animation.DecelerateInterpolator;
  11 +
  12 +/**
  13 + * 圆形按钮点击特效
  14 + *
  15 + * @author ShinnyYang
  16 + */
  17 +public class ButtonAnimUtil {
  18 + public static final int DEFAULT_ZOOM_DURATION = 50;//默认缩放动画时间间隔
  19 + public static final int SHOW_VIEW_ZOOM_DURATION = 150;//显示控件缩放动画时间间隔
  20 + public static final int HIDE_VIEW_ZOOM_DURATION = 100;//隐藏控件缩放动画时间间隔
  21 +
  22 + //设置控件放大动画
  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();
  31 + }
  32 +
  33 + //设置控件缩小动画
  34 + 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();
  42 + }
  43 +
  44 + //设置控件显示放大动画
  45 + public static void setViewShowZoomIn(View view) {
  46 + AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画
  47 + ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 0, 1.2f);
  48 + ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 0, 1.2f);
  49 + animatorSetsuofang.setDuration(SHOW_VIEW_ZOOM_DURATION);
  50 + animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
  51 + animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始
  52 + animatorSetsuofang.start();
  53 + new Handler().postDelayed(new Runnable() {
  54 + @Override
  55 + public void run() {
  56 + AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画
  57 + ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1.2f, 1);
  58 + ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1.2f, 1);
  59 + animatorSetsuofang.setDuration(SHOW_VIEW_ZOOM_DURATION);
  60 + animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
  61 + animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始
  62 + animatorSetsuofang.start();
  63 + }
  64 + }, SHOW_VIEW_ZOOM_DURATION);
  65 + }
  66 +
  67 + //设置控件隐藏缩小动画
  68 + public static void setViewHideZoomOut(View view) {
  69 + AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画
  70 + ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1, 0);
  71 + ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1, 0);
  72 + animatorSetsuofang.setDuration(HIDE_VIEW_ZOOM_DURATION);
  73 + animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
  74 + animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始
  75 + animatorSetsuofang.start();
  76 + }
  77 +
  78 + //设置时间显示放大动画
  79 + public static void setTimeShowZoomIn(View view) {
  80 + ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 0, 1.4f);
  81 + ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 0, 1.4f);
  82 + ObjectAnimator scaleX1 = ObjectAnimator.ofFloat(view, "scaleX", 1.4f, 1);
  83 + ObjectAnimator scaleY1 = ObjectAnimator.ofFloat(view, "scaleY", 1.4f, 1);
  84 + ObjectAnimator scaleX2 = ObjectAnimator.ofFloat(view, "scaleX", 1, 0);
  85 + ObjectAnimator scaleY2 = ObjectAnimator.ofFloat(view, "scaleY", 1, 0);
  86 + AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画
  87 + animatorSetsuofang.setDuration(100);
  88 + animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
  89 + animatorSetsuofang.play(scaleX).with(scaleY);
  90 + animatorSetsuofang.start();
  91 + new Handler().postDelayed(new Runnable() {
  92 + @Override
  93 + public void run() {
  94 + AnimatorSet animatorSetsuofang2 = new AnimatorSet();//组合动画
  95 + animatorSetsuofang2.setDuration(100);
  96 + animatorSetsuofang2.setInterpolator(new DecelerateInterpolator());
  97 + animatorSetsuofang2.play(scaleX1).with(scaleY1);
  98 + animatorSetsuofang2.start();
  99 + }
  100 + }, 100);
  101 +
  102 + new Handler().postDelayed(new Runnable() {
  103 + @Override
  104 + public void run() {
  105 + AnimatorSet animatorSetsuofang3 = new AnimatorSet();//组合动画
  106 + animatorSetsuofang3.setDuration(10);
  107 + animatorSetsuofang3.setInterpolator(new DecelerateInterpolator());
  108 + animatorSetsuofang3.play(scaleX2).with(scaleY2);
  109 + animatorSetsuofang3.start();
  110 + }
  111 + }, 300);
  112 +
  113 + }
  114 +
  115 +
  116 + /**
  117 + * 设置控件展开特效
  118 + *
  119 + * @param view
  120 + * @param closeFlag
  121 + */
  122 + public static void startAnimation(View view, boolean closeFlag) {
  123 + //因为CircularReveal动画是api21之后才有的,所以加个判断语句,免得崩溃
  124 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  125 + int cicular_R = view.getHeight() / 2 > view.getWidth() / 2 ? view.getHeight() / 2 : view.getWidth() / 2;
  126 + Animator animator = null;
  127 + if (!closeFlag) {
  128 + animator = ViewAnimationUtils.createCircularReveal(view, (int) view.getWidth() / 2, (int) view.getHeight() / 2, 0, cicular_R);
  129 + } else {
  130 + animator = ViewAnimationUtils.createCircularReveal(view, (int) view.getWidth() / 2, (int) view.getHeight() / 2, cicular_R, 0);
  131 + }
  132 + animator.addListener(new Animator.AnimatorListener() {
  133 + @Override
  134 + public void onAnimationStart(Animator animator) {
  135 +
  136 + }
  137 +
  138 + @Override
  139 + public void onAnimationEnd(Animator animator) {
  140 + if (closeFlag) {
  141 + view.setVisibility(View.GONE);
  142 + }
  143 + }
  144 +
  145 + @Override
  146 + public void onAnimationCancel(Animator animator) {
  147 +
  148 + }
  149 +
  150 + @Override
  151 + public void onAnimationRepeat(Animator animator) {
  152 +
  153 + }
  154 + });
  155 + animator.setDuration(350);
  156 + animator.start();
  157 + } else {
  158 + if (closeFlag) {
  159 + view.setVisibility(View.GONE);
  160 + }
  161 + }
  162 +
  163 + }
  164 +
  165 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/ScreenUtil.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.utils;
  2 +
  3 +import android.app.Activity;
  4 +import android.content.Context;
  5 +import android.graphics.Bitmap;
  6 +import android.graphics.Matrix;
  7 +import android.os.Build;
  8 +import android.view.WindowManager;
  9 +
  10 +/*屏幕显示相关设置
  11 + *@date:2018/7/25 19:56
  12 + *@auther:杨帅
  13 + */public class ScreenUtil {
  14 + //版本 大于等于 19 才会生效(状态栏透明 2018/7/16 15:23 杨帅)
  15 + public static void initWindow(Activity activity) {
  16 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  17 + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  18 + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
  19 + }
  20 + }
  21 +
  22 + /**
  23 + * 获取屏幕信息
  24 + *
  25 + * @param context
  26 + * @return 屏幕的宽度、高度
  27 + */
  28 + public static ScreenInfo getScreenInfo(Context context) {
  29 + ScreenInfo info = new ScreenInfo();
  30 + WindowManager wm = (WindowManager) context
  31 + .getSystemService(Context.WINDOW_SERVICE);
  32 + int width = wm.getDefaultDisplay().getWidth();
  33 + int height = wm.getDefaultDisplay().getHeight();
  34 + info.setWidth(width);
  35 + info.setHeight(height);
  36 + return info;
  37 + }
  38 +
  39 + /**
  40 + * 获取屏幕宽度
  41 + *
  42 + * @param context
  43 + * @return
  44 + */
  45 + public static int getScreenWidth(Context context) {
  46 + WindowManager wm = (WindowManager) context
  47 + .getSystemService(Context.WINDOW_SERVICE);
  48 + int width = wm.getDefaultDisplay().getWidth();
  49 + return width;
  50 + }
  51 +
  52 + /**
  53 + * 获取屏幕高度
  54 + *
  55 + * @param context
  56 + * @return
  57 + */
  58 + public static int getScreenHeight(Context context) {
  59 + WindowManager wm = (WindowManager) context
  60 + .getSystemService(Context.WINDOW_SERVICE);
  61 + int height = wm.getDefaultDisplay().getHeight();
  62 + return height;
  63 + }
  64 +
  65 + /**
  66 + * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
  67 + */
  68 + public static int dip2px(Context context, float dpValue) {
  69 + final float scale = context.getResources().getDisplayMetrics().density;
  70 + return (int) (dpValue * scale + 0.5f);
  71 + }
  72 +
  73 + /**
  74 + * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
  75 + */
  76 + public static int px2dip(Context context, float pxValue) {
  77 + final float scale = context.getResources().getDisplayMetrics().density;
  78 + return (int) (pxValue / scale + 0.5f);
  79 + }
  80 +
  81 +
  82 + public static class ScreenInfo {
  83 + private int width;
  84 + private int height;
  85 +
  86 + public int getWidth() {
  87 + return width;
  88 + }
  89 +
  90 + public void setWidth(int width) {
  91 + this.width = width;
  92 + }
  93 +
  94 + public int getHeight() {
  95 + return height;
  96 + }
  97 +
  98 + public void setHeight(int height) {
  99 + this.height = height;
  100 + }
  101 + }
  102 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/StepUtil.java
@@ -23,6 +23,23 @@ public class StepUtil { @@ -23,6 +23,23 @@ public class StepUtil {
23 private static final String TAG = "StepUtil"; 23 private static final String TAG = "StepUtil";
24 private static final String dbName = "Step.db"; 24 private static final String dbName = "Step.db";
25 25
  26 +
  27 + /**
  28 + * 计算配速
  29 + */
  30 + public static String getPaceSpeed(double second, double distance) {
  31 + if (distance != 0) {
  32 + //计算分
  33 + int minute = (int) (second / distance / 60);
  34 + //获取秒
  35 + double miaoMin = ((double) (second / distance / 60)) - ((int) (second / distance / 60));
  36 + int miao = (int) (miaoMin * 60);
  37 + return minute + "'" + miao + "''";
  38 + } else {
  39 + return "--";
  40 + }
  41 + }
  42 +
26 /** 43 /**
27 * 更新数据 44 * 更新数据
28 * 45 *
@@ -78,13 +95,16 @@ public class StepUtil { @@ -78,13 +95,16 @@ public class StepUtil {
78 Log.e(TAG, "clearRunData: " + list.size()); 95 Log.e(TAG, "clearRunData: " + list.size());
79 // for (int i = 0; i < list.size(); i++) { 96 // for (int i = 0; i < list.size(); i++) {
80 DbCore.getDaoSession().getUserStepEntityDao().deleteInTx(list); 97 DbCore.getDaoSession().getUserStepEntityDao().deleteInTx(list);
81 - 98 + DbCore.getDaoSession().getUserStepEntityDao().detachAll();
  99 + DbCore.getDaoSession().clear();
82 // } 100 // }
83 } 101 }
84 } 102 }
85 103
86 public static UserStepEntity getUserStepData(Context context, String uid) { 104 public static UserStepEntity getUserStepData(Context context, String uid) {
87 DbCore.init(context, dbName); 105 DbCore.init(context, dbName);
  106 + DbCore.getDaoSession().getUserStepEntityDao().detachAll();
  107 + DbCore.getDaoSession().clear();
88 String CURRENT_DATE = getTodayDate(); 108 String CURRENT_DATE = getTodayDate();
89 List<UserStepEntity> list = DbCore.getDaoSession().getUserStepEntityDao().queryBuilder().where(UserStepEntityDao.Properties.UserId.eq(uid), UserStepEntityDao.Properties.Date.eq(CURRENT_DATE)).list(); 109 List<UserStepEntity> list = DbCore.getDaoSession().getUserStepEntityDao().queryBuilder().where(UserStepEntityDao.Properties.UserId.eq(uid), UserStepEntityDao.Properties.Date.eq(CURRENT_DATE)).list();
90 if (list != null && list.size() > 0) { 110 if (list != null && list.size() > 0) {
moudle_pedometer/src/main/res/drawable-hdpi/button_fab_white.png 0 → 100644

5.99 KB

moudle_pedometer/src/main/res/drawable-hdpi/ic_portrait_training_left_on.png 0 → 100644

241 Bytes

moudle_pedometer/src/main/res/drawable-hdpi/ic_white_back.png 0 → 100644

219 Bytes

moudle_pedometer/src/main/res/drawable-hdpi/icon_share.png 0 → 100644

1005 Bytes

moudle_pedometer/src/main/res/drawable-hdpi/mo_ic_dialog_back.png 0 → 100644

225 Bytes

moudle_pedometer/src/main/res/drawable-hdpi/rt_ic_location.png 0 → 100644

5.19 KB

moudle_pedometer/src/main/res/drawable-hdpi/rt_ic_location_blank.png 0 → 100644

743 Bytes

moudle_pedometer/src/main/res/drawable-hdpi/tc_ic_workout_level_adjust_coach.png 0 → 100644

6.52 KB

moudle_pedometer/src/main/res/drawable-hdpi/tc_suit_right_arrow.png 0 → 100644

538 Bytes

moudle_pedometer/src/main/res/drawable/icon_race_location_green.png 0 → 100644

487 Bytes

moudle_pedometer/src/main/res/drawable/shape_10dp_white_raduis_bg.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <solid android:color="@color/white" />
  4 + <corners android:radius="10dp" />
  5 +</shape>
0 \ No newline at end of file 6 \ No newline at end of file
moudle_pedometer/src/main/res/drawable/shape_circle_50_black.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <corners android:radius="100dp" />
  4 + <solid android:color="@color/black_50" />
  5 +</shape>
0 \ No newline at end of file 6 \ No newline at end of file
moudle_pedometer/src/main/res/drawable/shape_circle_green.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <corners android:radius="100dp" />
  4 + <solid android:color="@color/green" />
  5 +</shape>
0 \ No newline at end of file 6 \ No newline at end of file
moudle_pedometer/src/main/res/drawable/shape_circle_red.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <corners android:radius="100dp" />
  4 + <solid android:color="@color/red" />
  5 +</shape>
0 \ No newline at end of file 6 \ No newline at end of file
moudle_pedometer/src/main/res/layout/bottom_sheet_dialog_run_race_detail.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<layout xmlns:android="http://schemas.android.com/apk/res/android">
  3 +
  4 + <ScrollView
  5 + android:layout_width="match_parent"
  6 + android:layout_height="match_parent">
  7 +
  8 + <LinearLayout
  9 + android:layout_width="match_parent"
  10 + android:layout_height="wrap_content"
  11 + android:orientation="vertical"
  12 + android:paddingLeft="10dp">
  13 + <!--活动标题-->
  14 + <TextView
  15 + android:id="@+id/tv_race_title"
  16 + android:layout_width="wrap_content"
  17 + android:layout_height="wrap_content"
  18 + android:layout_marginTop="10dp"
  19 + android:text="奥森南园跑道"
  20 + android:textSize="18sp"
  21 + android:textStyle="bold" />
  22 + <!--活动地点-->
  23 + <LinearLayout
  24 + android:layout_width="match_parent"
  25 + android:layout_height="wrap_content"
  26 + android:layout_marginTop="10dp">
  27 +
  28 + <ImageView
  29 + android:layout_width="20dp"
  30 + android:layout_height="20dp"
  31 + android:background="@drawable/icon_race_location_green" />
  32 +
  33 + <TextView
  34 + android:layout_width="wrap_content"
  35 + android:layout_height="wrap_content"
  36 + android:layout_marginLeft="5dp"
  37 + android:text="活动地点"
  38 + android:textColor="@color/bottom_sheet_dialog_race_location_text"
  39 + android:textSize="14sp" />
  40 + </LinearLayout>
  41 + <!--活动地点详情-->
  42 + <LinearLayout
  43 + android:layout_width="match_parent"
  44 + android:layout_height="wrap_content"
  45 + android:layout_marginTop="10dp">
  46 +
  47 + <TextView
  48 + android:layout_width="wrap_content"
  49 + android:layout_height="wrap_content"
  50 + android:layout_marginLeft="25dp"
  51 + android:text="北京"
  52 + android:textColor="@color/black"
  53 + android:textSize="15sp" />
  54 +
  55 + <TextView
  56 + android:layout_width="wrap_content"
  57 + android:layout_height="wrap_content"
  58 + android:layout_marginLeft="25dp"
  59 + android:text="首都师范大学"
  60 + android:textColor="@color/black"
  61 + android:textSize="15sp" />
  62 +
  63 + <TextView
  64 + android:layout_width="wrap_content"
  65 + android:layout_height="wrap_content"
  66 + android:layout_marginLeft="25dp"
  67 + android:text="全长4.42公里"
  68 + android:textColor="@color/black"
  69 + android:textSize="15sp" />
  70 + </LinearLayout>
  71 + <!--起点-->
  72 + <LinearLayout
  73 + android:layout_width="match_parent"
  74 + android:layout_height="wrap_content"
  75 + android:layout_marginTop="10dp"
  76 + android:gravity="center_vertical">
  77 +
  78 + <View
  79 + android:layout_width="10dp"
  80 + android:layout_height="10dp"
  81 + android:layout_marginLeft="25dp"
  82 + android:background="@drawable/shape_circle_green" />
  83 +
  84 + <TextView
  85 + android:layout_width="wrap_content"
  86 + android:layout_height="wrap_content"
  87 + android:layout_marginLeft="10dp"
  88 + android:text="(起)"
  89 + android:textColor="@color/bottom_sheet_dialog_race_location_text"
  90 + android:textSize="14sp" />
  91 +
  92 + <TextView
  93 + android:layout_width="wrap_content"
  94 + android:layout_height="wrap_content"
  95 + android:layout_marginLeft="10dp"
  96 + android:text="首都师范大学操场东门"
  97 + android:textColor="@color/black"
  98 + android:textSize="15sp" />
  99 + </LinearLayout>
  100 + <!--终点-->
  101 + <LinearLayout
  102 + android:layout_width="match_parent"
  103 + android:layout_height="wrap_content"
  104 + android:layout_marginTop="10dp"
  105 + android:gravity="center_vertical">
  106 +
  107 + <View
  108 + android:layout_width="10dp"
  109 + android:layout_height="10dp"
  110 + android:layout_marginLeft="25dp"
  111 + android:background="@drawable/shape_circle_red" />
  112 +
  113 + <TextView
  114 + android:layout_width="wrap_content"
  115 + android:layout_height="wrap_content"
  116 + android:layout_marginLeft="10dp"
  117 + android:text="(止)"
  118 + android:textColor="@color/bottom_sheet_dialog_race_location_text"
  119 + android:textSize="14sp" />
  120 +
  121 + <TextView
  122 + android:layout_width="wrap_content"
  123 + android:layout_height="wrap_content"
  124 + android:layout_marginLeft="10dp"
  125 + android:text="首都师范大学操场西门"
  126 + android:textColor="@color/black"
  127 + android:textSize="15sp" />
  128 + </LinearLayout>
  129 + <!--报名时间-->
  130 + <LinearLayout
  131 + android:layout_width="match_parent"
  132 + android:layout_height="wrap_content"
  133 + android:layout_marginTop="10dp">
  134 +
  135 + <ImageView
  136 + android:layout_width="20dp"
  137 + android:layout_height="20dp"
  138 + android:background="@drawable/icon_race_location_green" />
  139 +
  140 + <TextView
  141 + android:layout_width="wrap_content"
  142 + android:layout_height="wrap_content"
  143 + android:layout_marginLeft="5dp"
  144 + android:text="报名时间"
  145 + android:textColor="@color/bottom_sheet_dialog_race_location_text"
  146 + android:textSize="14sp" />
  147 + </LinearLayout>
  148 + <!--时间-->
  149 + <LinearLayout
  150 + android:layout_width="match_parent"
  151 + android:layout_height="wrap_content"
  152 + android:layout_marginTop="10dp">
  153 +
  154 + <TextView
  155 + android:layout_width="wrap_content"
  156 + android:layout_height="wrap_content"
  157 + android:layout_marginLeft="25dp"
  158 + android:text="2019.05.01"
  159 + android:textColor="@color/black"
  160 + android:textSize="15sp" />
  161 +
  162 + <TextView
  163 + android:layout_width="wrap_content"
  164 + android:layout_height="match_parent"
  165 + android:layout_marginLeft="5dp"
  166 + android:text="——"
  167 + android:textColor="@color/black"
  168 + android:textSize="15sp" />
  169 +
  170 + <TextView
  171 + android:layout_width="wrap_content"
  172 + android:layout_height="wrap_content"
  173 + android:layout_marginLeft="5dp"
  174 + android:text="2019.09.01"
  175 + android:textColor="@color/black"
  176 + android:textSize="15sp" />
  177 + </LinearLayout>
  178 +
  179 + <View
  180 + android:layout_width="match_parent"
  181 + android:layout_height="1dp"
  182 + android:layout_marginTop="5dp"
  183 + android:background="@color/line" />
  184 + <!--活动时间-->
  185 + <LinearLayout
  186 + android:layout_width="match_parent"
  187 + android:layout_height="wrap_content"
  188 + android:layout_marginTop="10dp">
  189 +
  190 + <ImageView
  191 + android:layout_width="20dp"
  192 + android:layout_height="20dp"
  193 + android:background="@drawable/icon_race_location_green" />
  194 +
  195 + <TextView
  196 + android:layout_width="wrap_content"
  197 + android:layout_height="wrap_content"
  198 + android:layout_marginLeft="5dp"
  199 + android:text="活动时间"
  200 + android:textColor="@color/bottom_sheet_dialog_race_location_text"
  201 + android:textSize="14sp" />
  202 + </LinearLayout>
  203 + <!--活动时间的具体日期-->
  204 + <LinearLayout
  205 + android:layout_width="match_parent"
  206 + android:layout_height="wrap_content"
  207 + android:layout_marginTop="10dp">
  208 +
  209 + <TextView
  210 + android:layout_width="wrap_content"
  211 + android:layout_height="wrap_content"
  212 + android:layout_marginLeft="25dp"
  213 + android:text="2019.05.01"
  214 + android:textColor="@color/black"
  215 + android:textSize="15sp" />
  216 +
  217 + <TextView
  218 + android:layout_width="wrap_content"
  219 + android:layout_height="match_parent"
  220 + android:layout_marginLeft="5dp"
  221 + android:text="——"
  222 + android:textColor="@color/black"
  223 + android:textSize="15sp" />
  224 +
  225 + <TextView
  226 + android:layout_width="wrap_content"
  227 + android:layout_height="wrap_content"
  228 + android:layout_marginLeft="5dp"
  229 + android:text="2019.09.01"
  230 + android:textColor="@color/black"
  231 + android:textSize="15sp" />
  232 + </LinearLayout>
  233 +
  234 + <View
  235 + android:layout_width="match_parent"
  236 + android:layout_height="1dp"
  237 + android:layout_marginTop="5dp"
  238 + android:background="@color/line" />
  239 + <!--参与人数-->
  240 + <LinearLayout
  241 + android:layout_width="match_parent"
  242 + android:layout_height="wrap_content"
  243 + android:layout_marginTop="10dp">
  244 +
  245 + <ImageView
  246 + android:layout_width="20dp"
  247 + android:layout_height="20dp"
  248 + android:background="@drawable/icon_race_location_green" />
  249 +
  250 + <TextView
  251 + android:layout_width="wrap_content"
  252 + android:layout_height="wrap_content"
  253 + android:layout_marginLeft="5dp"
  254 + android:text="参与人数"
  255 + android:textColor="@color/bottom_sheet_dialog_race_location_text"
  256 + android:textSize="14sp" />
  257 + </LinearLayout>
  258 + <!--相关的人数-->
  259 + <LinearLayout
  260 + android:layout_width="match_parent"
  261 + android:layout_height="wrap_content"
  262 + android:gravity="center_vertical">
  263 +
  264 + <TextView
  265 + android:layout_width="wrap_content"
  266 + android:layout_height="wrap_content"
  267 + android:layout_marginLeft="25dp"
  268 + android:text="123"
  269 + android:textColor="@color/black"
  270 + android:textSize="17sp"
  271 + android:textStyle="bold" />
  272 +
  273 + <TextView
  274 + android:layout_width="wrap_content"
  275 + android:layout_height="wrap_content"
  276 + android:layout_marginLeft="5dp"
  277 + android:text="人参与"
  278 + android:textColor="@color/black"
  279 + android:textSize="15sp" />
  280 +
  281 + <LinearLayout
  282 + android:layout_width="match_parent"
  283 + android:layout_height="wrap_content"
  284 + android:gravity="right|center">
  285 +
  286 + <com.cnlive.moudle.pedometer.ui.widget.FivePersonIconView
  287 + android:layout_width="match_parent"
  288 + android:layout_height="40dp"
  289 + android:layout_marginRight="10dp"></com.cnlive.moudle.pedometer.ui.widget.FivePersonIconView>
  290 +
  291 +
  292 + </LinearLayout>
  293 + </LinearLayout>
  294 + <!---->
  295 + </LinearLayout>
  296 + </ScrollView>
  297 +</layout>
0 \ No newline at end of file 298 \ No newline at end of file
moudle_pedometer/src/main/res/layout/five_persion_icon.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + xmlns:app="http://schemas.android.com/apk/res-auto"
  4 + android:layout_width="match_parent"
  5 + android:layout_height="wrap_content"
  6 + android:gravity="center_vertical|right">
  7 +
  8 +
  9 + <com.qmuiteam.qmui.widget.QMUIRadiusImageView
  10 + android:id="@+id/qm_iv1"
  11 + android:layout_width="40dp"
  12 + android:layout_height="40dp"
  13 + android:layout_marginLeft="10dp"
  14 + android:background="@drawable/tc_ic_workout_level_adjust_coach"
  15 + app:qmui_corner_radius="100dp" />
  16 +
  17 + <com.qmuiteam.qmui.widget.QMUIRadiusImageView
  18 + android:id="@+id/qm_iv2"
  19 + android:layout_width="40dp"
  20 + android:layout_height="40dp"
  21 + android:layout_marginLeft="-10dp"
  22 + android:background="@drawable/tc_ic_workout_level_adjust_coach"
  23 + app:qmui_corner_radius="100dp" />
  24 +
  25 + <com.qmuiteam.qmui.widget.QMUIRadiusImageView
  26 + android:id="@+id/qm_iv3"
  27 + android:layout_width="40dp"
  28 + android:layout_height="40dp"
  29 + android:layout_marginLeft="-10dp"
  30 + android:background="@drawable/tc_ic_workout_level_adjust_coach"
  31 + app:qmui_corner_radius="100dp" />
  32 +
  33 + <com.qmuiteam.qmui.widget.QMUIRadiusImageView
  34 + android:id="@+id/qm_iv4"
  35 + android:layout_width="40dp"
  36 + android:layout_height="40dp"
  37 + android:layout_marginLeft="-10dp"
  38 + android:background="@drawable/tc_ic_workout_level_adjust_coach"
  39 + app:qmui_corner_radius="100dp" />
  40 +
  41 + <com.qmuiteam.qmui.widget.QMUIRadiusImageView
  42 + android:id="@+id/qm_iv5"
  43 + android:layout_width="40dp"
  44 + android:layout_height="40dp"
  45 + android:layout_marginLeft="-10dp"
  46 + android:background="@drawable/tc_ic_workout_level_adjust_coach"
  47 + app:qmui_corner_radius="100dp" />
  48 +
  49 + <ImageView
  50 + android:id="@+id/iv_right"
  51 + android:layout_width="9dp"
  52 + android:layout_height="15dp"
  53 + android:layout_marginLeft="5dp"
  54 + android:background="@drawable/tc_suit_right_arrow" />
  55 +</LinearLayout>
0 \ No newline at end of file 56 \ No newline at end of file
moudle_pedometer/src/main/res/layout/fragment_run_main.xml
@@ -116,21 +116,28 @@ @@ -116,21 +116,28 @@
116 android:layout_marginBottom="5dp" 116 android:layout_marginBottom="5dp"
117 android:src="@drawable/rt_outdoor_video_pace" /> 117 android:src="@drawable/rt_outdoor_video_pace" />
118 118
119 - <TextView  
120 - android:id="@+id/tv_speed"  
121 - android:layout_width="wrap_content" 119 + <LinearLayout
  120 + android:layout_width="match_parent"
122 android:layout_height="wrap_content" 121 android:layout_height="wrap_content"
123 - android:text="--"  
124 - android:textColor="@color/white"  
125 - android:textSize="20sp"  
126 - android:textStyle="bold" /> 122 + android:gravity="center">
  123 +
  124 + <TextView
  125 + android:id="@+id/tv_speed"
  126 + android:layout_width="wrap_content"
  127 + android:layout_height="wrap_content"
  128 + android:text="--"
  129 + android:textColor="@color/white"
  130 + android:textSize="20sp"
  131 + android:textStyle="bold" />
  132 +
  133 + </LinearLayout>
127 134
128 <TextView 135 <TextView
129 android:layout_width="wrap_content" 136 android:layout_width="wrap_content"
130 android:layout_height="wrap_content" 137 android:layout_height="wrap_content"
131 android:layout_marginTop="5dp" 138 android:layout_marginTop="5dp"
132 android:gravity="center" 139 android:gravity="center"
133 - android:text="速度" 140 + android:text="时速"
134 android:textColor="@color/text_gray" 141 android:textColor="@color/text_gray"
135 android:textSize="17sp" 142 android:textSize="17sp"
136 android:textStyle="bold" /> 143 android:textStyle="bold" />
@@ -401,7 +408,7 @@ @@ -401,7 +408,7 @@
401 android:layout_height="match_parent" 408 android:layout_height="match_parent"
402 android:background="@color/run_main_time_bg" 409 android:background="@color/run_main_time_bg"
403 android:gravity="center" 410 android:gravity="center"
404 - > 411 + >
405 412
406 <TextView 413 <TextView
407 android:id="@+id/tv_time_count_down" 414 android:id="@+id/tv_time_count_down"
moudle_pedometer/src/main/res/layout/fragment_run_race_detail.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<layout xmlns:android="http://schemas.android.com/apk/res/android">
  3 +
  4 + <FrameLayout
  5 + android:layout_width="match_parent"
  6 + android:layout_height="match_parent">
  7 +
  8 + <com.baidu.mapapi.map.MapView
  9 + android:id="@+id/mapView"
  10 + android:layout_width="match_parent"
  11 + android:layout_height="match_parent"></com.baidu.mapapi.map.MapView>
  12 +
  13 + <FrameLayout
  14 + android:layout_width="40dp"
  15 + android:layout_height="40dp"
  16 + android:layout_margin="10dp"
  17 + android:background="@drawable/shape_circle_50_black">
  18 +
  19 + <ImageView
  20 + android:layout_width="15dp"
  21 + android:layout_height="20dp"
  22 + android:layout_gravity="center"
  23 + android:background="@drawable/ic_white_back" />
  24 + </FrameLayout>
  25 +
  26 + <FrameLayout
  27 + android:layout_width="40dp"
  28 + android:layout_height="40dp"
  29 + android:layout_gravity="right"
  30 + android:layout_margin="10dp"
  31 + android:background="@drawable/shape_circle_50_black">
  32 +
  33 + <ImageView
  34 + android:layout_width="25dp"
  35 + android:layout_height="25dp"
  36 + android:layout_gravity="center"
  37 + android:background="@drawable/icon_share" />
  38 + </FrameLayout>
  39 + </FrameLayout>
  40 +
  41 +</layout>
0 \ No newline at end of file 42 \ No newline at end of file
moudle_pedometer/src/main/res/layout/fragment_running_map.xml
@@ -7,7 +7,139 @@ @@ -7,7 +7,139 @@
7 android:orientation="vertical"> 7 android:orientation="vertical">
8 8
9 <com.baidu.mapapi.map.MapView 9 <com.baidu.mapapi.map.MapView
  10 + android:id="@+id/mapView"
10 android:layout_width="match_parent" 11 android:layout_width="match_parent"
11 android:layout_height="match_parent"></com.baidu.mapapi.map.MapView> 12 android:layout_height="match_parent"></com.baidu.mapapi.map.MapView>
  13 +
  14 + <FrameLayout
  15 + android:id="@+id/fl_back"
  16 + android:layout_width="60dp"
  17 + android:layout_height="60dp"
  18 + android:background="@drawable/button_fab_white"
  19 + android:focusable="true">
  20 +
  21 + <ImageView
  22 + android:layout_width="25dp"
  23 + android:layout_height="25dp"
  24 + android:layout_gravity="center"
  25 + android:layout_marginLeft="2dp"
  26 + android:background="@drawable/mo_ic_dialog_back"
  27 + android:focusable="false" />
  28 + </FrameLayout>
  29 +
  30 + <LinearLayout
  31 + android:layout_width="match_parent"
  32 + android:layout_height="wrap_content"
  33 + android:layout_gravity="bottom"
  34 + android:orientation="vertical">
  35 +
  36 + <FrameLayout
  37 + android:id="@+id/fl_location"
  38 + android:layout_width="60dp"
  39 + android:layout_height="60dp"
  40 + android:layout_marginBottom="20dp"
  41 + android:background="@drawable/button_fab_white"
  42 + android:focusable="true">
  43 +
  44 + <ImageView
  45 + android:layout_width="60dp"
  46 + android:layout_height="60dp"
  47 + android:layout_gravity="center"
  48 + android:background="@drawable/rt_ic_location_blank"
  49 + android:focusable="false" />
  50 + </FrameLayout>
  51 +
  52 + <LinearLayout
  53 + android:layout_width="match_parent"
  54 + android:layout_height="100dp"
  55 + android:layout_marginLeft="10dp"
  56 + android:layout_marginRight="10dp"
  57 + android:layout_marginBottom="20dp"
  58 + android:background="@drawable/shape_10dp_white_raduis_bg">
  59 +
  60 + <LinearLayout
  61 + android:layout_width="0dp"
  62 + android:layout_height="match_parent"
  63 + android:layout_weight="1"
  64 + android:gravity="center"
  65 + android:orientation="vertical"
  66 + android:paddingLeft="5dp"
  67 + android:paddingRight="5dp">
  68 +
  69 + <TextView
  70 + android:id="@+id/tv_current_speed"
  71 + android:layout_width="wrap_content"
  72 + android:layout_height="wrap_content"
  73 + android:text="--"
  74 + android:textColor="@color/black"
  75 + android:textSize="20sp"
  76 + android:textStyle="bold" />
  77 +
  78 + <TextView
  79 + android:layout_width="wrap_content"
  80 + android:layout_height="wrap_content"
  81 + android:layout_marginTop="10dp"
  82 + android:text="配速"
  83 + android:textColor="@color/black"
  84 + android:textSize="15sp" />
  85 + </LinearLayout>
  86 +
  87 + <LinearLayout
  88 + android:layout_width="0dp"
  89 + android:layout_height="match_parent"
  90 + android:layout_weight="1.5"
  91 + android:gravity="center"
  92 + android:orientation="vertical">
  93 +
  94 + <Chronometer
  95 + android:id="@+id/chronometer"
  96 + android:layout_width="wrap_content"
  97 + android:layout_height="wrap_content"
  98 + android:format="00:00:00"
  99 + android:textColor="@color/black"
  100 + android:textSize="20sp"
  101 + android:textStyle="bold" />
  102 +
  103 + <TextView
  104 + android:layout_width="wrap_content"
  105 + android:layout_height="wrap_content"
  106 + android:layout_marginTop="10dp"
  107 + android:text="用时"
  108 + android:textColor="@color/black"
  109 + android:textSize="15sp" />
  110 + </LinearLayout>
  111 +
  112 +
  113 + <LinearLayout
  114 + android:layout_width="0dp"
  115 + android:layout_height="match_parent"
  116 + android:layout_weight="1"
  117 + android:gravity="center"
  118 + android:orientation="vertical"
  119 + android:paddingLeft="5dp"
  120 + android:paddingRight="5dp">
  121 +
  122 + <TextView
  123 + android:id="@+id/tv_current_diatance"
  124 + android:layout_width="wrap_content"
  125 + android:layout_height="wrap_content"
  126 + android:text="--"
  127 + android:textColor="@color/black"
  128 + android:textSize="20sp"
  129 + android:textStyle="bold" />
  130 +
  131 + <TextView
  132 + android:layout_width="wrap_content"
  133 + android:layout_height="wrap_content"
  134 + android:layout_marginTop="10dp"
  135 + android:text="距离(km)"
  136 + android:textColor="@color/black"
  137 + android:textSize="15sp" />
  138 + </LinearLayout>
  139 +
  140 + </LinearLayout>
  141 + </LinearLayout>
  142 + <!---->
  143 +
12 </FrameLayout> 144 </FrameLayout>
13 </layout> 145 </layout>
14 \ No newline at end of file 146 \ No newline at end of file
moudle_pedometer/src/main/res/values/colors.xml
@@ -12,4 +12,12 @@ @@ -12,4 +12,12 @@
12 <color name="btn_green">#23D41E</color> 12 <color name="btn_green">#23D41E</color>
13 <color name="transparent">#00000000</color> 13 <color name="transparent">#00000000</color>
14 14
  15 + <!--圆形shape -->
  16 + <!--半透明黑色-->
  17 + <color name="black_50">#80000000</color>
  18 + <color name="green">#23D026</color>
  19 + <color name="red">#EF5544</color>
  20 +
  21 +
  22 + <color name="bottom_sheet_dialog_race_location_text">#C3C3C3</color>
15 </resources> 23 </resources>
moudle_pedometer/src/main/res/values/ids.xml
@@ -2,5 +2,6 @@ @@ -2,5 +2,6 @@
2 <resources> 2 <resources>
3 <item name="fragment_run_main" type="id" /> 3 <item name="fragment_run_main" type="id" />
4 <item name="fragment_running_map" type="id" /> 4 <item name="fragment_running_map" type="id" />
  5 + <item name="fragment_run_trace_detail" type="id" />
5 6
6 </resources> 7 </resources>