Procházet zdrojové kódy

修改节拍器计时器间隔和节拍期望间隔不准确问题

Pq před 1 rokem
rodič
revize
f2251fb87e

+ 45 - 16
metronome/src/main/java/com/cooleshow/metronome/MetronomeActivity.java

@@ -8,6 +8,7 @@ import android.media.AudioManager;
 import android.media.SoundPool;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.SystemClock;
 import android.util.Log;
 import android.view.View;
 import android.widget.SeekBar;
@@ -18,6 +19,7 @@ import com.bigkoo.pickerview.builder.OptionsPickerBuilder;
 import com.bigkoo.pickerview.view.OptionsPickerView;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseActivity;
+import com.cooleshow.base.utils.LOG;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
 import com.cooleshow.metronome.Utils.VolumeManager;
 import com.cooleshow.metronome.adapter.MetronomeAdapter;
@@ -47,26 +49,52 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
         @Override
         public void run() {
             long delayMillis = (long) (1 / (currentBeatRate / 60d) * 1000 * currentNoteRate);
-            boolean tickOrTock = isTickOrTock();
-            if (tickOrTock) {
-                soundPool.play(tickVoiceId, 1F, 1F, 0, 0, 1F);
+            long next = MetronomeConfig.MIN_COUNT_TIME_SPACE;
+            if (totalTime == -1) {
+                handleMusic(delayMillis);
             } else {
-                soundPool.play(tockVoiceId, 1F, 1F, 0, 0, 1F);
-            }
-            if (mMetronomeAdapter != null) {
-                mMetronomeAdapter.notifyData(playPosition);
-                mHandler.postDelayed(new Runnable() {
-                    @Override
-                    public void run() {
-                        //实现闪烁动画效果
-                        mMetronomeAdapter.notifyData(MetronomeAdapter.DEFAULT_SELECT_POSITION);
-                    }
-                }, delayMillis / 2);
+                long l = System.currentTimeMillis();
+                if (Math.abs(l - totalTime)-delayMillis < next) {
+                    next =Math.abs(l - totalTime)-delayMillis;
+                }
+                if (Math.abs(l -totalTime) >= delayMillis) {
+                    handleMusic(delayMillis);
+                }
             }
-            playPosition++;
-            mHandler.postDelayed(mRunnable, delayMillis);
+            mHandler.postDelayed(mRunnable, next);
         }
     };
+
+    private long totalTime = -1;
+    private long lastTime = -1;
+
+    private void handleMusic(long delayMillis) {
+        boolean tickOrTock = isTickOrTock();
+        long cTime = System.currentTimeMillis();
+        if (lastTime != -1) {
+            long diff = cTime - lastTime;
+            LOG.i("diff:" + diff);
+        }
+        lastTime = cTime;
+        if (tickOrTock) {
+            soundPool.play(tickVoiceId, 1F, 1F, 0, 0, 1F);
+        } else {
+            soundPool.play(tockVoiceId, 1F, 1F, 0, 0, 1F);
+        }
+        if (mMetronomeAdapter != null) {
+            mMetronomeAdapter.notifyData(playPosition);
+            mHandler.postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    //实现闪烁动画效果
+                    mMetronomeAdapter.notifyData(MetronomeAdapter.DEFAULT_SELECT_POSITION);
+                }
+            }, delayMillis / 2);
+        }
+        playPosition++;
+        totalTime = cTime;
+    }
+
     private List<MetronomeType> beatSymbolLists;
     private int currentSelectPosition;
     private MetronomeAdapter mMetronomeAdapter;
@@ -194,6 +222,7 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
         soundPool.stop(tockVoiceId);
         mHandler.post(mRunnable);
         isPlaying = true;
+        totalTime = -1;
         viewBinding.tvPlay.setText(getString(R.string.pause_play_str));
     }
 

+ 1 - 0
metronome/src/main/java/com/cooleshow/metronome/constants/MetronomeConfig.java

@@ -14,6 +14,7 @@ public class MetronomeConfig {
     public static final int MAX_PLAY_RATE = 200;//最大播放速度
     public static final int PLAY_RATE_UNIT = 10;//10个进度 +1或者-1速度
     public static final int MAX_RATE_PROGRESS = 100;//最大进度100
+    public static final int MIN_COUNT_TIME_SPACE = 100;//定时器最小间隔
 
 
     public static int getNoteDrawable(MetronomeType metronomeType) {