logo资料库

不错的Android计步器开发小实例.pdf

第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
资料共14页,剩余部分请下载后查看
登录 | 注册 个人资料 学院APP首次下载,可得50C币!     有奖试读—增长黑客,创业公司必知的“黑科技”     当讲师?爱学习?投票攒课吧     CSDN 2015博客之星评选 感恩分享 目录视图 摘要视图 订阅  Android 计步器开发 分类:   Android(26)  2014­11­23 15:56   10291人阅读   评论(63)   收藏   举报 版权声明:本文为博主原创文章,未经博主允许不得转载。 github 地址:https://github.com/zhouguangfu09/StepCounter 1.    程序图标 2.    点击图标,进入如下界面: 爱折腾的猫   访问: 260185次 积分: 3864 等级:  排名: 第4405名 原创: 译文: 111篇 1篇 转载: 评论: 10篇 108条 文章搜索 文章分类 (5) (62) (60) (1) (27) (4) Machine Learing LeetCode C/C++ MAC OS Linux (3) Android Python Image Processing Matlab (1) QT C# (2) Pattern Recognition Windows job (2) Thought Open Source Software (1) (1) (1) (2) (1) (1) 文章存档 2015年11月 2015年09月 2015年08月 2015年07月 2015年06月 (1) (2) (32) (3) (5) 2015/12/14Android 计步器开发 ­ ­ 博客频道 ­ CSDN.NEThttp://blog.csdn.net/guang09080908/article/details/414116791/14
展开 阅读排行 Android 计步器开发 Search Insert Position (10251) (8620) MTK平台手机串号(IMEI)修改 (6620) 解决 repo sync error: Exited sync due to fetch errors (6564) Sqrt(x) (6075) 手机屏幕实时在PC端显示 (5568) Reverse Bits 手机的音频口通信 Single Number ACM刷题网站 (5367) (5217) (5076) (5026) 评论排行 Android 计步器开发 手机屏幕实时在PC端显示 (63) (15) 开源QT写的串口调试上位机(带波形显示) (10) android图片橡皮擦功能和快速染色 (6) Android日程管理软件开发 如何使用红杏的公益代理 (6) (2) Errors running builder 'Android Resource Manager' on Project java.lang.NullPointerException 解决方法 (1) 机器学习中贝叶斯判决、概率分布、样本等概念间的关系 (1) Ugly Number II(求第N个丑数) (1) 基于PID调节的两轮自平衡小车的循迹控制 (1) 这个界面会有缓冲效果,然后进入程序的主界面. 3.程序主界面: 点击开始按钮,并甩动胳膊,计步器开始计数,也可以暂停计数,如下图所示: 推荐文章 *Hadoop节点"慢磁盘"监控 *假如你想成为全栈工程师… *没有躲过的坑­­正则表达式截取 字符串 *CardView完全解析与 RecyclerView结合使用(三十二) *And roid 高仿微信发朋友圈浏览 图片效果 *通过Ajax的方式执行GP服务 最新评论 Android 计步器开发 wang_3daix: 有兴趣学习,能否 也发一份完整的源码?谢谢! 1308653050@qq,com Android 计步器开发 qq_28825303: 您好,可以给我 一份源码吗,github上打不开, 多谢啦,邮箱是 1249566126@qq.com Android 计步器开发 qq_33258551: 楼主,可否发一 份完整的源码, 335967503@qq.com最近正在研 究这个计步器,找了好多地方, 终... Android 计步器开发 qq_33258551: 楼主,可否发一 份完整的源码, 335967503@qq.com最近正在研 究这个计步器,找了好多地方, 终... Android 计步器开发 qq_33258551: 楼主,可否发一 份完整的源码, 335967503@qq.com最近正在研 究这个计步器,找了好多地方, 终... Android 计步器开发 qq_33258551: 楼主,可否发一 2015/12/14Android 计步器开发 ­ ­ 博客频道 ­ CSDN.NEThttp://blog.csdn.net/guang09080908/article/details/414116792/14
份完整的源码, 335967503@qq.com最近正在研 究这个计步器,找了好多地方, 终... Android 计步器开发 qq_33258551: 楼主,可否发一 份完整的源码, 335967503@qq.com最近正在研 究这个计步器,找了好多地方, 终... Ugly Number II(求第N个丑数) unpisces: (1) 1×2, 2×2, 3×2, 4×2, 5×2,6×2,8×2,…(2) 1×3, 2×3,... Android 计步器开发 cnhzjh: 博主 发现github上的和你 做的不一样,可以给份源码吗? 谢谢199365304@qq.com Android日程管理软件开发 qq_19940477: 求源码分享学习 学习,502306294@qq.com 5.每走150步,系统奖励一个星星,最高10颗星星。同时软件会粗略的计算行程、热量、速度等参数。如上图所 示。 2015/12/14Android 计步器开发 ­ ­ 博客频道 ­ CSDN.NEThttp://blog.csdn.net/guang09080908/article/details/414116793/14
6.点击手机菜单键,点击“设置”选项,进入如下界面: 2015/12/14Android 计步器开发 ­ ­ 博客频道 ­ CSDN.NEThttp://blog.csdn.net/guang09080908/article/details/414116794/14
软件记步数的精准度跟用户的补偿以及体重有关,也跟用户设置的传感器的灵敏度有关系,在设置页面可以对相 应的参数进行调节。一旦调节结束,可以重新开始。 7.在手机的主界面按返回键,退出程序。   源码部分解析: 源码主要包含UI控制逻辑代码以及胳膊甩动检测步数代码,下面重点说一下 步数检测代码,主要集中在 StepDector.java文件中: [java]  01.  02.  03.  04.  05.  06.  07.  08.  09.  10.  11.  12.  13.  14.  15.  16.  17.  18.  19.  20.  21.  public void onSensorChanged(SensorEventevent) {          // Log.i(Constant.STEP_SERVER, "StepDetector");          Sensor sensor = event.sensor;          // Log.i(Constant.STEP_DETECTOR,"onSensorChanged");          synchronized (this) {                 if (sensor.getType() ==Sensor.TYPE_ORIENTATION) {                 } else {                        int j =(sensor.getType() == Sensor.TYPE_ACCELEROMETER) ? 1 : 0;                        if (j == 1) {                               float vSum =0;                               for (int i =0; i < 3; i++) {                                      finalfloat v = mYOffset + event.values[i] * mScale[j];                                      vSum+= v;                               }                               int k = 0;                               float v =vSum / 3;                                  floatdirection = (v > mLastValues[k] ? 1: (v < mLastValues[k] ? ‐                             if (direction== ‐mLastDirections[k]) {                                      //Direction changed                                      intextType = (direction > 0 ? 0 : 1); // minumum or   2015/12/14Android 计步器开发 ­ ­ 博客频道 ­ CSDN.NEThttp://blog.csdn.net/guang09080908/article/details/414116795/14
22.  23.  24.  25.  26.  27.  28.  29.  30.  31.  32.  33.  34.  35.  36.  37.  38.  39.  40.  41.  42.  43.  44.  45.  46.  47.  48.  49.  50.                                     //maximum?                                      mLastExtremes[extType][k]= mLastValues[k];                                      floatdiff = Math.abs(mLastExtremes[extType] [k]‐ mLastExtremes[1 ‐ extType][k]);                                         if(diff > SENSITIVITY) {                                             booleanisAlmostAsLargeAsPrevious = diff > (mLastDiff[k] *                                            booleanisPreviousLargeEnough = mLastDiff[k] > (diff /                                            booleanisNotContra = (mLastMatch != 1 ‐ extType);                                                if(isAlmostAsLargeAsPrevious && isPreviousLargeEnough &&isNotContra) {                                                    end= System.currentTimeMillis();                                                    if(end ‐ start > 500) {// 此时判断为走了 一步                                                           Log.i("StepDetector","CURRENT_SETP:"                                                                       +CURRENT_SETP);                                                           CURRENT_SETP++;                                                           mLastMatch= extType;                                                           start= end;                                                    }                                             }else {                                                    mLastMatch= ‐1;                                             }                                      }                                      mLastDiff[k]= diff;                               }                               mLastDirections[k]= direction;                               mLastValues[k]= v;                        }                 }          }     这个函数是一个传感器的回调函数,在其中可以根据从系统地加速度传感器获取的数值进行胳膊甩动动作的判 断。主要从以下几个方面判断: (1)人如果走起来了,一般会连续多走几步。因此,如果没有连续4­5个波动,那么就极大可能是干扰。  (2)人走动的波动,比坐车产生的波动要大,因此可以看波峰波谷的高度,只检测高于某个高度的波峰波谷。 (3)人的反射神经决定了人快速动的极限,怎么都不可能两步之间小于0.2秒,因此间隔小于0.2秒的波峰波谷 直接跳过 通过重力加速计感应,重力变化的方向,大小。与正常走路或跑步时的重力变化比对,达到一定相似度时认为是 在走路或跑步。实现起来很简单,只要手机有重力感应器就能实现。   1.    启动界面 程序启动界面带有缓冲效果,其中界面缓冲效果的配置文件在res/anim/目录下。如果计步器已经开始工作,则 跳过程序启动界面,直接进入主界面。 [java]  01.  02.  03.  04.  05.  06.  07.  08.  09.  10.  11.  12.  13.  14.  15.  16.  17.  18.  19.  20.         if (StepCounterService.FLAG || StepDetector.CURRENT_SETP > 0) {// 程序已经启动,直 接跳转到运行界面              Intent intent = new Intent(SplashActivity.this,StepCounterActivity.class); // 创建一个新的Intent,指定当前应用程序上下文       //和要启动的StepActivity类              startActivity(intent);                                         //传递这个 intent给startActivity              this.finish();          } else {              this.requestWindowFeature(Window.FEATURE_NO_TITLE);              this.setContentView(R.layout.splash);                  animation = AnimationUtils.loadAnimation(SplashActivity.this,                     R.anim.animation_splash);              this.findViewById(R.id.iv_index).setAnimation(animation);              animation.setAnimationListener(new AnimationListener() {// 动画监听,通过 AnimationListener可以监听Animation的运行过程                        @Override                        public void onAnimationStart(Animation animation){                            // TODOAuto‐generated method stub                        }                        @Override                        public void onAnimationRepeat(Animationanimation) {                            // TODOAuto‐generated method stub   2015/12/14Android 计步器开发 ­ ­ 博客频道 ­ CSDN.NEThttp://blog.csdn.net/guang09080908/article/details/414116796/14
21.  22.  23.  24.  25.  26.  27.  28.  29.  30.  31.  32.                       }                        @Override                        public void onAnimationEnd(Animation animation) {// 动画结束时跳转至 运行界面                            // TODOAuto‐generated method stub                            Intent intent = new Intent(SplashActivity.this,                                   StepCounterActivity.class);                            SplashActivity.this.startActivity(intent);                            SplashActivity.this.finish();                        }                     });          }   }   2.  程序主界面 (1)界面元素的初始化(比如步数,星期,日期,运行时间,行程,卡路里,速度,开始按钮和停止按钮)。 [java]  //定义文本框控件      private TextView tv_show_step;// 步数      private TextView tv_week_day;// 星期      private TextView tv_date;// 日期         private TextView tv_timer;// 运行时间         private TextView tv_distance;// 行程      private TextView tv_calories;// 卡路里      private TextView tv_velocity;// 速度         private Button btn_start;// 开始按钮      private Button btn_stop;// 停止按钮         // 十颗星标      private ImageView iv_star_1;                     private ImageView iv_star_2;      private ImageView iv_star_3;      private ImageView iv_star_4;      private ImageView iv_star_5;      private ImageView iv_star_6;      private ImageView iv_star_7;      private ImageView iv_star_8;      private ImageView iv_star_9;      private ImageView iv_star_10;         private long timer = 0;// 运动时间      private static long startTimer = 0;// 开始时间      private static long tempTime = 0;         private Double distance = 0.0;// 路程:米      private Double calories = 0.0;// 热量:卡路里      private Double velocity = 0.0;// 速度:米每秒         private int step_length = 0;  //步长      private int weight = 0;       //体重      private int total_step = 0;   //走的总步数           DatagramSocket socket;      InetAddress serverAddress;      DatagramPacket  send_package1;      private Thread thread;  //定义线程对象   01.  02.  03.  04.  05.  06.  07.  08.  09.  10.  11.  12.  13.  14.  15.  16.  17.  18.  19.  20.  21.  22.  23.  24.  25.  26.  27.  28.  29.  30.  31.  32.  33.  34.  35.  36.  37.  38.  39.  40.  41.  42.  (2)利用消息机制对主界面的UI元素进行更新。定义了一个handler,当检测的步数变化时,更新主界面显示的 信息。主要代码如下: [java]  01.  02.  03.  Handler handler = new Handler() {// Handler对象用于更新当前步数,定时发送消息,调用方法查询数据 用于显示??????????                                          //主要接受子线程发送的数据, 并用此数据配合主线程更新UI                                      //Handler运行在主线程中(UI线程中), 它与子线程可以通过 Message对象来传递数据,   2015/12/14Android 计步器开发 ­ ­ 博客频道 ­ CSDN.NEThttp://blog.csdn.net/guang09080908/article/details/414116797/14
04.  05.  06.  07.  08.  09.  10.  11.  12.  13.  14.  15.  16.  17.  18.  19.  20.  21.  22.  23.  24.  25.  26.  27.  28.  29.  30.  31.  32.  33.  34.  35.  36.  37.  38.     //Handler就承担着接受子线程传过来的(子线程用sendMessage()方法传递Message对象,(里面包含数 据)      //把这些消息放入主线程队列中,配合主线程进行更新UI。         @Override                  //这个方法是从父类/接口继承过来的,需要重写一次      public void handleMessage(Message msg) {          // TODO Auto‐generated method stub          super.handleMessage(msg);        // 此处可以更新UI             countDistance();     //调用距离方法,看一下走了多远             if (timer != 0 && distance != 0.0) {                // 体重、距离              // 跑步热量(kcal)=体重(kg)×距离(公里)×1.036             calories = weight * distance * 0.001;             //速度velocity             velocity = distance * 1000 / timer;          } else {             calories =0.0;             velocity =0.0;          }             countStep();          //调用步数方法             tv_show_step.setText(total_step + "");// 显示当前步数             tv_distance.setText(formatDouble(distance));// 显示路程          tv_calories.setText(formatDouble(calories));// 显示卡路里          tv_velocity.setText(formatDouble(velocity));// 显示速度             tv_timer.setText(getFormatTime(timer));// 显示当前运行时间             changeStep();// 设置当前步数和星标         }   (3)初始化主界面的信息。 [java]  01.  02.  03.  04.  05.  06.  07.  08.  09.  10.  11.  12.  13.  14.  15.  16.  17.  18.  19.  20.  21.  22.  23.  24.  25.  26.  27.  28.  29.  30.  31.  32.  33.  34.  35.  /**   * 初始化界面   */   private void init() {         step_length =SettingsActivity.sharedPreferences.getInt(             SettingsActivity.STEP_LENGTH_VALUE, 70);      weight =SettingsActivity.sharedPreferences.getInt(             SettingsActivity.WEIGHT_VALUE, 50);         countDistance();      countStep();      if ((timer += tempTime) != 0 && distance != 0.0) {  //tempTime记录运动的总时间,timer记 录每次运动时间             // 体重、距离          // 跑步热量(kcal)=体重(kg)×距离(公里)×1.036,换算一下          calories = weight * distance * 0.001;             velocity = distance * 1000 / timer;      } else {          calories = 0.0;          velocity = 0.0;      }         tv_timer.setText(getFormatTime(timer + tempTime));         tv_distance.setText(formatDouble(distance));      tv_calories.setText(formatDouble(calories));      tv_velocity.setText(formatDouble(velocity));         tv_show_step.setText(total_step + "");         btn_start.setEnabled(!StepCounterService.FLAG);      btn_stop.setEnabled(StepCounterService.FLAG);      2015/12/14Android 计步器开发 ­ ­ 博客频道 ­ CSDN.NEThttp://blog.csdn.net/guang09080908/article/details/414116798/14
分享到:
收藏