Преглед на файлове

优化节拍器部分逻辑,增加16分音符

Pq преди 2 години
родител
ревизия
d9f7388901

+ 15 - 4
metronome/src/main/java/com/cooleshow/metronome/MetronomeActivity.java

@@ -32,6 +32,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
 public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBinding> implements View.OnClickListener, VolumeManager.VolumeChangeListener {
     public MetronomeType currentBeatType;
     public int currentBeatRate = MetronomeConfig.DEFAULT_PLAY_RATE;
+    public float currentNoteRate = MetronomeConfig.DEFAULT_NOTE_RATE;
     private SoundPool soundPool;
     private int tickVoiceId;
     private int tockVoiceId;
@@ -42,7 +43,7 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
     private Runnable mRunnable = new Runnable() {
         @Override
         public void run() {
-            long delayMillis = (long) (1 / (currentBeatRate / 60d) * 1000);
+            long delayMillis = (long) (1 / (currentBeatRate / 60d) * 1000 * currentNoteRate);
             boolean tickOrTock = isTickOrTock();
             if (tickOrTock) {
                 soundPool.play(tickVoiceId, 1F, 1F, 0, 0, 1F);
@@ -81,7 +82,7 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
 
     @Override
     protected void initView() {
-        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar,"节拍器");
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "节拍器");
         viewBinding.toolbarInclude.toolbar.setBackgroundColor(Color.TRANSPARENT);
         updateSpeedText();
     }
@@ -102,6 +103,9 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
         playPosition = 0;
         mMetronomeAdapter.notifyData(MetronomeAdapter.DEFAULT_SELECT_POSITION);
         mMetronomeAdapter.setCount(getBeatSymbolCount());
+        currentNoteRate = MetronomeType.getNoteSpeedValue(metronomeType);
+        int noteDrawable = MetronomeConfig.getNoteDrawable(metronomeType);
+        viewBinding.ivNote.setImageResource(noteDrawable);
     }
 
     private int getBeatSymbolCount() {
@@ -128,6 +132,10 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
         if (value == MetronomeType.METRONOME_68_TYPE.getValue()) {
             return 6;
         }
+
+        if (value == MetronomeType.METRONOME_816_TYPE.getValue()) {
+            return 8;
+        }
         return 0;
     }
 
@@ -144,13 +152,14 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
         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_22_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_44_TYPE);
         beatSymbolLists.add(MetronomeType.METRONOME_68_TYPE);
+        beatSymbolLists.add(MetronomeType.METRONOME_816_TYPE);
         mVolumeManager = new VolumeManager(this);
         mVolumeManager.setVolumeChangeListener(this);
         mVolumeManager.registerReceiver();
@@ -290,6 +299,8 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
             return true;
         } else if (currentBeatType.getValue() == MetronomeType.METRONOME_68_TYPE.getValue() && playPosition % 6 == 0) {
             return true;
+        } else if (currentBeatType.getValue() == MetronomeType.METRONOME_816_TYPE.getValue() && playPosition % 8 == 0) {
+            return true;
         } else {
             return false;
         }

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

@@ -1,14 +1,36 @@
 package com.cooleshow.metronome.constants;
 
+import android.text.TextUtils;
+
+import com.cooleshow.metronome.R;
+
 /**
  * Author by pq, Date on 2022/9/16.
  */
 public class MetronomeConfig {
     public static final int DEFAULT_PLAY_RATE = 90;//默认播放速度
+    public static final float DEFAULT_NOTE_RATE = 1.0f;//默认4分音符为1.0 八分音符为2.0以此类推
     public static final int MIN_PLAY_RATE = 50;//最小播放速度
     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 String RHYTHNS[] = {"1/2", "2/2", "1/4", "2/4", "3/4", "4/4", "3/8", "6/8"};
 
+
+    public static int getNoteDrawable(MetronomeType metronomeType) {
+        if (TextUtils.equals(metronomeType.getNoteValue(), "4")) {
+            return R.mipmap.icon_quarter_note;
+        }
+        if (TextUtils.equals(metronomeType.getNoteValue(), "2")) {
+            return R.mipmap.icon_half_note;
+        }
+
+        if (TextUtils.equals(metronomeType.getNoteValue(), "8")) {
+            return R.mipmap.icon_one_eighth_note;
+        }
+
+        if (TextUtils.equals(metronomeType.getNoteValue(), "16")) {
+            return R.mipmap.icon_sixteenth_note;
+        }
+        return R.mipmap.icon_quarter_note;
+    }
 }

