Android精准计步器

demo链接:https://download.csdn.net/download/meixi_android/10690974

工具类:

public class StepDetector implements SensorEventListener {//存放三轴数据float[] oriValues = new float[3];final int ValueNum = 4;//用于存放计算阈值的波峰波谷差值float[] tempValue = new float[ValueNum];int tempCount = 0;//是否上升的标志位boolean isDirectionUp = false;//持续上升次数int continueUpCount = 0;//上一点的持续上升的次数,为了记录波峰的上升次数int continueUpFormerCount = 0;//上一点的状态,上升还是下降boolean lastStatus = false;//波峰值float peakOfWave = 0;//波谷值float valleyOfWave = 0;//此次波峰的时间long timeOfThisPeak = 0;//上次波峰的时间long timeOfLastPeak = 0;//当前的时间long timeOfNow = 0;//当前传感器的值float gravityNew = 0;//上次传感器的值float gravityOld = 0;//动态阈值需要动态的数据,这个值用于这些动态数据的阈值final float InitialValue = (float) 1.3;//初始阈值float ThreadValue = (float) 2.0;//波峰波谷时间差int TimeInterval = 250;private StepCountListener mStepListeners;@Overridepublic void onSensorChanged(SensorEvent event) {for (int i = 0; i < 3; i++) {oriValues[i] = event.values[i];}gravityNew = (float) Math.sqrt(oriValues[0] * oriValues[0]+ oriValues[1] * oriValues[1] + oriValues[2] * oriValues[2]);detectorNewStep(gravityNew);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {//}public void initListener(StepCountListener listener) {this.mStepListeners = listener;}/** 检测步子,并开始计步* 1.传入sersor中的数据* 2.如果检测到了波峰,并且符合时间差以及阈值的条件,则判定为1步* 3.符合时间差条件,波峰波谷差值大于initialValue,则将该差值纳入阈值的计算中* */public void detectorNewStep(float values) {if (gravityOld == 0) {gravityOld = values;} else {if (detectorPeak(values, gravityOld)) {timeOfLastPeak = timeOfThisPeak;timeOfNow = System.currentTimeMillis();if (timeOfNow - timeOfLastPeak >= TimeInterval&& (peakOfWave - valleyOfWave >= ThreadValue)) {timeOfThisPeak = timeOfNow;/** 更新界面的处理,不涉及到算法* 一般在通知更新界面之前,增加下面处理,为了处理无效运动:* 1.连续记录10才开始计步* 2.例如记录的9步用户停住超过3秒,则前面的记录失效,下次从头开始* 3.连续记录了9步用户还在运动,之前的数据才有效* */mStepListeners.countStep();}if (timeOfNow - timeOfLastPeak >= TimeInterval&& (peakOfWave - valleyOfWave >= InitialValue)) {timeOfThisPeak = timeOfNow;ThreadValue = peakValleyThread(peakOfWave - valleyOfWave);}}}gravityOld = values;}/** 检测波峰* 以下四个条件判断为波峰:* 1.目前点为下降的趋势:isDirectionUp为false* 2.之前的点为上升的趋势:lastStatus为true* 3.到波峰为止,持续上升大于等于2次* 4.波峰值大于20* 记录波谷值* 1.观察波形图,可以发现在出现步子的地方,波谷的下一个就是波峰,有比较明显的特征以及差值* 2.所以要记录每次的波谷值,为了和下次的波峰做对比* */public boolean detectorPeak(float newValue, float oldValue) {lastStatus = isDirectionUp;if (newValue >= oldValue) {isDirectionUp = true;continueUpCount++;} else {continueUpFormerCount = continueUpCount;continueUpCount = 0;isDirectionUp = false;}if (!isDirectionUp && lastStatus&& (continueUpFormerCount >= 2 || oldValue >= 20)) {peakOfWave = oldValue;return true;} else if (!lastStatus && isDirectionUp) {valleyOfWave = oldValue;return false;} else {return false;}}/** 阈值的计算* 1.通过波峰波谷的差值计算阈值* 2.记录4个值,存入tempValue[]数组中* 3.在将数组传入函数averageValue中计算阈值* */public float peakValleyThread(float value) {float tempThread = ThreadValue;if (tempCount < ValueNum) {tempValue[tempCount] = value;tempCount++;} else {tempThread = averageValue(tempValue, ValueNum);for (int i = 1; i < ValueNum; i++) {tempValue[i - 1] = tempValue[i];}tempValue[ValueNum - 1] = value;}return tempThread;}/** 梯度化阈值* 1.计算数组的均值* 2.通过均值将阈值梯度化在一个范围里* */public float averageValue(float value[], int n) {float ave = 0;for (int i = 0; i < n; i++) {ave += value[i];}ave = ave / ValueNum;if (ave >= 8)ave = (float) 4.3;else if (ave >= 7 && ave < 8)ave = (float) 3.3;else if (ave >= 4 && ave < 7)ave = (float) 2.3;else if (ave >= 3 && ave < 4)ave = (float) 2.0;else {ave = (float) 1.3;}return ave;}}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 目录 挂载

docker容器启动的时候&#xff0c;如果要挂载宿主机的一个目录&#xff0c;可以用-v参数指定。 譬如我要启动一个centos容器&#xff0c;宿主机的/share目录挂载到容器的/share目录&#xff0c;可通过以下方式指定&#xff1a; docker run -it -v /share:/share centos /bin/…

工作177:表单重置项目处理

<template><!--新建账号对话框--><el-dialog title"新建账号" :visible.sync"dialogFormVisible" close"close"><el-form ref"form" :model"form" size"medium" :label-width"formLabe…

docker删除所有镜像和容器

需求&#xff1a;重新进行开发&#xff0c;需要清空目前的镜像和容器。 1、删除容器 1&#xff09;首先需要停止所有的容器 docker stop $(docker ps -a -q) 2&#xff09;删除所有的容器&#xff08;只删除单个时把后面的变量改为image id即可&#xff09; docker rm $(d…

Ubuntu配置完全教程

前言 最近将旧电脑换成了Ubuntu系统&#xff0c;在网上找了许多优化和配置教程&#xff0c;今天整理一份完整的教程给大家分享 系统清理 卸载LibreOffice libreoffice事ubuntu自带的开源office软件&#xff0c;体验效果不如windows上的office&#xff0c;于是选择用WPS来替代&a…

Android assets文件使用

1、在main文件夹下创建assets文件夹 2、assets文件夹下可创建image文件夹&#xff0c;text文件夹&#xff0c;image文件夹下存放jpg或png图片。text文件夹下存放.txt文本 3、读取assets文件内容&#xff1a; entity类&#xff1a; public class Book {private static final…

工作176:表单重置

复制代码 <el-form :model"loginForm" ref"loginFormRef"> // 1. 需要给表单指定 ref 属性 , 可以理解为表单的 名字<!-- 用户名 --><el-form-item prop"username"> // 2. 需要给 需要重置 的表单项指定 prop 属性, 值…

《掌握需求过程》阅读笔记05

需求策略需要平衡需求知识、活动和人。沟通需求知识的一致的语言&#xff0c;发现和传播知识的活动&#xff0c;参与的人&#xff0c;这些是影响需求策略的所有变量。 需求策略是一个活动的框架&#xff0c;需要根据给定的项目轮廓&#xff0c;执行这些活动。在工作中常遇到的轮…

Android 自定义字体,设置字体

效果图 实现代码&#xff1a; 1、先下载字体文件.ttf 下载链接&#xff1a;http://font.chinaz.com/maobiziti.html 2、main文件夹下创建fonts文件夹&#xff0c;.ttf文件复制到fonts文件夹下 3、读取ttf文件 List<Typeface> mTypefaceList new ArrayList(); priva…

docker 安装 centos

1、设置docker 镜像加速 三个源 名称路径网易https://hub-mirror.c.163.com/阿里云https://<你的ID>.mirror.aliyuncs.com七牛云加速器https://reg-mirror.qiniu.com "registry-mirrors":["https://hub-mirror.c.163.com/","https://reg-mirr…

工作177:时间戳转换

main.js // 将时间戳转日期格式的过滤器 Vue.filter(dateFormat, (dataStr) > {var time new Date(dataStr);function timeAdd0(str) {if (str < 10) {str 0 str;}return str}var y time.getFullYear();var m time.getMonth() 1;var d time.getDate();var h time…

管理点收集

1.建立一个“建议组” 来允许员工说出对工作过程中的不合理的地方的建议&#xff0c;不断收集建议 定期整改2.站立会议的按时举行3.文档管理制定负责人4.代码管理 版本定期发布5.尽可能的让员工之间的工作减少相互依赖&#xff08;减少相互之间的等待&#xff09;6.“所有人应该…

Android 简单几行代码实现摇一摇功能

1、activity 实现加速度监听类 。。。。implements SensorEventListener public class MainActivity extends AppCompatActivity implements SensorEventListener { 2、activity实现两个方法&#xff1a; Overridepublic void onSensorChanged(SensorEvent sensorEvent) {Se…

docker centos 环境 安装 python

1、下载安装python编译环境依赖 yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel #安装make编译所需的gcc,g编译器 yum -y install gcc automake autoconf libtool make wget 2、移除centos中自带的python2.7的环境变量 cd /…

Linux下Shell文件内容替换(sed)(转)

sed -i s/被替换的内容/要替换成的内容/g file #-i为直接修改并保存 参考&#xff1a; http://blog.sina.com.cn/s/blog_7211cb9201019hgd.html http://wangchujiang.com/linux-command/c/sed.html转载于:https://www.cnblogs.com/EasonJim/p/8018381.html

docker查看容器ip地址

docker inspect <containerid> 比如 docker inspect dcd61b573df1 里面包含"Gateway": "172.17.0.1" 可以读出ip

Android ContentProvider实现两个程序间数据共享demo,跨进程通讯

1、客户端代码&#xff1a; 先实现服务端 SQL创建&#xff1a; public class DBHelper extends SQLiteOpenHelper {// 数据库名private static final String DATABASE_NAME "finch.db";// 表名public static final String USER_TABLE_NAME "user";pub…

工作179:接口对接

/*创建我的视频接口 第一个参数自己手动录入 第二个参数取值任务详情的接口接口*/// postActionXing("/internal/users/current/video-projects",{// brand_id:this.account.brand_id,name:this.project_name// }).then(// res>{// this.project_idre…

二.java下使用RabbitMQ实现hello world

上一篇文章介绍了windows环境下的安装和配置rabbitMQ&#xff0c;具体戳这边&#xff0c;一.windows环境下rabbit的的安装和配置。 现在我们可以着手编写hello world程序了&#xff0c;一窥RabbitMQ的效用&#xff0c;从rabbitmq的官网的get start进入rabbitMQ文档学习区&#…

docker镜像导入、导出

导出镜像 docker save -o centos7.tar centos 导入本地镜像 sudo docker load --input centos7.tar