├── .gitignore ├── 0.png ├── 1.jpg ├── 2.jpg ├── 3.jpg ├── 4.jpg ├── 5.jpg ├── README.md ├── TraceDemo.7z ├── TraceDemo ├── .gitignore ├── .idea │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── gradle.xml │ ├── misc.xml │ ├── modules.xml │ └── runConfigurations.xml ├── app │ ├── .gitignore │ ├── build.gradle │ ├── debug.keystore │ ├── keystore说明.txt │ ├── libs │ │ ├── BaiduLBS_Android.jar │ │ ├── arm64-v8a │ │ │ ├── libBaiduMapSDK_base_v4_3_1.so │ │ │ ├── libBaiduMapSDK_map_v4_3_1.so │ │ │ └── liblocSDK7a.so │ │ ├── armeabi-v7a │ │ │ ├── libBaiduMapSDK_base_v4_3_1.so │ │ │ ├── libBaiduMapSDK_map_v4_3_1.so │ │ │ └── liblocSDK7a.so │ │ ├── armeabi │ │ │ ├── libBaiduMapSDK_base_v4_3_1.so │ │ │ ├── libBaiduMapSDK_map_v4_3_1.so │ │ │ └── liblocSDK7a.so │ │ ├── fastjson-1.2.31.jar │ │ ├── x86 │ │ │ ├── libBaiduMapSDK_base_v4_3_1.so │ │ │ ├── libBaiduMapSDK_map_v4_3_1.so │ │ │ └── liblocSDK7a.so │ │ ├── x86_64 │ │ │ ├── libBaiduMapSDK_base_v4_3_1.so │ │ │ ├── libBaiduMapSDK_map_v4_3_1.so │ │ │ └── liblocSDK7a.so │ │ └── xutils-3.5.0.jar │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── itgowo │ │ │ └── sport │ │ │ └── trace │ │ │ └── tracedemo │ │ │ └── ExampleInstrumentedTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── itgowo │ │ │ │ └── sport │ │ │ │ └── trace │ │ │ │ └── tracedemo │ │ │ │ ├── MainActivity.java │ │ │ │ ├── Other │ │ │ │ ├── ActivityStack.java │ │ │ │ ├── BaseActivity.java │ │ │ │ ├── DragButton │ │ │ │ │ └── SlidingButtonLayout.java │ │ │ │ ├── QKManager.java │ │ │ │ ├── Request.java │ │ │ │ ├── Response.java │ │ │ │ ├── SystemBarTintUtil.java │ │ │ │ ├── TitleBarView.java │ │ │ │ ├── XListView │ │ │ │ │ ├── XListView.java │ │ │ │ │ ├── XListViewFooter.java │ │ │ │ │ └── XListViewHeader.java │ │ │ │ ├── app.java │ │ │ │ ├── circleprogress │ │ │ │ │ ├── ArcProgress.java │ │ │ │ │ ├── CircleProgress.java │ │ │ │ │ └── DonutProgress.java │ │ │ │ ├── onNetCallbackIListener.java │ │ │ │ ├── onNetCallbackListener.java │ │ │ │ └── qktool.java │ │ │ │ └── Trace │ │ │ │ ├── Entity │ │ │ │ ├── EntityRecord.java │ │ │ │ ├── Entity_GetRunRecord.java │ │ │ │ ├── Entity_GetRunRecordList.java │ │ │ │ ├── Entity_TotalInfo.java │ │ │ │ ├── Entity_UploadResponse.java │ │ │ │ ├── LocationInfo.java │ │ │ │ └── RequestTrace.java │ │ │ │ ├── TraceEndActivity.java │ │ │ │ ├── TraceMainActivity.java │ │ │ │ ├── TraceManager.java │ │ │ │ ├── TraceRecordActivity.java │ │ │ │ └── WalkShareTop.java │ │ └── res │ │ │ ├── drawable-xhdpi │ │ │ ├── gps_signal_0.png │ │ │ ├── gps_signal_1.png │ │ │ ├── gps_signal_2.png │ │ │ ├── gps_signal_3.png │ │ │ ├── icon2.png │ │ │ ├── list.png │ │ │ ├── lock1.png │ │ │ ├── logo1.png │ │ │ ├── map_icon_end.png │ │ │ ├── paobuico.png │ │ │ ├── ranking.png │ │ │ ├── tance_icon_end.png │ │ │ ├── tance_icon_start.png │ │ │ ├── trace_history.png │ │ │ ├── trace_time.png │ │ │ ├── tracetype_bike.png │ │ │ ├── tracetype_run.png │ │ │ ├── trance_bike.png │ │ │ ├── trance_bike2.png │ │ │ ├── trance_run.png │ │ │ ├── trance_run2.png │ │ │ └── xlistview_arrow.png │ │ │ ├── drawable-xxhdpi │ │ │ └── fanhui.png │ │ │ ├── drawable │ │ │ ├── backgrounp_gray1.xml │ │ │ ├── backgrounp_orange.xml │ │ │ ├── circle_deepblue.xml │ │ │ ├── circle_gray.xml │ │ │ ├── circle_orange.xml │ │ │ └── circlerect_gray.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── activity_trace_end.xml │ │ │ ├── activity_trace_main.xml │ │ │ ├── activity_trace_record.xml │ │ │ ├── listview_itemtypetitle.xml │ │ │ ├── nodataview.xml │ │ │ ├── sliding_layout.xml │ │ │ ├── titlebar_viewlayout.xml │ │ │ ├── trace_includelayout.xml │ │ │ ├── tracerecordlistitem.xml │ │ │ ├── waitingdialog.xml │ │ │ ├── walksharetopview.xml │ │ │ ├── xlistview_footer.xml │ │ │ └── xlistview_header.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── fenxiang.png │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ └── values │ │ │ ├── attrs_CircleProgress.xml │ │ │ ├── attrs_DragButton.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ ├── strings_XListView.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── itgowo │ │ └── sport │ │ └── trace │ │ └── tracedemo │ │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── TraceServer.7z ├── TraceServer.war ├── TraceServer ├── .idea │ ├── artifacts │ │ └── TraceServer.xml │ ├── encodings.xml │ ├── kotlinc.xml │ ├── misc.xml │ ├── modules.xml │ └── workspace.xml ├── Libs │ ├── fastjson-1.2.32.jar │ └── sqlite-jdbc-3.16.1.jar ├── src │ ├── DBManager.java │ ├── Entity_Record.java │ ├── Entity_RequestTrace.java │ ├── Entity_TotalInfo.java │ ├── ErrorEnum.java │ ├── Response.java │ └── Trace.java └── web │ ├── 0.jpg │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── WEB-INF │ ├── META-INF │ │ └── MANIFEST.MF │ └── web.xml │ └── index.html ├── debug.keystore └── keystore说明.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # Intellij 36 | *.iml 37 | .idea/workspace.xml 38 | .idea/tasks.xml 39 | .idea/gradle.xml 40 | .idea/dictionaries 41 | .idea/libraries 42 | 43 | # Keystore files 44 | *.jks 45 | 46 | # External native build folder generated in Android Studio 2.2 and later 47 | .externalNativeBuild 48 | 49 | # Google Services (e.g. APIs or Firebase) 50 | google-services.json 51 | 52 | # Freeline 53 | freeline.py 54 | freeline/ 55 | freeline_project_description.json 56 | -------------------------------------------------------------------------------- /0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/0.png -------------------------------------------------------------------------------- /1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/1.jpg -------------------------------------------------------------------------------- /2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/2.jpg -------------------------------------------------------------------------------- /3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/3.jpg -------------------------------------------------------------------------------- /4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/4.jpg -------------------------------------------------------------------------------- /5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/5.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TraceDemo 2 | 运动类画轨迹等实现demo,包括锁屏,画轨迹,分享截图和记录等功能,基本满足单一类型App的功能了,同时我也写了后台服务,方便大家调试,后台使用tomcat服务,依赖fastjson和sqlite数据库。 3 | 4 | 运动类轨迹记录Demo(Android和Tomcat源码) 5 | 6 | 因为一些原因,这个我很早就写好了,知道公司的App不用这个功能了,大概连续3个版本后我才公开的,里面有一些问题欢迎指正, 7 | 8 | QQ:1264957104 9 | 10 | [个人主页:http://lujianchao.com](http://lujianchao.com) 11 | 12 | [个人主页:http://itgowo.com](http://itgowo.com) 13 | 14 | 15 | 声明:文件下载使用的是我自己写的文件服务器,所有文件都是一个id表示,支持断点续传,同名(同路径)文件会被替换,从C盘移动到d盘再次上传会被认为是两个文件,同一个路径视为同一个文件进行更新,空间有限,只能这样了 16 | 17 | 18 | [App和Server源码 下载地址1(非Github)](http://file.itgowo.com/download/project/TraceDemoSrcAll/TraceDemo%28App%2BServer%29.zip) 19 | 20 | [App和Server源码 下载地址2(非Github)](http://lujianchao.com:8081/Server/file/download?fileid=58) 21 | 22 | [Apk高速下载地址(非Github)](http://file.itgowo.com/download/project/TraceDemoSrcAll/TraceDemoApp.apk) 23 | 24 | 简单介绍 25 | 26 | 1:Android demo最开始页面 27 | 28 | ![image](https://github.com/hnsugar/TraceDemo/blob/master/0.png) 29 | 30 | 地图使用的是百度地图,单独申请的key,放到了源码中 31 | 32 | 默认进来就会获取总运动里程和总时间,切换运动类型可以更新数据 33 | 34 | 右上角一个是排行,因为demo没有用户区分处理,所以无效,另一个是记录,根据首页选择运动类型显示相应类型数据记录 35 | 36 | 37 | 38 | ![image](https://github.com/hnsugar/TraceDemo/blob/master/1.jpg) 39 | 40 | 因为在楼间定位不准确,只能这么看了 41 | 42 | 配速是单位路程所使用的时间,这里是千米每秒,显示格式为分秒,如果超过1小时会显示小时 43 | 44 | 45 | ![image](https://github.com/hnsugar/TraceDemo/blob/master/2.jpg) 46 | 47 | 按住锁屏按钮有动画并计时,计时到了全屏加一层遮罩;滑动解锁。 48 | 49 | 50 | ![image](https://github.com/hnsugar/TraceDemo/blob/master/3.jpg) 51 | 52 | 运动中可以点击下方距离时间区域,自动收回和展开,有动画 53 | 54 | 55 | ![image](https://github.com/hnsugar/TraceDemo/blob/master/4.jpg) 56 | 57 | 根据日期分割 58 | 59 | 列表支持刷新和加载更多,增加自定义方法,空数据有单独显示,默认加了上次刷新时间提示。 60 | 61 | 62 | ![image](https://github.com/hnsugar/TraceDemo/blob/master/5.jpg) 63 | 64 | 上面右侧是分享记录的路程,左上是用户名和备注信息,用画笔画的bitmap。 65 | 66 | 67 | 1:Tomcat 源码 68 | 69 | 使用了fastjson和sqlite-jdbc,不用担心数据库有密码泄露了(ˇˍˇ) 想~ 70 | 71 | Servlet是用IntelliJ IDEA开发的,只有一个Servlet做了上传记录获取记录和列表等多个功能,个人感觉一个接口就够用了 72 | 73 | 非专业开发,勿喷,有用中文做参数的 74 | 75 | QQ:1264957104 76 | 77 | 个人主页:http://lujianchao.com 78 | 79 | 个人主页:http://itgowo.com 80 | -------------------------------------------------------------------------------- /TraceDemo.7z: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo.7z -------------------------------------------------------------------------------- /TraceDemo/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /TraceDemo/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /TraceDemo/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /TraceDemo/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /TraceDemo/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | -------------------------------------------------------------------------------- /TraceDemo/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /TraceDemo/.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /TraceDemo/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /TraceDemo/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "25.0.3" 6 | 7 | signingConfigs { 8 | release { 9 | storeFile file('keystore.jks') 10 | storePassword "123456" 11 | keyAlias "tracedemo" 12 | keyPassword "123456" 13 | } 14 | 15 | } 16 | 17 | defaultConfig { 18 | applicationId "com.itgowo.sport.trace.tracedemo" 19 | minSdkVersion 15 20 | targetSdkVersion 25 21 | versionCode 1 22 | versionName "1.0" 23 | } 24 | 25 | buildTypes { 26 | release { 27 | minifyEnabled false 28 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 29 | } 30 | 31 | } 32 | dexOptions { 33 | incremental true 34 | javaMaxHeapSize "4g" 35 | } 36 | sourceSets { 37 | main { 38 | jniLibs.srcDirs = ['libs'] 39 | } 40 | } 41 | 42 | } 43 | 44 | dependencies { 45 | compile fileTree(include: ['*.jar'], dir: 'libs') 46 | compile 'com.android.support:appcompat-v7:25.3.1' 47 | compile 'com.android.support.constraint:constraint-layout:1.0.2' 48 | 49 | 50 | //Android 6.0权限插件库 51 | compile 'com.github.hotchemi:permissionsdispatcher:2.3.2' 52 | annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.3.2' 53 | 54 | 55 | compile 'com.github.bumptech.glide:glide:3.7.0' 56 | } 57 | -------------------------------------------------------------------------------- /TraceDemo/app/debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/debug.keystore -------------------------------------------------------------------------------- /TraceDemo/app/keystore说明.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/keystore说明.txt -------------------------------------------------------------------------------- /TraceDemo/app/libs/BaiduLBS_Android.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/BaiduLBS_Android.jar -------------------------------------------------------------------------------- /TraceDemo/app/libs/arm64-v8a/libBaiduMapSDK_base_v4_3_1.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/arm64-v8a/libBaiduMapSDK_base_v4_3_1.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/arm64-v8a/libBaiduMapSDK_map_v4_3_1.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/arm64-v8a/libBaiduMapSDK_map_v4_3_1.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/arm64-v8a/liblocSDK7a.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/arm64-v8a/liblocSDK7a.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/armeabi-v7a/libBaiduMapSDK_base_v4_3_1.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/armeabi-v7a/libBaiduMapSDK_base_v4_3_1.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/armeabi-v7a/libBaiduMapSDK_map_v4_3_1.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/armeabi-v7a/libBaiduMapSDK_map_v4_3_1.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/armeabi-v7a/liblocSDK7a.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/armeabi-v7a/liblocSDK7a.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/armeabi/libBaiduMapSDK_base_v4_3_1.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/armeabi/libBaiduMapSDK_base_v4_3_1.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/armeabi/libBaiduMapSDK_map_v4_3_1.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/armeabi/libBaiduMapSDK_map_v4_3_1.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/armeabi/liblocSDK7a.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/armeabi/liblocSDK7a.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/fastjson-1.2.31.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/fastjson-1.2.31.jar -------------------------------------------------------------------------------- /TraceDemo/app/libs/x86/libBaiduMapSDK_base_v4_3_1.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/x86/libBaiduMapSDK_base_v4_3_1.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/x86/libBaiduMapSDK_map_v4_3_1.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/x86/libBaiduMapSDK_map_v4_3_1.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/x86/liblocSDK7a.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/x86/liblocSDK7a.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/x86_64/libBaiduMapSDK_base_v4_3_1.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/x86_64/libBaiduMapSDK_base_v4_3_1.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/x86_64/libBaiduMapSDK_map_v4_3_1.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/x86_64/libBaiduMapSDK_map_v4_3_1.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/x86_64/liblocSDK7a.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/x86_64/liblocSDK7a.so -------------------------------------------------------------------------------- /TraceDemo/app/libs/xutils-3.5.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/libs/xutils-3.5.0.jar -------------------------------------------------------------------------------- /TraceDemo/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in E:\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /TraceDemo/app/src/androidTest/java/com/itgowo/sport/trace/tracedemo/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo; 2 | 3 | 4 | 5 | 6 | /** 7 | * Instrumentation test, which will execute on an Android device. 8 | * 9 | * @see Testing documentation 10 | */ 11 | 12 | public class ExampleInstrumentedTest { 13 | 14 | public void useAppContext() throws Exception { 15 | // Context of the app under test. 16 | 17 | 18 | 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 31 | //key:开发者申请的Key 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.webkit.WebChromeClient; 7 | import android.webkit.WebView; 8 | import android.webkit.WebViewClient; 9 | 10 | import com.itgowo.sport.trace.tracedemo.Trace.TraceMainActivity; 11 | 12 | public class MainActivity extends AppCompatActivity { 13 | private WebView mWebView; 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | setContentView(R.layout.activity_main); 18 | mWebView= (WebView) findViewById(R.id.webview); 19 | mWebView.setWebChromeClient(new WebChromeClient()); 20 | mWebView.setWebViewClient(new WebViewClient()); 21 | mWebView.getSettings().setJavaScriptEnabled(true); 22 | mWebView.loadUrl("http://itgowo.com:8081/TraceServer"); 23 | } 24 | public void onClick(View mView){ 25 | TraceMainActivity.StartActivity(this); 26 | } 27 | 28 | @Override 29 | protected void onDestroy() { 30 | mWebView.stopLoading(); 31 | mWebView.destroy(); 32 | super.onDestroy(); 33 | 34 | 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Other/ActivityStack.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Other; 2 | 3 | import android.app.Activity; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | /** 9 | * Created by Lu on 2015/10/21. 10 | * 创建Activity栈,提供父类通用方法,方便管理 11 | * 12 | * @author lujianchao 13 | */ 14 | public class ActivityStack { 15 | private static ActivityStack activityStack = new ActivityStack (); 16 | 17 | /** 18 | * 单例——ActivityStack 19 | */ 20 | private ActivityStack() { 21 | } 22 | 23 | public static ActivityStack getInstance () { 24 | return activityStack; 25 | } 26 | 27 | /** 28 | * Activity栈 29 | */ 30 | private List activities = new ArrayList (); 31 | 32 | /** 33 | * add a activity to Stack 34 | * 添加activity到栈 35 | * 36 | * @param activity 37 | */ 38 | public void pushStack (Activity activity) { 39 | activities.add (activity); 40 | } 41 | 42 | /** 43 | * remove a activity to Stack 44 | * 从栈移出一个activity 45 | * 46 | * @param activity 47 | */ 48 | public void popStack (Activity activity) { 49 | activities.remove (activity); 50 | } 51 | 52 | /** 53 | * 销毁Activity 54 | * destroy activity 55 | * 56 | * @param activityClass 57 | */ 58 | 59 | public void killActivity (Class activityClass) { 60 | for (Activity a : activities) { 61 | if (a.getClass ().getName ().equals (activityClass.getName ())) { 62 | a.finish (); 63 | } 64 | } 65 | } 66 | 67 | /** 68 | * 销毁Activity 69 | * destroy activity 70 | * 71 | * @param activityClassName 72 | */ 73 | public void killActivity (String activityClassName) { 74 | for (Activity a : activities) { 75 | if (a.getClass ().getName ().equals (activityClassName)) { 76 | a.finish (); 77 | } 78 | } 79 | } 80 | 81 | /** 82 | * 完全退出 83 | * Exit Application 84 | */ 85 | public void exit () { 86 | for (Activity a : activities) { 87 | a.finish (); 88 | } 89 | System.exit (0); 90 | } 91 | 92 | /** 93 | * 判断activity栈里是否有对应的activity 94 | * @param mActivity 95 | * @return 96 | */ 97 | public boolean getActivityIsLive (Class mActivity) { 98 | for (Activity a : activities) { 99 | if (a.getClass ().getName () == mActivity.getName ()) { 100 | return true; 101 | } 102 | } 103 | return false; 104 | } 105 | /** 106 | * 获取activity栈里对应的activity 107 | * @param mActivity 108 | * @return 109 | */ 110 | public Activity getActivity (Class mActivity) { 111 | for (Activity a : activities) { 112 | if (a.getClass ().getName () == mActivity.getName ()) { 113 | return a; 114 | } 115 | } 116 | return null; 117 | } 118 | /** 119 | * 关闭所有界面 120 | */ 121 | public void FinishAllActivity () { 122 | for (Activity a : activities) { 123 | a.finish (); 124 | } 125 | 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Other/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Other; 2 | 3 | import android.app.Activity; 4 | import android.graphics.drawable.Drawable; 5 | import android.os.Build; 6 | import android.os.Bundle; 7 | import android.support.v7.app.AppCompatActivity; 8 | import android.view.WindowManager; 9 | 10 | import com.itgowo.sport.trace.tracedemo.R; 11 | 12 | 13 | /** 14 | * Created by lujianchao on 2016/11/16. 15 | * 16 | * @author lujianchao 17 | */ 18 | 19 | public abstract class BaseActivity extends AppCompatActivity { 20 | public final int ACTIVITY_CAMREA = 100, ACTIVITY_ALBUM = 101, ACTIVITY_CUT = 102; 21 | public final int ACTIVITY_RESULT_MatchSportActivity = 1001, ACTIVITY_MatchCitySearchActivity = 1002; 22 | public static final String USERID = "userid"; 23 | public static final String MATCHID = "matchid"; 24 | private String tag; 25 | public TitleBarView mTitleBarView; 26 | public Activity mContext; 27 | public float SrceenDensity, SrceenWidth, SrceenHeight; 28 | private SystemBarTintUtil tintManager; 29 | 30 | /** 31 | * 控制Log输出 32 | * 测试版isrelease=false,发行版为true 33 | */ 34 | private ActivityStack myactivityStack = ActivityStack.getInstance(); 35 | 36 | @Override 37 | protected void onCreate(Bundle savedInstanceState) { 38 | super.onCreate(savedInstanceState); 39 | mContext = this; 40 | myactivityStack.pushStack(this); 41 | tag = this.getClass().getSimpleName(); 42 | SrceenDensity = getResources().getDisplayMetrics().density; 43 | SrceenWidth = getResources().getDisplayMetrics().widthPixels; 44 | SrceenHeight = getResources().getDisplayMetrics().heightPixels; 45 | } 46 | 47 | @Override 48 | public void setContentView(final int layoutResID) { 49 | super.setContentView(layoutResID); 50 | mTitleBarView = (TitleBarView) getWindow().getDecorView().findViewWithTag(TitleBarView.Tag); 51 | if (mTitleBarView != null) { 52 | initTitleBarData(mTitleBarView); 53 | } 54 | if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { 55 | getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 56 | } 57 | tintManager = new SystemBarTintUtil(this); 58 | // enable status bar tint 59 | tintManager.setStatusBarTintEnabled(true); 60 | // enable navigation bar tint 61 | tintManager.setNavigationBarTintEnabled(true); 62 | // set a custom tint color for all system bars 63 | if (setTintColor() != -1) { 64 | tintManager.setTintColor(setTintColor()); 65 | } 66 | // set a custom navigation bar resource 67 | if (setNavigationBarTintResource() != -1) { 68 | tintManager.setNavigationBarTintResource(setNavigationBarTintResource()); 69 | } 70 | 71 | // set a custom status bar drawable 72 | if (setStatusBarTintDrawable() != null) { 73 | tintManager.setStatusBarTintDrawable(setStatusBarTintDrawable()); 74 | } 75 | 76 | } 77 | 78 | /** 79 | * 设置沉浸式状态栏颜色 80 | * 81 | * @return 82 | */ 83 | protected int setTintColor() { 84 | return getResources().getColor(R.color.ActivityTitleBackgroundColor); 85 | } 86 | 87 | /** 88 | * 设置导航栏颜色 89 | * 90 | * @return 91 | */ 92 | protected int setNavigationBarTintResource() { 93 | return -1; 94 | } 95 | 96 | /** 97 | * 设置状态栏背景图 98 | * 99 | * @return 100 | */ 101 | protected Drawable setStatusBarTintDrawable() { 102 | return null; 103 | } 104 | 105 | @Override 106 | protected void onResume() { 107 | super.onResume(); 108 | } 109 | 110 | @Override 111 | protected void onPause() { 112 | super.onPause(); 113 | } 114 | 115 | @Override 116 | protected void onDestroy() { 117 | myactivityStack.popStack(this); 118 | super.onDestroy(); 119 | System.gc(); 120 | } 121 | 122 | 123 | /** 124 | * @param mTitleBarView 125 | */ 126 | protected abstract void initTitleBarData(TitleBarView mTitleBarView); 127 | 128 | 129 | } 130 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Other/DragButton/SlidingButtonLayout.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Other.DragButton; 2 | 3 | import android.content.Context; 4 | import android.content.res.TypedArray; 5 | import android.graphics.Point; 6 | import android.graphics.drawable.ColorDrawable; 7 | import android.graphics.drawable.Drawable; 8 | import android.support.v4.widget.ViewDragHelper; 9 | import android.text.TextUtils; 10 | import android.util.AttributeSet; 11 | import android.util.Log; 12 | import android.view.LayoutInflater; 13 | import android.view.MotionEvent; 14 | import android.view.View; 15 | import android.view.ViewGroup; 16 | import android.widget.FrameLayout; 17 | import android.widget.ImageView; 18 | import android.widget.TextView; 19 | 20 | import com.itgowo.sport.trace.tracedemo.R; 21 | 22 | 23 | /** 24 | * Created by admin on 2016/4/21. 25 | */ 26 | public class SlidingButtonLayout extends FrameLayout { 27 | 28 | private ViewDragHelper mViewDragHelper; 29 | private ImageView mImageView; 30 | private TextView mTextView; 31 | private ViewGroup parentGroup; 32 | private Point initPosition = new Point(); 33 | private boolean islayout=false; 34 | 35 | //拖动前显示的text 36 | private String initText; 37 | //拖动完成以后显示的str 38 | private String dragFinishText; 39 | 40 | private Drawable initImageViewDrawable; 41 | private Drawable dragFinishDrawable; 42 | 43 | private Drawable initTextViewDrawable; 44 | private Drawable dragTextViewFinishDrawable; 45 | 46 | //拖动前显示的可滑动imageview背景色 47 | private int ivBackgroundColor; 48 | //拖动完成后显示的可滑动imageview背景色 49 | private int dragFinishIvBackgroundColor; 50 | 51 | //拖动前显示的底部背景色 52 | private int tvBackgroundColor; 53 | //拖动完成后显示的底部背景色 54 | private int dragFinishTvBackgroundColor; 55 | 56 | //拖动前显示的字体颜色 57 | private int textViewTextColor; 58 | //拖动后显示的字体颜色 59 | private int dragFinishTextViewTextColor; 60 | 61 | 62 | private OnFinshDragListener mOnFinshDragListener; 63 | //是否完成拖动 默认是没有 为false 64 | private boolean isFinishDragFlag = false; 65 | 66 | public void setOnFinshDragListener(OnFinshDragListener onFinshDragListener) { 67 | mOnFinshDragListener = onFinshDragListener; 68 | } 69 | 70 | /** 71 | * 参数可以为空 72 | * 73 | * @param dragFinishText 拖动完成以后显示的text 74 | * @param dragFinishDrawable 拖动完成以后 可拖动按钮显示的图片 75 | */ 76 | public void initUIconfig(String dragFinishText, Drawable dragFinishDrawable) { 77 | this.dragFinishText = dragFinishText; 78 | this.dragFinishDrawable = dragFinishDrawable; 79 | } 80 | 81 | 82 | public SlidingButtonLayout(Context context) { 83 | super(context); 84 | } 85 | 86 | /** 87 | * 滑动完成以后的ui变化 88 | */ 89 | private void dragFinishUiChange() { 90 | if (!TextUtils.isEmpty(dragFinishText)) { 91 | mTextView.setText(dragFinishText); 92 | } 93 | mTextView.setBackgroundColor(dragFinishTvBackgroundColor); 94 | mTextView.setTextColor(dragFinishTextViewTextColor); 95 | //对于可拖动imageview来说 如果有背景图 那肯定优先背景图 否则背景色 96 | if (null != dragFinishDrawable) { 97 | mImageView.setBackgroundDrawable(dragFinishDrawable); 98 | } else { 99 | mImageView.setBackgroundDrawable(new ColorDrawable(dragFinishIvBackgroundColor)); 100 | } 101 | } 102 | 103 | public SlidingButtonLayout(Context context, AttributeSet attrs) { 104 | super(context, attrs); 105 | LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 106 | View view = layoutInflater.inflate(R.layout.sliding_layout, this); 107 | parentGroup = (ViewGroup) findViewById(R.id.parent_group); 108 | mImageView = (ImageView) view.findViewById(R.id.drag_button); 109 | mTextView = (TextView) view.findViewById(R.id.content_textview); 110 | initStyles(context, attrs); 111 | mViewDragHelper = ViewDragHelper.create(parentGroup, 1.0f, new ViewDragHelper.Callback() { 112 | @Override 113 | public boolean tryCaptureView(View child, int pointerId) { 114 | if (isFinishDragFlag) { 115 | return false; 116 | } 117 | 118 | if (child == mImageView) { 119 | return true; 120 | } 121 | return false; 122 | } 123 | 124 | @Override 125 | public int clampViewPositionVertical(View child, int top, int dy) { 126 | return initPosition.y; 127 | } 128 | 129 | @Override 130 | public int clampViewPositionHorizontal(View child, int left, int dx) { 131 | 132 | //取得左边界的坐标 133 | final int leftBound = getPaddingLeft(); 134 | //取得右边界的坐标 135 | final int rightBound = getWidth() - child.getWidth() - leftBound; 136 | //这个地方的含义就是 如果left的值 在leftbound和rightBound之间 那么就返回left 137 | //如果left的值 比 leftbound还要小 那么就说明 超过了左边界 那我们只能返回给他左边界的值 138 | //如果left的值 比rightbound还要大 那么就说明 超过了右边界,那我们只能返回给他右边界的值 139 | if (left > rightBound - 20) { 140 | Log.v("wuyue", "触发完成动作的回掉"); 141 | isFinishDragFlag = true; 142 | } 143 | return Math.min(Math.max(left, leftBound), rightBound); 144 | } 145 | 146 | @Override 147 | public void onViewReleased(View releasedChild, float xvel, float yvel) { 148 | //松手的时候 判断如果是这个view 就让他回到起始位置 149 | if (releasedChild == mImageView && !isFinishDragFlag) { 150 | Log.v("wuyue", "触发回弹"); 151 | mViewDragHelper.settleCapturedViewAt(initPosition.x, initPosition.y); 152 | invalidate(); 153 | } else { 154 | if (mOnFinshDragListener != null) { 155 | mOnFinshDragListener.onFinshDragDone(); 156 | } 157 | mViewDragHelper.settleCapturedViewAt(initPosition.x, initPosition.y); 158 | invalidate(); 159 | isFinishDragFlag=false; 160 | // dragFinishUiChange(); 161 | } 162 | } 163 | } 164 | ); 165 | 166 | } 167 | 168 | private void initStyles(Context context, AttributeSet attrs) { 169 | TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.slidingButtonLayout); 170 | initText = typedArray.getString(R.styleable.slidingButtonLayout_textview_text); 171 | dragFinishText = typedArray.getString(R.styleable.slidingButtonLayout_textview_dragfinish_text); 172 | tvBackgroundColor = typedArray.getColor(R.styleable.slidingButtonLayout_textview_backgroundColor, 0); 173 | dragFinishTextViewTextColor = typedArray.getColor(R.styleable.slidingButtonLayout_textview_dragfinish_textcolor, 0); 174 | dragFinishTvBackgroundColor = typedArray.getColor(R.styleable.slidingButtonLayout_textview_dragfinish_backgroundColor, 0); 175 | initImageViewDrawable = typedArray.getDrawable(R.styleable.slidingButtonLayout_imageview_background); 176 | dragFinishDrawable = typedArray.getDrawable(R.styleable.slidingButtonLayout_imageview_dragfinish_background); 177 | ivBackgroundColor = typedArray.getColor(R.styleable.slidingButtonLayout_imageview_backgroundColor, 0); 178 | dragFinishIvBackgroundColor = typedArray.getColor(R.styleable.slidingButtonLayout_imageview_dragfinish_backgroundColor, 0); 179 | initTextViewDrawable = typedArray.getDrawable(R.styleable.slidingButtonLayout_textview_backgroundDrawable); 180 | dragTextViewFinishDrawable = typedArray.getDrawable(R.styleable.slidingButtonLayout_textview_dragfinish_backgroundDrawable); 181 | mTextView.setText(initText); 182 | textViewTextColor = typedArray.getColor(R.styleable.slidingButtonLayout_textview_textcolor, 0xffffff); 183 | mTextView.setTextColor(textViewTextColor); 184 | //textview 背景图处理 图片资源优先 185 | if (null != initTextViewDrawable) { 186 | mTextView.setBackgroundDrawable(initTextViewDrawable); 187 | } else { 188 | mTextView.setBackgroundDrawable(new ColorDrawable(tvBackgroundColor)); 189 | } 190 | //可滑动imageview 背景处理 图片资源优先 191 | if (null != initImageViewDrawable) { 192 | mImageView.setBackgroundDrawable(initImageViewDrawable); 193 | } else { 194 | mImageView.setBackgroundDrawable(new ColorDrawable(ivBackgroundColor)); 195 | } 196 | typedArray.recycle(); 197 | } 198 | 199 | 200 | public SlidingButtonLayout(Context context, AttributeSet attrs, int defStyleAttr) { 201 | super(context, attrs, defStyleAttr); 202 | } 203 | 204 | // public SlidingButtonLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 205 | // super(context, attrs, defStyleAttr, defStyleRes); 206 | // } 207 | 208 | @Override 209 | public void computeScroll() { 210 | if (mViewDragHelper.continueSettling(true)) { 211 | invalidate(); 212 | } 213 | } 214 | 215 | @Override 216 | protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 217 | //触发事件完成以后 就不可以再layout 回到初始位置了 218 | if (isFinishDragFlag) { 219 | return; 220 | } 221 | super.onLayout(changed, left, top, right, bottom); 222 | if (islayout){ 223 | return; 224 | } 225 | initPosition.x = mImageView.getLeft(); 226 | initPosition.y = mImageView.getTop(); 227 | islayout=true; 228 | } 229 | 230 | @Override 231 | public boolean onInterceptTouchEvent(MotionEvent ev) { 232 | return mViewDragHelper.shouldInterceptTouchEvent(ev); 233 | } 234 | 235 | @Override 236 | public boolean onTouchEvent(MotionEvent event) { 237 | mViewDragHelper.processTouchEvent(event); 238 | return true; 239 | } 240 | 241 | @Override 242 | protected void onFinishInflate() { 243 | super.onFinishInflate(); 244 | } 245 | 246 | public interface OnFinshDragListener { 247 | public void onFinshDragDone(); 248 | } 249 | 250 | } 251 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Other/QKManager.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Other; 2 | 3 | 4 | import android.app.AlertDialog; 5 | import android.content.ActivityNotFoundException; 6 | import android.content.Context; 7 | import android.content.DialogInterface; 8 | import android.content.Intent; 9 | import android.net.Uri; 10 | import android.os.Environment; 11 | import android.support.annotation.DrawableRes; 12 | import android.support.annotation.Nullable; 13 | import android.view.View; 14 | import android.widget.AdapterView; 15 | import android.widget.ImageView; 16 | import android.widget.TextView; 17 | 18 | import com.alibaba.fastjson.JSON; 19 | import com.bumptech.glide.Glide; 20 | import com.itgowo.sport.trace.tracedemo.R; 21 | 22 | import org.xutils.common.Callback; 23 | import org.xutils.common.util.KeyValue; 24 | import org.xutils.http.RequestParams; 25 | import org.xutils.http.annotation.HttpResponse; 26 | import org.xutils.http.app.ResponseParser; 27 | import org.xutils.http.request.UriRequest; 28 | import org.xutils.x; 29 | 30 | import java.io.File; 31 | import java.lang.reflect.Type; 32 | import java.util.List; 33 | 34 | 35 | import static org.xutils.x.http; 36 | 37 | /** 38 | * Created by lujianchao on 2016/10/26. 39 | */ 40 | 41 | public class QKManager { 42 | 43 | /** 44 | * 统一请求框架最基础方法,更换第三方可以修改这里 45 | * 46 | * @param url 请求网址 47 | * @param head 请求头 48 | * @param body 请求体 49 | * @param callbackListener 请求回掉 50 | * @return 51 | */ 52 | 53 | 54 | public static void http_post(String url, String head, Object body, final onNetCallbackListener callbackListener) { 55 | String string = ""; 56 | if (body instanceof String) { 57 | string = (String) body; 58 | } else { 59 | string = JSON.toJSONString(body); 60 | } 61 | RequestParams requestParams = new RequestParams(url); 62 | requestParams.addHeader("", head); 63 | requestParams.setBodyContent(string); 64 | requestParams.setAsJsonContent(true); 65 | final String finalString = string; 66 | http().post(requestParams, new Callback.CommonCallback() { 67 | 68 | @Override 69 | public void onSuccess(final String s) { 70 | 71 | if (callbackListener != null) { 72 | callbackListener.onSuccess(finalString, s); 73 | } 74 | } 75 | 76 | @Override 77 | public void onError(final Throwable throwable, final boolean b) { 78 | if (callbackListener != null) { 79 | callbackListener.onError(throwable); 80 | } 81 | } 82 | 83 | @Override 84 | public void onCancelled(final CancelledException e) { 85 | if (callbackListener != null) { 86 | callbackListener.onCancelled(); 87 | } 88 | } 89 | 90 | @Override 91 | public void onFinished() { 92 | if (callbackListener != null) { 93 | callbackListener.onFinished(); 94 | } 95 | } 96 | 97 | }); 98 | } 99 | 100 | /** 101 | * 统一请求框架最基础方法,更换第三方可以修改这里 102 | * 同步方法 103 | * 104 | * @param url 请求网址 105 | * @param head 请求头 106 | * @param body 请求体 107 | * @return 108 | */ 109 | 110 | public static String http_PostSync(String url, String head, Object body) { 111 | String string = ""; 112 | if (body instanceof String) { 113 | string = (String) body; 114 | } else { 115 | string = JSON.toJSONString(body); 116 | } 117 | RequestParams requestParams = new RequestParams(url); 118 | requestParams.addHeader("", head); 119 | requestParams.addBodyParameter("", string); 120 | requestParams.setAsJsonContent(true); 121 | try { 122 | return x.http().postSync(requestParams, String.class); 123 | } catch (Throwable mThrowable) { 124 | mThrowable.printStackTrace(); 125 | } 126 | return null; 127 | } 128 | 129 | @HttpResponse(parser = jsonnoParser.class) 130 | public class jsonnoParser implements ResponseParser { 131 | 132 | @Override 133 | public void checkResponse(final UriRequest mUriRequest) throws Throwable { 134 | 135 | } 136 | 137 | @Override 138 | public String parse(final Type mType, final Class mClass, final String mS) throws Throwable { 139 | 140 | return mS; 141 | } 142 | } 143 | 144 | /** 145 | * 统一请求框架最基础方法,更换第三方可以修改这里 146 | * 147 | * @param url 请求网址 148 | * @param head 请求头 149 | * @param body 请求体 150 | * @param callbackListener 请求回掉 151 | * @return 152 | */ 153 | public static void http_get(String url, String head, Object body, final onNetCallbackListener callbackListener) { 154 | String string = ""; 155 | if (body instanceof String) { 156 | string = (String) body; 157 | } else { 158 | string = JSON.toJSONString(body); 159 | } 160 | RequestParams requestParams = new RequestParams(url); 161 | requestParams.addHeader("", head); 162 | requestParams.addBodyParameter("", string); 163 | final String finalString = string; 164 | http().get(requestParams, new Callback.CommonCallback() { 165 | 166 | @Override 167 | public void onSuccess(final String s) { 168 | if (callbackListener != null) { 169 | callbackListener.onSuccess(finalString, s); 170 | } 171 | } 172 | 173 | @Override 174 | public void onError(final Throwable throwable, final boolean b) { 175 | if (callbackListener != null) { 176 | callbackListener.onError(throwable); 177 | } 178 | 179 | } 180 | 181 | @Override 182 | public void onCancelled(final CancelledException e) { 183 | if (callbackListener != null) { 184 | callbackListener.onCancelled(); 185 | } 186 | } 187 | 188 | @Override 189 | public void onFinished() { 190 | if (callbackListener != null) { 191 | callbackListener.onFinished(); 192 | } 193 | } 194 | 195 | }); 196 | } 197 | 198 | 199 | /** 200 | * 加载图片 201 | * 202 | * @param uri 203 | * @param imageView 204 | */ 205 | public static void image(Context mContext, String uri, ImageView imageView) { 206 | try { 207 | Glide.with(mContext).load(uri).dontAnimate().into(imageView); 208 | } catch (Exception mE) { 209 | 210 | } 211 | } 212 | 213 | /** 214 | * 加载图片 215 | * 216 | * @param mContext 217 | * @param uri 218 | * @param err 219 | * @param imageView 220 | */ 221 | 222 | public static void image(Context mContext, String uri, @DrawableRes int err, ImageView imageView) { 223 | try { 224 | Glide.with(mContext).load(uri).error(err).into(imageView); 225 | } catch (Exception mE) { 226 | 227 | } 228 | 229 | } 230 | 231 | /** 232 | * 加载图片 233 | * 234 | * @param mContext 235 | * @param uri 236 | * @param err 237 | * @param imageView 238 | */ 239 | 240 | public static void image(Context mContext, String uri, @DrawableRes int placeholder, @DrawableRes int err, ImageView imageView) { 241 | try { 242 | Glide.with(mContext).load(uri).error(err).placeholder(placeholder).into(imageView); 243 | } catch (Exception mE) { 244 | 245 | } 246 | 247 | } 248 | 249 | /** 250 | * 加载图片 251 | * 252 | * @param uri 253 | * @param imageView 254 | */ 255 | public static void image(Context mContext, File uri, ImageView imageView) { 256 | try { 257 | Glide.with(mContext).load(uri).into(imageView); 258 | } catch (Exception mE) { 259 | 260 | } 261 | 262 | } 263 | 264 | /** 265 | * 加载图片 266 | * 267 | * @param uri 268 | * @param imageView 269 | */ 270 | public static void image(Context mContext, Uri uri, ImageView imageView) { 271 | try { 272 | Glide.with(mContext).load(uri).into(imageView); 273 | } catch (Exception mE) { 274 | 275 | } 276 | 277 | } 278 | 279 | /** 280 | * 加载图片 281 | * 282 | * @param uri 283 | * @param imageView 284 | */ 285 | public static void image(Context mContext, byte[] uri, ImageView imageView) { 286 | try { 287 | Glide.with(mContext).load(uri).into(imageView); 288 | } catch (Exception mE) { 289 | 290 | } 291 | 292 | } 293 | 294 | /** 295 | * 加载图片 296 | * 297 | * @param uri 298 | * @param imageView 299 | */ 300 | public static void image(Context mContext, int uri, ImageView imageView) { 301 | try { 302 | Glide.with(mContext).load(uri).into(imageView); 303 | } catch (Exception mE) { 304 | 305 | } 306 | 307 | } 308 | 309 | /** 310 | * Wait Dialog 311 | */ 312 | private static AlertDialog mWaitDialog; 313 | 314 | public static void waitDialogToShow(Context mContext) { 315 | waitDialogToShow(mContext, null, null, true); 316 | } 317 | 318 | /** 319 | * 显示dialog 320 | * 321 | * @param mContext 322 | * @param title 标题 可空 323 | * @param content 内容 可空 324 | * @param canable 可否取消 325 | */ 326 | public static void waitDialogToShow(Context mContext, @Nullable String title, @Nullable String content, boolean canable) { 327 | AlertDialog.Builder mBuilder = new AlertDialog.Builder(mContext, R.style.WaitDialog); 328 | if (title != null) { 329 | mBuilder.setTitle(title); 330 | } 331 | mBuilder.setCancelable(canable); 332 | View mView = View.inflate(mContext, R.layout.waitingdialog, null); 333 | TextView mTextView = (TextView) mView.findViewById(R.id.content); 334 | // SpinKitView mSpinKitView= (SpinKitView) mView.findViewById (R.id.skv); 335 | if (content != null) { 336 | mTextView.setText(content); 337 | } 338 | mBuilder.setView(mView); 339 | mWaitDialog = mBuilder.show(); 340 | } 341 | 342 | /** 343 | * 关闭dialog 344 | */ 345 | public static void waitDialogToClose() { 346 | if (mWaitDialog == null) { 347 | return; 348 | } 349 | mWaitDialog.dismiss(); 350 | } 351 | public interface onDialogListener{ 352 | public void onPositive(); 353 | public void onNegative(); 354 | } 355 | public static void ShowDialog_Normal(Context mContext, String mContent, final onDialogListener mListener) { 356 | final AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); 357 | dialog.setMessage(mContent).setPositiveButton("确定", new DialogInterface.OnClickListener() { 358 | @Override 359 | public void onClick(DialogInterface dialog, int which) { 360 | mListener.onPositive(); 361 | } 362 | }).setNegativeButton("取消", new DialogInterface.OnClickListener() { 363 | @Override 364 | public void onClick(DialogInterface dialog, int which) { 365 | mListener.onNegative(); 366 | } 367 | }) .show(); 368 | } 369 | public static String getLocalFileTemp(String ext) { 370 | if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !Environment.isExternalStorageRemovable()) { 371 | // return app.sApp.getExternalCacheDir() + qktool.time_getTimeYMDHm(System.currentTimeMillis())+ "." + ext; 372 | File mFile=new File("/sdcard/demo/"); 373 | mFile.mkdirs(); 374 | return "/sdcard/demo/" + qktool.time_getTimeYMDHm(System.currentTimeMillis())+ "." + ext; 375 | } 376 | 377 | return app.sApp.getCacheDir() + qktool.time_getTimeYMDHm(System.currentTimeMillis())+"." + ext; 378 | } 379 | } 380 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Other/Request.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Other; 2 | 3 | public class Request { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Other/Response.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Other; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | 5 | /** 6 | * Created by hnvfh on 2017/5/15. 7 | */ 8 | public class Response { 9 | private int code=200; 10 | private String msg="成功"; 11 | private Object data; 12 | 13 | public int getCode() { 14 | return code; 15 | } 16 | 17 | public Response setCode(int mCode) { 18 | code = mCode; 19 | return this; 20 | } 21 | 22 | public String getMsg() { 23 | return msg; 24 | } 25 | 26 | public Response setMsg(String mMsg) { 27 | msg = mMsg; 28 | return this; 29 | } 30 | 31 | public Object getData() { 32 | return data; 33 | } 34 | 35 | public Response setData(Object mData) { 36 | this.data = mData; 37 | return this; 38 | } 39 | public String toJson(){ 40 | return JSON.toJSONString(this); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Other/TitleBarView.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Other; 2 | 3 | import android.content.Context; 4 | import android.graphics.drawable.Drawable; 5 | import android.support.annotation.Nullable; 6 | import android.util.AttributeSet; 7 | import android.view.View; 8 | import android.widget.LinearLayout; 9 | import android.widget.RelativeLayout; 10 | import android.widget.TextView; 11 | 12 | import com.itgowo.sport.trace.tracedemo.R; 13 | 14 | 15 | /** 16 | * Created by lujianchao on 2016/11/16. 17 | * 18 | * @author lujianchao 19 | *

