|
@@ -1,7 +1,5 @@
|
|
|
package com.cooleshow.metronome;
|
|
|
|
|
|
-import androidx.viewbinding.ViewBinding;
|
|
|
-
|
|
|
import android.content.Context;
|
|
|
import android.content.Intent;
|
|
|
import android.graphics.Color;
|
|
@@ -12,21 +10,32 @@ import android.os.Bundle;
|
|
|
import android.os.Handler;
|
|
|
import android.util.Log;
|
|
|
import android.view.View;
|
|
|
+import android.widget.TextView;
|
|
|
|
|
|
+import com.bigkoo.pickerview.builder.OptionsPickerBuilder;
|
|
|
+import com.bigkoo.pickerview.view.OptionsPickerView;
|
|
|
import com.cooleshow.base.ui.activity.BaseActivity;
|
|
|
+import com.cooleshow.metronome.adapter.MetronomeAdapter;
|
|
|
import com.cooleshow.metronome.constants.MetronomeConfig;
|
|
|
import com.cooleshow.metronome.constants.MetronomeType;
|
|
|
import com.cooleshow.metronome.databinding.ActivityMetronomeLayoutBinding;
|
|
|
import com.cooleshow.metronome.widget.CircularSeekBar;
|
|
|
|
|
|
-public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBinding> {
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+import androidx.recyclerview.widget.LinearLayoutManager;
|
|
|
+
|
|
|
+public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBinding> implements View.OnClickListener {
|
|
|
public MetronomeType currentBeatType;
|
|
|
public int currentBeatRate = MetronomeConfig.DEFAULT_PLAY_RATE;
|
|
|
private SoundPool soundPool;
|
|
|
private int tickVoiceId;
|
|
|
private int tockVoiceId;
|
|
|
-
|
|
|
- public int playPosition = 0;
|
|
|
+ private OptionsPickerView pvOptions;
|
|
|
+ private int playPosition = 0;
|
|
|
+ private boolean isPlaying = false;
|
|
|
private Handler mHandler = new Handler();
|
|
|
private Runnable mRunnable = new Runnable() {
|
|
|
@Override
|
|
@@ -38,10 +47,23 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
|
|
|
} 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++;
|
|
|
mHandler.postDelayed(mRunnable, delayMillis);
|
|
|
}
|
|
|
};
|
|
|
+ private List<MetronomeType> beatSymbolLists;
|
|
|
+ private int currentSelectPosition;
|
|
|
+ private MetronomeAdapter mMetronomeAdapter;
|
|
|
|
|
|
public static void start(Context context) {
|
|
|
Intent intent = new Intent(context, MetronomeActivity.class);
|
|
@@ -56,8 +78,6 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
|
|
|
@Override
|
|
|
protected void initView() {
|
|
|
viewBinding.toolbarInclude.toolbar.setBackgroundColor(Color.TRANSPARENT);
|
|
|
- currentBeatType = MetronomeType.METRONOME_44_TYPE;
|
|
|
- viewBinding.tvCurrentBeat.setText(currentBeatType.getName());
|
|
|
viewBinding.tvSpeed.setText(String.valueOf(currentBeatRate));
|
|
|
}
|
|
|
|
|
@@ -66,11 +86,61 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
|
|
|
return ActivityMetronomeLayoutBinding.inflate(getLayoutInflater());
|
|
|
}
|
|
|
|
|
|
+ private void setBeat(MetronomeType metronomeType) {
|
|
|
+ currentBeatType = metronomeType;
|
|
|
+ viewBinding.tvCurrentBeat.setText(metronomeType.getName());
|
|
|
+ playPosition = 0;
|
|
|
+ mMetronomeAdapter.notifyData(MetronomeAdapter.DEFAULT_SELECT_POSITION);
|
|
|
+ mMetronomeAdapter.setCount(getBeatSymbolCount());
|
|
|
+ }
|
|
|
+
|
|
|
+ private int getBeatSymbolCount() {
|
|
|
+ int value = currentBeatType.getValue();
|
|
|
+ if (value == MetronomeType.METRONOME_12_TYPE.getValue()
|
|
|
+ || value == MetronomeType.METRONOME_14_TYPE.getValue()) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value == MetronomeType.METRONOME_22_TYPE.getValue()
|
|
|
+ || value == MetronomeType.METRONOME_24_TYPE.getValue()) {
|
|
|
+ return 2;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value == MetronomeType.METRONOME_34_TYPE.getValue()
|
|
|
+ || value == MetronomeType.METRONOME_38_TYPE.getValue()) {
|
|
|
+ return 3;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value == MetronomeType.METRONOME_44_TYPE.getValue()) {
|
|
|
+ return 4;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value == MetronomeType.METRONOME_68_TYPE.getValue()) {
|
|
|
+ return 6;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
protected void initData() {
|
|
|
super.initData();
|
|
|
+ mMetronomeAdapter = new MetronomeAdapter();
|
|
|
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
|
|
|
+ viewBinding.recyclerView.setLayoutManager(linearLayoutManager);
|
|
|
+ viewBinding.recyclerView.setAdapter(mMetronomeAdapter);
|
|
|
+ //set default
|
|
|
+ setBeat(MetronomeType.METRONOME_44_TYPE);
|
|
|
initListener();
|
|
|
mteronomeSoundPool();
|
|
|
+ beatSymbolLists = new ArrayList<>();
|
|
|
+ beatSymbolLists.add(MetronomeType.METRONOME_12_TYPE);
|
|
|
+ beatSymbolLists.add(MetronomeType.METRONOME_22_TYPE);
|
|
|
+ beatSymbolLists.add(MetronomeType.METRONOME_14_TYPE);
|
|
|
+ beatSymbolLists.add(MetronomeType.METRONOME_24_TYPE);
|
|
|
+ beatSymbolLists.add(MetronomeType.METRONOME_34_TYPE);
|
|
|
+ beatSymbolLists.add(MetronomeType.METRONOME_44_TYPE);
|
|
|
+ beatSymbolLists.add(MetronomeType.METRONOME_38_TYPE);
|
|
|
+ beatSymbolLists.add(MetronomeType.METRONOME_68_TYPE);
|
|
|
}
|
|
|
|
|
|
private void play() {
|
|
@@ -78,6 +148,16 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
|
|
|
soundPool.stop(tickVoiceId);
|
|
|
soundPool.stop(tockVoiceId);
|
|
|
mHandler.post(mRunnable);
|
|
|
+ isPlaying = true;
|
|
|
+ viewBinding.tvPlay.setText(getString(R.string.pause_play_str));
|
|
|
+ }
|
|
|
+
|
|
|
+ private void pausePlay() {
|
|
|
+ mHandler.removeCallbacksAndMessages(null);
|
|
|
+ soundPool.stop(tickVoiceId);
|
|
|
+ soundPool.stop(tockVoiceId);
|
|
|
+ isPlaying = false;
|
|
|
+ viewBinding.tvPlay.setText(getString(R.string.play_str));
|
|
|
}
|
|
|
|
|
|
private void mteronomeSoundPool() {
|
|
@@ -101,10 +181,15 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
|
|
|
private int lastProgress = 0;
|
|
|
|
|
|
private void initListener() {
|
|
|
+ viewBinding.ivBeatValue.setOnClickListener(this);
|
|
|
viewBinding.tvPlay.setOnClickListener(new View.OnClickListener() {
|
|
|
@Override
|
|
|
public void onClick(View v) {
|
|
|
- play();
|
|
|
+ if (isPlaying) {
|
|
|
+ pausePlay();
|
|
|
+ } else {
|
|
|
+ play();
|
|
|
+ }
|
|
|
}
|
|
|
});
|
|
|
viewBinding.cirSeekbar.setSeekBarChangeListener(new CircularSeekBar.OnSeekChangeListener() {
|
|
@@ -175,6 +260,32 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private void selectSymbols() {
|
|
|
+ pvOptions = new OptionsPickerBuilder(this, (options1, options2, options3, v) -> {
|
|
|
+ this.currentSelectPosition = options1;
|
|
|
+ MetronomeType metronomeType = beatSymbolLists.get(currentSelectPosition);
|
|
|
+ viewBinding.tvCurrentBeat.setText(metronomeType.getName());
|
|
|
+ setBeat(metronomeType);
|
|
|
+ pausePlay();
|
|
|
+ }).setTitleText("拍号").setTitleColor(Color.BLACK).setLayoutRes(R.layout.pickerview_beat_symbol_layout, v -> {
|
|
|
+ //自定义布局中的控件初始化及事件处理
|
|
|
+ final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
|
|
|
+ TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
|
|
|
+ tvSubmit.setOnClickListener(v12 -> {
|
|
|
+ pvOptions.returnData();
|
|
|
+ pvOptions.dismiss();
|
|
|
+ });
|
|
|
+ ivCancel.setOnClickListener(v1 -> pvOptions.dismiss());
|
|
|
+
|
|
|
+ }).isDialog(false).build();
|
|
|
+ pvOptions.setPicker(beatSymbolLists);
|
|
|
+ if (currentSelectPosition < beatSymbolLists.size()) {
|
|
|
+ pvOptions.setSelectOptions(currentSelectPosition);
|
|
|
+ }
|
|
|
+ pvOptions.show();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
@Override
|
|
|
public void onDestroy() {
|
|
@@ -187,4 +298,13 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
|
|
|
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onClick(View v) {
|
|
|
+ int id = v.getId();
|
|
|
+ if (id == R.id.iv_beat_value) {
|
|
|
+ selectSymbols();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|