日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android精准计步器

發布時間:2023/12/10 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;}}

?

?

總結

以上是生活随笔為你收集整理的Android精准计步器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。