20 | * titlebar,不解释 21 | */ 22 | 23 | public class TitleBarView extends LinearLayout { 24 | public static final String Tag = "TitleBarView"; 25 | private RelativeLayout layout; 26 | private TextView titlebarLeftbt; 27 | private TextView titlebarTitle; 28 | private TextView titlebarRightbt; 29 | private TextView titlebar_rightotherbt; 30 | private OnClickListener mOnClickListener; 31 | private onTitleBarListener mOnTitleBarListener; 32 | 33 | 34 | public TitleBarView(final Context context, final AttributeSet attrs) { 35 | super (context, attrs); 36 | inflate (context, R.layout.titlebar_viewlayout, this); 37 | this.setTag (Tag); 38 | initView (); 39 | initListener (); 40 | } 41 | 42 | 43 | /** 44 | * 获取Titlebar左边textview 45 | * 46 | * @return TextView 47 | */ 48 | public TextView getTitlebarLeftbt () { 49 | return titlebarLeftbt; 50 | } 51 | 52 | /** 53 | * 获取Titlebar左边textview 54 | * 55 | * @return TextView 56 | */ 57 | public TextView getTitlebarTitle () { 58 | return titlebarTitle; 59 | } 60 | 61 | 62 | /** 63 | * 设置Title 64 | * 65 | * @param mTitle 66 | */ 67 | public void setTitle (String mTitle) { 68 | titlebarTitle.setText (mTitle); 69 | } 70 | 71 | public void setMsgRight (String mMsgRight) { 72 | titlebarRightbt.getLayoutParams ().width = LayoutParams.WRAP_CONTENT; 73 | titlebarRightbt.setText (mMsgRight); 74 | } 75 | 76 | public void setMsgLeft (String mMsgLeft) { 77 | titlebarLeftbt.getLayoutParams ().width = LayoutParams.WRAP_CONTENT; 78 | titlebarLeftbt.setText (mMsgLeft); 79 | } 80 | 81 | /** 82 | * 获取Titlebar左边textview 83 | * 84 | * @return TextView 85 | */ 86 | public TextView getTitlebarRightbt () { 87 | return titlebarRightbt; 88 | } 89 | 90 | /** 91 | * 获取Titlebar左边textview 92 | * 93 | * @return TextView 94 | */ 95 | public TextView getTitlebarRightOtherbt () { 96 | return titlebar_rightotherbt; 97 | } 98 | 99 | private void initListener () { 100 | mOnClickListener = new OnClickListener () { 101 | @Override 102 | public void onClick (final View mView) { 103 | if (mOnTitleBarListener != null) { 104 | switch (mView.getId ()) { 105 | case R.id.titlebar_leftbt: 106 | mOnTitleBarListener.onTitleBarLeftOnClick (mView); 107 | break; 108 | case R.id.titlebar_rightbt: 109 | mOnTitleBarListener.onTitleBarRightOnClick (mView); 110 | break; 111 | case R.id.titlebar_title: 112 | mOnTitleBarListener.onTitleBarTitleOnClick (mView); 113 | break; 114 | } 115 | } 116 | } 117 | }; 118 | titlebarTitle.setOnClickListener (mOnClickListener); 119 | titlebarRightbt.setOnClickListener (mOnClickListener); 120 | titlebarLeftbt.setOnClickListener (mOnClickListener); 121 | } 122 | 123 | private void initView () { 124 | layout = (RelativeLayout) findViewById (R.id.layout); 125 | titlebarLeftbt = (TextView) findViewById (R.id.titlebar_leftbt); 126 | titlebarTitle = (TextView) findViewById (R.id.titlebar_title); 127 | titlebarRightbt = (TextView) findViewById (R.id.titlebar_rightbt); 128 | titlebar_rightotherbt = (TextView) findViewById (R.id.titlebar_rightotherbt); 129 | } 130 | 131 | public RelativeLayout getLayoutView () { 132 | return layout; 133 | } 134 | 135 | /** 136 | * 设置TitleBar监听 137 | */ 138 | public void setonTitlebarListener (onTitleBarListener mTitlebarListener) { 139 | mOnTitleBarListener = mTitlebarListener; 140 | } 141 | 142 | public enum TitleBarChildView { 143 | LEFT, RIGHT, CENTER, RIGHTOTHER; 144 | } 145 | 146 | /** 147 | * 设置TitleBar中三个textview的图片用drawableleif形式 148 | * 149 | * @param res 资源ID 150 | * @param index 指定被操作的textview 151 | */ 152 | public void setDrawableLeft (int res, TitleBarChildView index) { 153 | Drawable mDrawable = getResources ().getDrawable (res); 154 | mDrawable.setBounds (0, 0, mDrawable.getMinimumWidth (), mDrawable.getMinimumHeight ()); 155 | if (index == TitleBarChildView.LEFT) { 156 | titlebarLeftbt.setCompoundDrawables (mDrawable, null, null, null); 157 | } else if (index == TitleBarChildView.RIGHT) { 158 | titlebarRightbt.setCompoundDrawables (mDrawable, null, null, null); 159 | } else if (index == TitleBarChildView.RIGHTOTHER) { 160 | titlebar_rightotherbt.setCompoundDrawables (mDrawable, null, null, null); 161 | } else { 162 | titlebarTitle.setCompoundDrawables (mDrawable, null, null, null); 163 | } 164 | } 165 | 166 | /** 167 | * 设置TitleBar中三个textview的图片用drawableright形式 168 | * 169 | * @param res 资源ID 170 | * @param index 指定被操作的textview 171 | */ 172 | public void setDrawableRight (@Nullable int res, TitleBarChildView index) { 173 | Drawable mDrawable = getResources ().getDrawable (res); 174 | mDrawable.setBounds (0, 0, mDrawable.getMinimumWidth (), mDrawable.getMinimumHeight ()); 175 | if (index == TitleBarChildView.LEFT) { 176 | titlebarLeftbt.setCompoundDrawables (null, null, mDrawable, null); 177 | } else if (index == TitleBarChildView.RIGHT) { 178 | titlebarRightbt.setCompoundDrawables (null, null, mDrawable, null); 179 | } else if (index == TitleBarChildView.RIGHTOTHER) { 180 | titlebar_rightotherbt.setCompoundDrawables (null, null, mDrawable, null); 181 | } else { 182 | titlebarTitle.setCompoundDrawables (null, null, mDrawable, null); 183 | } 184 | } 185 | 186 | public interface onTitleBarListener { 187 | public void onTitleBarLeftOnClick(View mView); 188 | 189 | public void onTitleBarRightOnClick(View mView); 190 | 191 | public void onTitleBarTitleOnClick(View mView); 192 | } 193 | 194 | } 195 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Other/XListView/XListViewFooter.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @file XFooterView.java 3 | * @create Mar 31, 2012 9:33:43 PM 4 | * @author Maxwin 5 | * @description XListView's footer 6 | */ 7 | package com.itgowo.sport.trace.tracedemo.Other.XListView; 8 | 9 | 10 | import android.content.Context; 11 | import android.util.AttributeSet; 12 | import android.view.LayoutInflater; 13 | import android.view.View; 14 | import android.widget.LinearLayout; 15 | import android.widget.TextView; 16 | 17 | import com.itgowo.sport.trace.tracedemo.R; 18 | 19 | 20 | public class XListViewFooter extends LinearLayout { 21 | public final static int STATE_NORMAL = 0; 22 | public final static int STATE_READY = 1; 23 | public final static int STATE_LOADING = 2; 24 | 25 | private Context mContext; 26 | 27 | private View mContentView; 28 | private View mProgressBar; 29 | private TextView mHintView; 30 | 31 | public XListViewFooter(Context context) { 32 | super(context); 33 | initView(context); 34 | } 35 | 36 | public XListViewFooter(Context context, AttributeSet attrs) { 37 | super(context, attrs); 38 | initView(context); 39 | } 40 | 41 | 42 | public void setState(int state) { 43 | mHintView.setVisibility(View.INVISIBLE); 44 | mProgressBar.setVisibility(View.INVISIBLE); 45 | mHintView.setVisibility(View.INVISIBLE); 46 | if (state == STATE_READY) { 47 | mHintView.setVisibility(View.VISIBLE); 48 | mHintView.setText(R.string.xlistview_footer_hint_ready); 49 | } else if (state == STATE_LOADING) { 50 | mProgressBar.setVisibility(View.VISIBLE); 51 | } else { 52 | mHintView.setVisibility(View.VISIBLE); 53 | mHintView.setText(R.string.xlistview_footer_hint_normal); 54 | } 55 | } 56 | 57 | public void setBottomMargin(int height) { 58 | if (height < 0) return ; 59 | LayoutParams lp = (LayoutParams)mContentView.getLayoutParams(); 60 | lp.bottomMargin = height; 61 | mContentView.setLayoutParams(lp); 62 | } 63 | 64 | public int getBottomMargin() { 65 | LayoutParams lp = (LayoutParams)mContentView.getLayoutParams(); 66 | return lp.bottomMargin; 67 | } 68 | 69 | 70 | /** 71 | * normal status 72 | */ 73 | public void normal() { 74 | mHintView.setVisibility(View.VISIBLE); 75 | mProgressBar.setVisibility(View.GONE); 76 | } 77 | 78 | 79 | /** 80 | * loading status 81 | */ 82 | public void loading() { 83 | mHintView.setVisibility(View.GONE); 84 | mProgressBar.setVisibility(View.VISIBLE); 85 | } 86 | 87 | /** 88 | * hide footer when disable pull load more 89 | */ 90 | public void hide() { 91 | LayoutParams lp = (LayoutParams)mContentView.getLayoutParams(); 92 | lp.height = 0; 93 | mContentView.setLayoutParams(lp); 94 | } 95 | 96 | /** 97 | * show footer 98 | */ 99 | public void show() { 100 | LayoutParams lp = (LayoutParams)mContentView.getLayoutParams(); 101 | lp.height = LayoutParams.WRAP_CONTENT; 102 | mContentView.setLayoutParams(lp); 103 | } 104 | 105 | private void initView(Context context) { 106 | mContext = context; 107 | LinearLayout moreView = (LinearLayout)LayoutInflater.from(mContext).inflate(R.layout.xlistview_footer, null); 108 | addView(moreView); 109 | moreView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 110 | 111 | mContentView = moreView.findViewById(R.id.xlistview_footer_content); 112 | mProgressBar = moreView.findViewById(R.id.xlistview_footer_progressbar); 113 | mHintView = (TextView)moreView.findViewById(R.id.xlistview_footer_hint_textview); 114 | } 115 | 116 | 117 | } 118 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Other/XListView/XListViewHeader.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @file XListViewHeader.java 3 | * @create Apr 18, 2012 5:22:27 PM 4 | * @author Maxwin 5 | * @description XListView's header 6 | */ 7 | package com.itgowo.sport.trace.tracedemo.Other.XListView; 8 | 9 | import android.content.Context; 10 | import android.util.AttributeSet; 11 | import android.view.Gravity; 12 | import android.view.LayoutInflater; 13 | import android.view.View; 14 | import android.view.animation.Animation; 15 | import android.view.animation.RotateAnimation; 16 | import android.widget.ImageView; 17 | import android.widget.LinearLayout; 18 | import android.widget.ProgressBar; 19 | import android.widget.TextView; 20 | 21 | import com.itgowo.sport.trace.tracedemo.R; 22 | 23 | 24 | public class XListViewHeader extends LinearLayout { 25 | private LinearLayout mContainer; 26 | private ImageView mArrowImageView; 27 | private ProgressBar mProgressBar; 28 | private TextView mHintTextView; 29 | private int mState = STATE_NORMAL; 30 | 31 | private Animation mRotateUpAnim; 32 | private Animation mRotateDownAnim; 33 | 34 | private final int ROTATE_ANIM_DURATION = 180; 35 | 36 | public final static int STATE_NORMAL = 0; 37 | public final static int STATE_READY = 1; 38 | public final static int STATE_REFRESHING = 2; 39 | 40 | public XListViewHeader(Context context) { 41 | super(context); 42 | initView(context); 43 | } 44 | 45 | /** 46 | * @param context 47 | * @param attrs 48 | */ 49 | public XListViewHeader(Context context, AttributeSet attrs) { 50 | super(context, attrs); 51 | initView(context); 52 | } 53 | 54 | private void initView(Context context) { 55 | // 初始情况,设置下拉刷新view高度为0 56 | LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, 0); 57 | mContainer = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.xlistview_header, null); 58 | addView(mContainer, lp); 59 | setGravity(Gravity.BOTTOM); 60 | 61 | mArrowImageView = (ImageView) findViewById(R.id.xlistview_header_arrow); 62 | mHintTextView = (TextView) findViewById(R.id.xlistview_header_hint_textview); 63 | mProgressBar = (ProgressBar) findViewById(R.id.xlistview_header_progressbar); 64 | 65 | mRotateUpAnim = new RotateAnimation(0.0f, -180.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 66 | mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION); 67 | mRotateUpAnim.setFillAfter(true); 68 | mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 69 | mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION); 70 | mRotateDownAnim.setFillAfter(true); 71 | } 72 | 73 | public void setState(int state) { 74 | if (state == mState) return; 75 | 76 | if (state == STATE_REFRESHING) { // 显示进度 77 | mArrowImageView.clearAnimation(); 78 | mArrowImageView.setVisibility(View.INVISIBLE); 79 | mProgressBar.setVisibility(View.VISIBLE); 80 | } else { // 显示箭头图片 81 | mArrowImageView.setVisibility(View.VISIBLE); 82 | mProgressBar.setVisibility(View.INVISIBLE); 83 | } 84 | 85 | switch (state) { 86 | case STATE_NORMAL: 87 | if (mState == STATE_READY) { 88 | mArrowImageView.startAnimation(mRotateDownAnim); 89 | } 90 | if (mState == STATE_REFRESHING) { 91 | mArrowImageView.clearAnimation(); 92 | } 93 | mHintTextView.setText(R.string.xlistview_header_hint_normal); 94 | break; 95 | case STATE_READY: 96 | if (mState != STATE_READY) { 97 | mArrowImageView.clearAnimation(); 98 | mArrowImageView.startAnimation(mRotateUpAnim); 99 | mHintTextView.setText(R.string.xlistview_header_hint_ready); 100 | } 101 | break; 102 | case STATE_REFRESHING: 103 | mHintTextView.setText(R.string.xlistview_header_hint_loading); 104 | break; 105 | default: 106 | } 107 | 108 | mState = state; 109 | } 110 | 111 | public void setVisiableHeight(int height) { 112 | if (height < 0) { 113 | height = 0; 114 | } 115 | LayoutParams lp = (LayoutParams) mContainer.getLayoutParams(); 116 | lp.height = height; 117 | mContainer.setLayoutParams(lp); 118 | } 119 | 120 | public int getVisiableHeight() { 121 | return mContainer.getLayoutParams().height; 122 | } 123 | 124 | } 125 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Other/app.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Other; 2 | 3 | import android.app.Application; 4 | import android.os.Build; 5 | 6 | import com.baidu.mapapi.SDKInitializer; 7 | 8 | import org.xutils.x; 9 | 10 | /** 11 | * Created by hnvfh on 2017/5/15. 12 | */ 13 | 14 | public class app extends Application { 15 | public static Application sApp; 16 | public static String sNickName= "晴空的一滴雨 itgowo.com"; 17 | @Override 18 | public void onCreate() { 19 | super.onCreate(); 20 | sApp=this; 21 | x.Ext.init(this); 22 | SDKInitializer.initialize(this); 23 | qktool.initTool(sApp); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Other/circleprogress/CircleProgress.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Other.circleprogress; 2 | 3 | import android.content.Context; 4 | import android.content.res.Resources; 5 | import android.content.res.TypedArray; 6 | import android.graphics.Canvas; 7 | import android.graphics.Color; 8 | import android.graphics.Paint; 9 | import android.graphics.RectF; 10 | import android.os.Bundle; 11 | import android.os.Parcelable; 12 | import android.text.TextPaint; 13 | import android.text.TextUtils; 14 | import android.util.AttributeSet; 15 | import android.view.View; 16 | 17 | import com.itgowo.sport.trace.tracedemo.R; 18 | 19 | 20 | /** 21 | * Created by bruce on 11/4/14. 22 | */ 23 | public class CircleProgress extends View { 24 | private Paint textPaint; 25 | private RectF rectF = new RectF(); 26 | 27 | private float textSize; 28 | private int textColor; 29 | private int progress = 0; 30 | private int max; 31 | private int finishedColor; 32 | private int unfinishedColor; 33 | private String prefixText = ""; 34 | private String suffixText = "%"; 35 | 36 | private final int default_finished_color = Color.rgb(66, 145, 241); 37 | private final int default_unfinished_color = Color.rgb(204, 204, 204); 38 | private final int default_text_color = Color.WHITE; 39 | private final int default_max = 100; 40 | private final float default_text_size; 41 | private final int min_size; 42 | 43 | private static final String INSTANCE_STATE = "saved_instance"; 44 | private static final String INSTANCE_TEXT_COLOR = "text_color"; 45 | private static final String INSTANCE_TEXT_SIZE = "text_size"; 46 | private static final String INSTANCE_FINISHED_STROKE_COLOR = "finished_stroke_color"; 47 | private static final String INSTANCE_UNFINISHED_STROKE_COLOR = "unfinished_stroke_color"; 48 | private static final String INSTANCE_MAX = "max"; 49 | private static final String INSTANCE_PROGRESS = "progress"; 50 | private static final String INSTANCE_SUFFIX = "suffix"; 51 | private static final String INSTANCE_PREFIX = "prefix"; 52 | 53 | private Paint paint = new Paint(); 54 | 55 | public CircleProgress(Context context) { 56 | this(context, null); 57 | } 58 | 59 | public CircleProgress(Context context, AttributeSet attrs) { 60 | this(context, attrs, 0); 61 | } 62 | 63 | public CircleProgress(Context context, AttributeSet attrs, int defStyleAttr) { 64 | super(context, attrs, defStyleAttr); 65 | 66 | default_text_size = sp2px(getResources(), 18); 67 | min_size = (int) dp2px(getResources(), 100); 68 | 69 | final TypedArray attributes = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CircleProgress, defStyleAttr, 0); 70 | initByAttributes(attributes); 71 | attributes.recycle(); 72 | 73 | initPainters(); 74 | } 75 | 76 | protected void initByAttributes(TypedArray attributes) { 77 | finishedColor = attributes.getColor(R.styleable.CircleProgress_circle_finished_color, default_finished_color); 78 | unfinishedColor = attributes.getColor(R.styleable.CircleProgress_circle_unfinished_color, default_unfinished_color); 79 | textColor = attributes.getColor(R.styleable.CircleProgress_circle_text_color, default_text_color); 80 | textSize = attributes.getDimension(R.styleable.CircleProgress_circle_text_size, default_text_size); 81 | 82 | setMax(attributes.getInt(R.styleable.CircleProgress_circle_max, default_max)); 83 | setProgress(attributes.getInt(R.styleable.CircleProgress_circle_progress, 0)); 84 | 85 | if (attributes.getString(R.styleable.CircleProgress_circle_prefix_text) != null) { 86 | setPrefixText(attributes.getString(R.styleable.CircleProgress_circle_prefix_text)); 87 | } 88 | if (attributes.getString(R.styleable.CircleProgress_circle_suffix_text) != null) { 89 | setSuffixText(attributes.getString(R.styleable.CircleProgress_circle_suffix_text)); 90 | } 91 | } 92 | 93 | protected void initPainters() { 94 | textPaint = new TextPaint(); 95 | textPaint.setColor(textColor); 96 | textPaint.setTextSize(textSize); 97 | textPaint.setAntiAlias(true); 98 | 99 | paint.setAntiAlias(true); 100 | } 101 | 102 | @Override 103 | public void invalidate() { 104 | initPainters(); 105 | super.invalidate(); 106 | } 107 | 108 | public int getProgress() { 109 | return progress; 110 | } 111 | 112 | public void setProgress(int progress) { 113 | this.progress = progress; 114 | if (this.progress > getMax()) { 115 | this.progress %= getMax(); 116 | } 117 | invalidate(); 118 | } 119 | 120 | public int getMax() { 121 | return max; 122 | } 123 | 124 | public void setMax(int max) { 125 | if (max > 0) { 126 | this.max = max; 127 | invalidate(); 128 | } 129 | } 130 | 131 | public float getTextSize() { 132 | return textSize; 133 | } 134 | 135 | public void setTextSize(float textSize) { 136 | this.textSize = textSize; 137 | this.invalidate(); 138 | } 139 | 140 | public int getTextColor() { 141 | return textColor; 142 | } 143 | 144 | public void setTextColor(int textColor) { 145 | this.textColor = textColor; 146 | this.invalidate(); 147 | } 148 | 149 | public int getFinishedColor() { 150 | return finishedColor; 151 | } 152 | 153 | public void setFinishedColor(int finishedColor) { 154 | this.finishedColor = finishedColor; 155 | this.invalidate(); 156 | } 157 | 158 | public int getUnfinishedColor() { 159 | return unfinishedColor; 160 | } 161 | 162 | public void setUnfinishedColor(int unfinishedColor) { 163 | this.unfinishedColor = unfinishedColor; 164 | this.invalidate(); 165 | } 166 | 167 | public String getPrefixText() { 168 | return prefixText; 169 | } 170 | 171 | public void setPrefixText(String prefixText) { 172 | this.prefixText = prefixText; 173 | this.invalidate(); 174 | } 175 | 176 | public String getSuffixText() { 177 | return suffixText; 178 | } 179 | 180 | public void setSuffixText(String suffixText) { 181 | this.suffixText = suffixText; 182 | this.invalidate(); 183 | } 184 | 185 | public String getDrawText() { 186 | return getPrefixText() + getProgress() + getSuffixText(); 187 | } 188 | 189 | @Override 190 | protected int getSuggestedMinimumHeight() { 191 | return min_size; 192 | } 193 | 194 | @Override 195 | protected int getSuggestedMinimumWidth() { 196 | return min_size; 197 | } 198 | 199 | public float getProgressPercentage() { 200 | return getProgress() / (float) getMax(); 201 | } 202 | 203 | @Override 204 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 205 | rectF.set(0, 0, MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)); 206 | setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); 207 | } 208 | 209 | @Override protected void onDraw(Canvas canvas) { 210 | float yHeight = getProgress() / (float) getMax() * getHeight(); 211 | float radius = getWidth() / 2f; 212 | float angle = (float) (Math.acos((radius - yHeight) / radius) * 180 / Math.PI); 213 | float startAngle = 90 + angle; 214 | float sweepAngle = 360 - angle * 2; 215 | paint.setColor(getUnfinishedColor()); 216 | canvas.drawArc(rectF, startAngle, sweepAngle, false, paint); 217 | 218 | canvas.save(); 219 | canvas.rotate(180, getWidth() / 2, getHeight() / 2); 220 | paint.setColor(getFinishedColor()); 221 | canvas.drawArc(rectF, 270 - angle, angle * 2, false, paint); 222 | canvas.restore(); 223 | 224 | // Also works. 225 | // paint.setColor(getFinishedColor()); 226 | // canvas.drawArc(rectF, 90 - angle, angle * 2, false, paint); 227 | 228 | String text = getDrawText(); 229 | if (!TextUtils.isEmpty(text)) { 230 | float textHeight = textPaint.descent() + textPaint.ascent(); 231 | canvas.drawText(text, (getWidth() - textPaint.measureText(text)) / 2.0f, (getWidth() - textHeight) / 2.0f, textPaint); 232 | } 233 | } 234 | 235 | @Override 236 | protected Parcelable onSaveInstanceState() { 237 | final Bundle bundle = new Bundle(); 238 | bundle.putParcelable(INSTANCE_STATE, super.onSaveInstanceState()); 239 | bundle.putInt(INSTANCE_TEXT_COLOR, getTextColor()); 240 | bundle.putFloat(INSTANCE_TEXT_SIZE, getTextSize()); 241 | bundle.putInt(INSTANCE_FINISHED_STROKE_COLOR, getFinishedColor()); 242 | bundle.putInt(INSTANCE_UNFINISHED_STROKE_COLOR, getUnfinishedColor()); 243 | bundle.putInt(INSTANCE_MAX, getMax()); 244 | bundle.putInt(INSTANCE_PROGRESS, getProgress()); 245 | bundle.putString(INSTANCE_SUFFIX, getSuffixText()); 246 | bundle.putString(INSTANCE_PREFIX, getPrefixText()); 247 | return bundle; 248 | } 249 | 250 | @Override 251 | protected void onRestoreInstanceState(Parcelable state) { 252 | if(state instanceof Bundle) { 253 | final Bundle bundle = (Bundle) state; 254 | textColor = bundle.getInt(INSTANCE_TEXT_COLOR); 255 | textSize = bundle.getFloat(INSTANCE_TEXT_SIZE); 256 | finishedColor = bundle.getInt(INSTANCE_FINISHED_STROKE_COLOR); 257 | unfinishedColor = bundle.getInt(INSTANCE_UNFINISHED_STROKE_COLOR); 258 | initPainters(); 259 | setMax(bundle.getInt(INSTANCE_MAX)); 260 | setProgress(bundle.getInt(INSTANCE_PROGRESS)); 261 | prefixText = bundle.getString(INSTANCE_PREFIX); 262 | suffixText = bundle.getString(INSTANCE_SUFFIX); 263 | super.onRestoreInstanceState(bundle.getParcelable(INSTANCE_STATE)); 264 | return; 265 | } 266 | super.onRestoreInstanceState(state); 267 | } 268 | public float dp2px(Resources resources, float dp) { 269 | final float scale = resources.getDisplayMetrics().density; 270 | return dp * scale + 0.5f; 271 | } 272 | 273 | public float sp2px(Resources resources, float sp){ 274 | final float scale = resources.getDisplayMetrics().scaledDensity; 275 | return sp * scale; 276 | } 277 | } 278 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Other/onNetCallbackIListener.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Other; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * Created by lujianchao on 2016/10/27. 7 | */ 8 | 9 | public interface onNetCallbackIListener { 10 | /** 11 | * 返回网络请求数据 12 | * 13 | * @param requestStr 请求发出数据 14 | * @param result 请求结果 15 | */ 16 | public void onSuccess(String requestStr, String result); 17 | 18 | public void onSuccess(String result); 19 | 20 | public void onError(Throwable throwable); 21 | 22 | public void onFinished(); 23 | 24 | public void onCancelled(); 25 | public void onSuccess(File mFile); 26 | } 27 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Other/onNetCallbackListener.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Other; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * Created by lujianchao on 2016/11/2. 7 | */ 8 | 9 | public abstract class onNetCallbackListener implements onNetCallbackIListener { 10 | @Override 11 | public void onCancelled () { 12 | } 13 | 14 | @Override 15 | public void onError (final Throwable throwable) { 16 | throwable.printStackTrace (); 17 | } 18 | 19 | @Override 20 | public void onFinished () { 21 | 22 | } 23 | 24 | @Override 25 | public void onSuccess (final String result) { 26 | 27 | } 28 | 29 | @Override 30 | public void onSuccess (final File mFile) { 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Trace/Entity/EntityRecord.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Trace.Entity; 2 | 3 | 4 | public class EntityRecord { 5 | private int id; 6 | private double mileage; // 里程 7 | private long finishTime; // 用时 8 | private double avgSpeed; // 平均速度 9 | private double altitude; // 爬升 10 | private long startTime; // 开始时间 11 | private long endTime; // 结束时间 12 | private int pace; // 配速 13 | private int itemType; // 类型 1 跑步 2 骑行 14 | private String records; // 记录 15 | 16 | public int getId() { 17 | return id; 18 | } 19 | 20 | public EntityRecord setId(int mId) { 21 | id = mId; 22 | return this; 23 | } 24 | 25 | public double getMileage() { 26 | return mileage; 27 | } 28 | 29 | public EntityRecord setMileage(double mMileage) { 30 | mileage = mMileage; 31 | return this; 32 | } 33 | 34 | public long getFinishTime() { 35 | return finishTime; 36 | } 37 | 38 | public EntityRecord setFinishTime(long mFinishTime) { 39 | finishTime = mFinishTime; 40 | return this; 41 | } 42 | 43 | public double getAvgSpeed() { 44 | return avgSpeed; 45 | } 46 | 47 | public EntityRecord setAvgSpeed(double mAvgSpeed) { 48 | avgSpeed = mAvgSpeed; 49 | return this; 50 | } 51 | 52 | public double getAltitude() { 53 | return altitude; 54 | } 55 | 56 | public EntityRecord setAltitude(double mAltitude) { 57 | altitude = mAltitude; 58 | return this; 59 | } 60 | 61 | public long getStartTime() { 62 | return startTime; 63 | } 64 | 65 | public EntityRecord setStartTime(long mStartTime) { 66 | startTime = mStartTime; 67 | return this; 68 | } 69 | 70 | public long getEndTime() { 71 | return endTime; 72 | } 73 | 74 | public EntityRecord setEndTime(long mEndTime) { 75 | endTime = mEndTime; 76 | return this; 77 | } 78 | 79 | public int getPace() { 80 | return pace; 81 | } 82 | 83 | public EntityRecord setPace(int mPace) { 84 | pace = mPace; 85 | return this; 86 | } 87 | 88 | public int getItemType() { 89 | return itemType; 90 | } 91 | 92 | public EntityRecord setItemType(int mItemType) { 93 | itemType = mItemType; 94 | return this; 95 | } 96 | 97 | public String getRecords() { 98 | return records; 99 | } 100 | 101 | public EntityRecord setRecords(String mRecords) { 102 | records = mRecords; 103 | return this; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Trace/Entity/Entity_GetRunRecord.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Trace.Entity; 2 | 3 | 4 | import com.itgowo.sport.trace.tracedemo.Other.Response; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * Created by lujianchao on 2017/2/10. 10 | * 11 | * @author lujianchao 12 | */ 13 | 14 | public class Entity_GetRunRecord extends Response { 15 | private EntityRecord data; 16 | 17 | public EntityRecord getData() { 18 | return data; 19 | } 20 | 21 | public void setData(EntityRecord data) { 22 | this.data = data; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Trace/Entity/Entity_GetRunRecordList.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Trace.Entity; 2 | 3 | import com.itgowo.sport.trace.tracedemo.Other.Response; 4 | 5 | import java.util.List; 6 | 7 | 8 | /** 9 | * Created by lujianchao on 2017/2/8. 10 | * 11 | * @author lujianchao 12 | */ 13 | 14 | public class Entity_GetRunRecordList extends Response { 15 | 16 | private List data; 17 | 18 | public List getData() { 19 | return data; 20 | } 21 | 22 | public void setData(List data) { 23 | this.data = data; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Trace/Entity/Entity_TotalInfo.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Trace.Entity; 2 | 3 | import com.itgowo.sport.trace.tracedemo.Other.Response; 4 | 5 | /** 6 | * Created by hnvfh on 2017/5/16. 7 | */ 8 | public class Entity_TotalInfo extends Response { 9 | private TotalInfo mData; 10 | 11 | @Override 12 | public TotalInfo getData() { 13 | return mData; 14 | } 15 | 16 | public Entity_TotalInfo setData(TotalInfo mData) { 17 | this.mData = mData; 18 | return this; 19 | } 20 | 21 | public static class TotalInfo { 22 | private double totalmileage; // 里程 23 | private long totalTime; // 用时 24 | private int type; // 类型 25 | 26 | public int getType() { 27 | return type; 28 | } 29 | 30 | public TotalInfo setType(int mType) { 31 | type = mType; 32 | return this; 33 | } 34 | public double getTotalmileage() { 35 | return totalmileage; 36 | } 37 | 38 | public TotalInfo setTotalmileage(double mTotalmileage) { 39 | totalmileage = mTotalmileage; 40 | return this; 41 | } 42 | 43 | public long getTotalTime() { 44 | return totalTime; 45 | } 46 | 47 | public TotalInfo setTotalTime(long mTotalTime) { 48 | totalTime = mTotalTime; 49 | return this; 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Trace/Entity/Entity_UploadResponse.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Trace.Entity; 2 | 3 | import com.itgowo.sport.trace.tracedemo.Other.Response; 4 | 5 | /** 6 | * Created by hnvfh on 2017/5/16. 7 | */ 8 | 9 | public class Entity_UploadResponse extends Response { 10 | private EntityRecord mData; 11 | 12 | @Override 13 | public EntityRecord getData() { 14 | return mData; 15 | } 16 | 17 | public Entity_UploadResponse setData(EntityRecord mData) { 18 | this.mData = mData; 19 | return this; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Trace/Entity/LocationInfo.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Trace.Entity; 2 | 3 | /** 4 | * Created by lujianchao on 2017/1/8. 5 | * 6 | * @author lujianchao 7 | */ 8 | 9 | public class LocationInfo { 10 | 11 | private double latitude; 12 | private double longitude; 13 | private int status;//1 正常轨迹 2.暂停状态轨迹 14 | 15 | public double getLatitude () { 16 | return latitude; 17 | } 18 | 19 | public LocationInfo setLatitude (final double mLatitude) { 20 | latitude = mLatitude; 21 | return this; 22 | } 23 | 24 | public double getLongitude () { 25 | return longitude; 26 | } 27 | 28 | public LocationInfo setLongitude (final double mLongitude) { 29 | longitude = mLongitude; 30 | return this; 31 | } 32 | 33 | public int getStatus () { 34 | return status; 35 | } 36 | 37 | public LocationInfo setStatus (final int mStatus) { 38 | status = mStatus; 39 | return this; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Trace/Entity/RequestTrace.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Trace.Entity; 2 | 3 | /** 4 | * Created by hnvfh on 2017/5/15. 5 | */ 6 | public class RequestTrace { 7 | public static final int RequestNo = 0, RequestDetails = 1, RequestList = 2, RequestUpload = 3, RequestInfo = 4,RequestDel=5; 8 | private int requestType = 0; //0;不请求数据 1:根据id获取详情(id) 2:获取轨迹列表(pageindex,pagesize) 3:上传轨迹 4:获取统计信息 关联运动类型,用id传 9 | private int id; 10 | private int pageindex = 1; 11 | private int pagesize = 20; 12 | private Object entity; 13 | 14 | public int getRequestType() { 15 | return requestType; 16 | } 17 | 18 | public RequestTrace setRequestType(int mRequestType) { 19 | requestType = mRequestType; 20 | return this; 21 | } 22 | 23 | public int getId() { 24 | return id; 25 | } 26 | 27 | public RequestTrace setId(int mId) { 28 | id = mId; 29 | return this; 30 | } 31 | 32 | public int getPageindex() { 33 | return pageindex; 34 | } 35 | 36 | public RequestTrace setPageindex(int mPageindex) { 37 | pageindex = mPageindex; 38 | return this; 39 | } 40 | 41 | public int getPagesize() { 42 | return pagesize; 43 | } 44 | 45 | public RequestTrace setPagesize(int mPagesize) { 46 | pagesize = mPagesize; 47 | return this; 48 | } 49 | 50 | public Object getEntity() { 51 | return entity; 52 | } 53 | 54 | public RequestTrace setEntity(Object mEntity) { 55 | entity = mEntity; 56 | return this; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Trace/TraceManager.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Trace; 2 | 3 | 4 | import com.itgowo.sport.trace.tracedemo.Other.QKManager; 5 | import com.itgowo.sport.trace.tracedemo.Other.onNetCallbackListener; 6 | import com.itgowo.sport.trace.tracedemo.Trace.Entity.RequestTrace; 7 | 8 | /** 9 | * Created by lujianchao on 2017/1/4. 10 | * 11 | * @author lujianchao 12 | */ 13 | 14 | public class TraceManager { 15 | public static String ROOT_URL = "http://itgowo.com:8081/TraceServer/Trace"; // 用户轨迹操作 16 | // public static String ROOT_URL = "http://1.1.1.156:8080/Trace"; // 用户轨迹操作 17 | /** 18 | * 获取轨迹详情 19 | * 20 | * @param runRecordId 21 | * @param mListener 22 | */ 23 | public static void GetRunRecord (int runRecordId, onNetCallbackListener mListener) { 24 | RequestTrace mRequestALL = new RequestTrace ().setId (runRecordId).setRequestType(RequestTrace.RequestDetails) ; 25 | QKManager.http_post (ROOT_URL, "", mRequestALL, mListener); 26 | 27 | } 28 | 29 | 30 | 31 | /** 32 | * 获取运动轨迹记录列表 33 | * 34 | * @param itemType 运动类型 1:跑步 2:骑行 35 | * @param mListener 36 | */ 37 | public static void GetRunRecordList (int itemType, int index,int size, onNetCallbackListener mListener) { 38 | RequestTrace request = new RequestTrace ().setId (itemType).setPageindex (index).setPagesize(size).setRequestType(RequestTrace.RequestList); 39 | QKManager.http_post (ROOT_URL, "", request, mListener); 40 | } 41 | /** 42 | * 删除运动轨迹记录 43 | * 44 | * @param mListener 45 | */ 46 | public static void delRecord(int id, onNetCallbackListener mListener) { 47 | RequestTrace request = new RequestTrace ().setId (id).setRequestType(RequestTrace.RequestDel); 48 | QKManager.http_post (ROOT_URL, "", request, mListener); 49 | } 50 | /** 51 | * 获取运动总信息,首页信息 52 | * 53 | * @param itemType 54 | * @param mListener 55 | */ 56 | public static void GetRunRecordIndexPage (int itemType, onNetCallbackListener mListener) { 57 | RequestTrace request = new RequestTrace().setRequestType (RequestTrace.RequestInfo).setId(itemType); 58 | QKManager.http_post (ROOT_URL, "", request, mListener); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Trace/TraceRecordActivity.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Trace; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.AdapterView; 9 | import android.widget.BaseAdapter; 10 | import android.widget.ImageView; 11 | import android.widget.TextView; 12 | 13 | import com.alibaba.fastjson.JSON; 14 | import com.itgowo.sport.trace.tracedemo.Other.BaseActivity; 15 | import com.itgowo.sport.trace.tracedemo.Other.QKManager; 16 | import com.itgowo.sport.trace.tracedemo.Other.Response; 17 | import com.itgowo.sport.trace.tracedemo.Other.TitleBarView; 18 | import com.itgowo.sport.trace.tracedemo.Other.XListView.XListView; 19 | import com.itgowo.sport.trace.tracedemo.Other.app; 20 | import com.itgowo.sport.trace.tracedemo.Other.onNetCallbackListener; 21 | import com.itgowo.sport.trace.tracedemo.Other.qktool; 22 | import com.itgowo.sport.trace.tracedemo.R; 23 | import com.itgowo.sport.trace.tracedemo.Trace.Entity.EntityRecord; 24 | import com.itgowo.sport.trace.tracedemo.Trace.Entity.Entity_GetRunRecordList; 25 | 26 | import java.text.DecimalFormat; 27 | import java.util.Date; 28 | import java.util.TimeZone; 29 | 30 | 31 | public class TraceRecordActivity extends BaseActivity { 32 | /** 33 | * 从开始运动界面跳过来不允许再跳回,右上角图标消失隐藏 34 | */ 35 | public static final String IsCanJump = "IsCanJump"; 36 | public static final String SportItemType = "sportItemType"; 37 | /** 38 | * 1:跑步 2:骑行 39 | */ 40 | private int mSportType = 1; 41 | private XListView mXListView; 42 | private Entity_GetRunRecordList mRecordList; 43 | private RecordAdapter mRecordAdapter; 44 | private int pageindex = 0, pagesize = 10; 45 | 46 | @Override 47 | protected void onCreate(Bundle savedInstanceState) { 48 | super.onCreate(savedInstanceState); 49 | setContentView(R.layout.activity_trace_record); 50 | mSportType = getIntent().getIntExtra(SportItemType, 1); 51 | mXListView = (XListView) findViewById(R.id.listView); 52 | mRecordAdapter = new RecordAdapter(); 53 | mXListView.setXListViewListener(new XListView.IXListViewListener() { 54 | @Override 55 | public void onRefresh() { 56 | loadData(true); 57 | } 58 | 59 | @Override 60 | public void onLoadMore() { 61 | loadData(false); 62 | 63 | } 64 | }); 65 | mXListView.setAdapter(mRecordAdapter); 66 | 67 | loadData(true); 68 | } 69 | 70 | public static void StartActivity(Context mContext, boolean mIsCanJump, int mSportType) { 71 | Intent intent = new Intent(mContext, TraceRecordActivity.class); 72 | intent.putExtra(SportItemType, mSportType); 73 | intent.putExtra(IsCanJump, mIsCanJump); 74 | mContext.startActivity(intent); 75 | } 76 | 77 | private void loadData(final boolean isRefresh) { 78 | mXListView.setPullLoadEnable(false); 79 | mXListView.setPullRefreshEnable(false); 80 | if (isRefresh) { 81 | pageindex = 0; 82 | } 83 | TraceManager.GetRunRecordList(mSportType, isRefresh ? 0 : pageindex, pagesize, new onNetCallbackListener() { 84 | @Override 85 | public void onError(final Throwable throwable) { 86 | super.onError(throwable); 87 | mXListView.stopLoadMore(); 88 | mXListView.stopRefresh(); 89 | mXListView.ReFreshNodateStatus(null, true); 90 | mXListView.setPullRefreshEnable(true); 91 | } 92 | 93 | @Override 94 | public void onSuccess(final String requestStr, final String result) { 95 | Entity_GetRunRecordList mRecordList1 = JSON.parseObject(result, Entity_GetRunRecordList.class); 96 | mXListView.stopLoadMore(); 97 | mXListView.stopRefresh(); 98 | if (mRecordList1.getCode() == 200) { 99 | if (mRecordList1.getData() != null && mRecordList1.getData().size() > 0) { 100 | if (isRefresh) { 101 | mRecordList = mRecordList1; 102 | pageindex += pagesize; 103 | } else { 104 | pageindex += pagesize; 105 | mRecordList.getData().addAll(mRecordList1.getData()); 106 | } 107 | String lastdata = ""; 108 | int index = 0; 109 | while (index < mRecordList.getData().size()) { 110 | if (mRecordList.getData().get(index).getId() == 0) { 111 | lastdata = qktool.time_getTimeYMD(mRecordList.getData().get(index).getEndTime()); 112 | } else { 113 | if (!lastdata .equalsIgnoreCase(qktool.time_getTimeYMD(mRecordList.getData().get(index).getEndTime()))) { 114 | lastdata = qktool.time_getTimeYMD(mRecordList.getData().get(index).getEndTime()); 115 | mRecordList.getData().add(index, new EntityRecord().setEndTime(mRecordList.getData().get(index).getEndTime())); 116 | index++; 117 | } 118 | } 119 | index++; 120 | } 121 | mXListView.setPullLoadEnable(true); 122 | mXListView.setPullRefreshEnable(true); 123 | mRecordAdapter.notifyDataSetChanged(); 124 | } else { 125 | mXListView.setPullLoadEnable(false); 126 | mXListView.setPullRefreshEnable(true); 127 | } 128 | } else { 129 | qktool.ToastShout(mRecordList1.getMsg()); 130 | } 131 | mXListView.ReFreshNodateStatus(null, true); 132 | } 133 | }); 134 | } 135 | 136 | @Override 137 | protected void initTitleBarData(final TitleBarView mTitleBarView) { 138 | mTitleBarView.setTitle("运动记录(" + (getIntent().getIntExtra(SportItemType, 1) == 1 ? "跑步)" : "骑行)")); 139 | mTitleBarView.setDrawableLeft(R.drawable.fanhui, TitleBarView.TitleBarChildView.LEFT); 140 | if (getIntent().getBooleanExtra(IsCanJump, true)) { 141 | mTitleBarView.setDrawableLeft(R.drawable.paobuico, TitleBarView.TitleBarChildView.RIGHT); 142 | } else { 143 | mTitleBarView.getTitlebarRightbt().setEnabled(false); 144 | } 145 | mTitleBarView.setonTitlebarListener(new TitleBarView.onTitleBarListener() { 146 | @Override 147 | public void onTitleBarLeftOnClick(final View mView) { 148 | finish(); 149 | } 150 | 151 | @Override 152 | public void onTitleBarRightOnClick(final View mView) { 153 | TraceMainActivity.StartActivity(mContext); 154 | } 155 | 156 | @Override 157 | public void onTitleBarTitleOnClick(final View mView) { 158 | 159 | } 160 | }); 161 | } 162 | 163 | public class RecordAdapter extends BaseAdapter { 164 | 165 | @Override 166 | public int getCount() { 167 | return mRecordList == null || mRecordList.getData() == null ? 0 : mRecordList.getData().size(); 168 | } 169 | 170 | @Override 171 | public Object getItem(final int position) { 172 | return null; 173 | } 174 | 175 | @Override 176 | public int getViewTypeCount() { 177 | return 3; 178 | } 179 | 180 | @Override 181 | public int getItemViewType(final int position) { 182 | return mRecordList.getData().get(position).getId() == 0 ? 2 : 1; 183 | } 184 | 185 | @Override 186 | public long getItemId(final int position) { 187 | return 0; 188 | } 189 | 190 | @Override 191 | public View getView(final int position, View convertView, final ViewGroup parent) { 192 | if (getItemViewType(position) == 2) { 193 | TextView mTextView = (TextView) View.inflate(mContext, R.layout.listview_itemtypetitle, null); 194 | mTextView.setText(qktool.time_getTimeYMD(mRecordList.getData().get(position).getEndTime())); 195 | return mTextView; 196 | } else { 197 | if (convertView == null) { 198 | convertView = View.inflate(mContext, R.layout.tracerecordlistitem, null); 199 | convertView.setTag(new ViewHolder(convertView)); 200 | convertView.setOnClickListener(new View.OnClickListener() { 201 | @Override 202 | public void onClick(final View v) { 203 | TraceEndActivity.StartActivity(mContext, mRecordList.getData().get(position).getId(), app.sNickName, true); 204 | } 205 | }); 206 | convertView.setOnLongClickListener(new View.OnLongClickListener() { 207 | @Override 208 | public boolean onLongClick(final View v) { 209 | QKManager.ShowDialog_Normal(mContext, "是否删除本次记录?", new QKManager.onDialogListener() { 210 | @Override 211 | public void onPositive() { 212 | TraceManager.delRecord(mRecordList.getData().get(position).getId(), new onNetCallbackListener() { 213 | @Override 214 | public void onSuccess(String requestStr, String result) { 215 | Response mResponse=JSON.parseObject(result,Response.class); 216 | if (mResponse.getCode()==200){ 217 | qktool.ToastShout("记录删除成功"); 218 | mRecordList.getData().remove(position); 219 | mRecordAdapter.notifyDataSetChanged(); 220 | }else { 221 | qktool.ToastShout(mResponse.getMsg()); 222 | } 223 | } 224 | }); 225 | } 226 | 227 | @Override 228 | public void onNegative() { 229 | qktool.ToastShout("没做处理,onNegative"); 230 | } 231 | }); 232 | return false; 233 | } 234 | }); 235 | } 236 | ViewHolder mViewHolder = (ViewHolder) convertView.getTag(); 237 | EntityRecord mBean = mRecordList.getData().get(position); 238 | if (mBean.getItemType() == 1) { 239 | mViewHolder.type.setImageResource(R.drawable.tracetype_run); 240 | } else { 241 | mViewHolder.type.setImageResource(R.drawable.tracetype_bike); 242 | } 243 | DecimalFormat formatVal = new DecimalFormat("##.##"); 244 | mViewHolder.length.setText(formatVal.format(mBean.getMileage() / 1000) + " KM"); 245 | mViewHolder.time.setText(qktool.time_getTimeHms(new Date(mBean.getFinishTime() * 1000 - TimeZone.getDefault().getRawOffset()).getTime())); 246 | int peisu = mBean.getPace(); 247 | mViewHolder.peisu.setText((peisu / 60 < 10 ? "0" : "") + peisu / 60 + ":" + (peisu % 60 < 10 ? "0" : "") + peisu % 60); 248 | 249 | } 250 | return convertView; 251 | } 252 | 253 | public class ViewHolder { 254 | private ImageView type; 255 | private TextView length, time, peisu; 256 | 257 | public ViewHolder(View mView) { 258 | type = (ImageView) mView.findViewById(R.id.type); 259 | length = (TextView) mView.findViewById(R.id.length); 260 | time = (TextView) mView.findViewById(R.id.time); 261 | peisu = (TextView) mView.findViewById(R.id.peisu); 262 | } 263 | } 264 | } 265 | } 266 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/java/com/itgowo/sport/trace/tracedemo/Trace/WalkShareTop.java: -------------------------------------------------------------------------------- 1 | package com.itgowo.sport.trace.tracedemo.Trace; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.View; 6 | import android.widget.ImageView; 7 | import android.widget.RelativeLayout; 8 | import android.widget.TextView; 9 | 10 | import com.itgowo.sport.trace.tracedemo.R; 11 | 12 | 13 | /** 14 | * Created by lujianchao on 2016/12/26. 15 | * 16 | * @author lujianchao 17 | */ 18 | 19 | public class WalkShareTop extends RelativeLayout { 20 | public TextView sharelength, sharename; 21 | public ImageView sharehead; 22 | 23 | public WalkShareTop(final Context context, final AttributeSet attrs) { 24 | super (context, attrs); 25 | View.inflate (context, R.layout.walksharetopview, this); 26 | initView (); 27 | } 28 | 29 | private void initView () { 30 | sharelength = (TextView) findViewById (R.id.sharelength); 31 | sharename = (TextView) findViewById (R.id.sharename); 32 | sharehead = (ImageView) findViewById (R.id.sharehead); 33 | } 34 | 35 | public WalkShareTop(final Context context) { 36 | super (context); 37 | View.inflate (context, R.layout.walksharetopview, this); 38 | initView (); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/gps_signal_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/gps_signal_0.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/gps_signal_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/gps_signal_1.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/gps_signal_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/gps_signal_2.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/gps_signal_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/gps_signal_3.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/icon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/icon2.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/list.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/lock1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/lock1.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/logo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/logo1.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/map_icon_end.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/map_icon_end.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/paobuico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/paobuico.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/ranking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/ranking.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/tance_icon_end.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/tance_icon_end.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/tance_icon_start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/tance_icon_start.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/trace_history.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/trace_history.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/trace_time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/trace_time.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/tracetype_bike.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/tracetype_bike.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/tracetype_run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/tracetype_run.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/trance_bike.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/trance_bike.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/trance_bike2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/trance_bike2.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/trance_run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/trance_run.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/trance_run2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/trance_run2.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xhdpi/xlistview_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xhdpi/xlistview_arrow.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable-xxhdpi/fanhui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgowo/TraceDemo/63c6e4a6e021d442c32c9306aa1e7ba88456af18/TraceDemo/app/src/main/res/drawable-xxhdpi/fanhui.png -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable/backgrounp_gray1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable/backgrounp_orange.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable/circle_deepblue.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 11 | 12 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable/circle_gray.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 11 | 12 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable/circle_orange.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 11 | 12 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/drawable/circlerect_gray.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /TraceDemo/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 19 | 20 | 27 | 28 | 35 | 36 |