|
@@ -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));
|
|
|
}
|
|
|
|