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