+ 38 - 10
metronome/src/main/java/com/cooleshow/metronome/constants/MetronomeType.java

@@ -1,26 +1,32 @@
 package com.cooleshow.metronome.constants;
 
+import android.text.TextUtils;
+
 import com.contrarywind.interfaces.IPickerViewData;
 
 /**
  * Author by pq, Date on 2022/9/16.
  */
 public enum MetronomeType implements IPickerViewData {
-    METRONOME_12_TYPE(0, "1/2"),
-    METRONOME_22_TYPE(1, "2/2"),
-    METRONOME_14_TYPE(2, "1/4"),
-    METRONOME_24_TYPE(3, "2/4"),
-    METRONOME_34_TYPE(4, "3/4"),
-    METRONOME_44_TYPE(5, "4/4"),
-    METRONOME_38_TYPE(6, "3/8"),
-    METRONOME_68_TYPE(7, "6/8");
+    METRONOME_12_TYPE(0, "1/2", "2"),
+    METRONOME_22_TYPE(1, "2/2", "2"),
+    METRONOME_14_TYPE(2, "1/4", "4"),
+    METRONOME_24_TYPE(3, "2/4", "4"),
+    METRONOME_34_TYPE(4, "3/4", "4"),
+    METRONOME_44_TYPE(5, "4/4", "4"),
+    METRONOME_38_TYPE(6, "3/8", "8"),
+    METRONOME_68_TYPE(7, "6/8", "8"),
+    METRONOME_816_TYPE(8, "8/16", "16");
 
     private int value;
     private String name;
+    private String noteValue;
+
 
-    private MetronomeType(int value, String name) {
+    private MetronomeType(int value, String name, String noteValue) {
         this.value = value;
         this.name = name;
+        this.noteValue = noteValue;
     }
 
     public int getValue() {
@@ -31,6 +37,10 @@ public enum MetronomeType implements IPickerViewData {
         return this.name;
     }
 
+    public String getNoteValue() {
+        return noteValue;
+    }
+
     public static MetronomeType setValue(int code) {
         MetronomeType[] var1 = values();
         int var2 = var1.length;
@@ -45,8 +55,26 @@ public enum MetronomeType implements IPickerViewData {
         return METRONOME_14_TYPE;
     }
 
+    public static float getNoteSpeedValue(MetronomeType metronomeType) {
+        if (TextUtils.equals(metronomeType.getNoteValue(), "4")) {
+            return 1.0f;
+        }
+        if (TextUtils.equals(metronomeType.getNoteValue(), "2")) {
+            return 2.0f;
+        }
+
+        if (TextUtils.equals(metronomeType.getNoteValue(), "8")) {
+            return 0.5f;
+        }
+
+        if (TextUtils.equals(metronomeType.getNoteValue(), "16")) {
+            return 0.25f;
+        }
+        return 1.0f;
+    }
+
     @Override
     public String getPickerViewText() {
-        return  this.name ;
+        return this.name;
     }
 }

+ 10 - 0
metronome/src/main/res/layout/activity_metronome_layout.xml

@@ -69,6 +69,16 @@
         app:layout_constraintCircleAngle="320"
         app:layout_constraintCircleRadius="55dp" />
 
+    <TextView
+
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintLeft_toRightOf="@+id/iv_note"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_note"
+        app:layout_constraintTop_toTopOf="@+id/iv_note"
+        android:text="="
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
 
     <ImageView
         android:id="@+id/iv_reduce"

BIN
metronome/src/main/res/mipmap-xhdpi/icon_half_note.png


BIN
metronome/src/main/res/mipmap-xhdpi/icon_one_eighth_note.png


BIN
metronome/src/main/res/mipmap-xhdpi/icon_sixteenth_note.png


BIN
metronome/src/main/res/mipmap-xxhdpi/icon_half_note.png


BIN
metronome/src/main/res/mipmap-xxhdpi/icon_one_eighth_note.png


BIN
metronome/src/main/res/mipmap-xxhdpi/icon_sixteenth_note.png