瀏覽代碼

处理调音器指针显示以及处理调音器Hz标准415-445调整逻辑

Pq 2 年之前
父節點
當前提交
412d1e0645

+ 33 - 6
musictuner/src/main/java/com/cooleshow/musictuner/MusicTunerActivity.java

@@ -14,6 +14,7 @@ import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.view.LayoutInflater;
+import android.view.View;
 
 import com.cooleshow.base.ui.activity.BaseActivity;
 import com.cooleshow.musictuner.bean.VoiceToneBean;
@@ -21,7 +22,7 @@ import com.cooleshow.musictuner.databinding.ActivityMusicTunerLayoutBinding;
 import com.cooleshow.musictuner.utils.MusicTunerHelper;
 import com.cooleshow.musictuner.utils.VoiceDataUtils;
 
-public class MusicTunerActivity extends BaseActivity<ActivityMusicTunerLayoutBinding> {
+public class MusicTunerActivity extends BaseActivity<ActivityMusicTunerLayoutBinding> implements View.OnClickListener {
 
     private MusicTunerHelper mMusicTunerHelper;
 
@@ -38,7 +39,10 @@ public class MusicTunerActivity extends BaseActivity<ActivityMusicTunerLayoutBin
 
     @Override
     protected void initView() {
-
+        viewBinding.ivHzAdd.setOnClickListener(this);
+        viewBinding.ivHzReduce.setOnClickListener(this);
+        VoiceDataUtils.getInstance().resetHzStandard();
+        updateCurrentHzStandardText();
     }
 
     @Override
@@ -60,7 +64,9 @@ public class MusicTunerActivity extends BaseActivity<ActivityMusicTunerLayoutBin
                                 viewBinding.tvResultVoiceTones.setText(voiceToneBean.name);
                                 viewBinding.tvBeforeResultVoiceTones.setText(voiceToneBean.beforeName);
                                 viewBinding.tvAfter.setText(voiceToneBean.afterName);
-                                viewBinding.tvDifference.setText(getDifferenceText(voiceToneBean.difference));
+                                long differenceText = getDifferenceText(voiceToneBean.difference);
+                                viewBinding.tvDifference.setText(differenceText != -1 ? String.valueOf(differenceText) : "");
+                                viewBinding.viewDashBoard.setProgress((int) differenceText);
                             }
                         }
                     });
@@ -78,14 +84,14 @@ public class MusicTunerActivity extends BaseActivity<ActivityMusicTunerLayoutBin
         return "";
     }
 
-    private String getDifferenceText(String diff) {
+    private long getDifferenceText(String diff) {
         try {
             double aDouble = Double.valueOf(diff);
-            return String.valueOf(Math.round(aDouble));
+            return Math.round(aDouble);
         } catch (Exception e) {
             e.printStackTrace();
         }
-        return "";
+        return -1;
     }
 
     @Override
@@ -95,4 +101,25 @@ public class MusicTunerActivity extends BaseActivity<ActivityMusicTunerLayoutBin
             mMusicTunerHelper.release();
         }
     }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.iv_hz_add) {
+            //增加
+            VoiceDataUtils.getInstance().addCurrentMusicHzStandard();
+            updateCurrentHzStandardText();
+
+        }
+        if (id == R.id.iv_hz_reduce) {
+            //减小
+            VoiceDataUtils.getInstance().reduceCurrentMusicHzStandard();
+            updateCurrentHzStandardText();
+        }
+    }
+
+    private void updateCurrentHzStandardText() {
+        int currentMusicHzStandard = VoiceDataUtils.getInstance().getCurrentMusicHzStandard();
+        viewBinding.tvMusicHzStandard.setText(getString(R.string.music_hz_str, currentMusicHzStandard));
+    }
 }

+ 39 - 4
musictuner/src/main/java/com/cooleshow/musictuner/utils/VoiceDataUtils.java

@@ -22,9 +22,12 @@ public class VoiceDataUtils {
             2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951,
             4186, 4435, 4699, 4978, 5274, 5588, 5920, 6272, 6645, 7040, 7459, 7902};
     public ArrayList<VoiceToneBean> voiceToneBeans;
+    public static final int MIN_MUSIC_HZ_STANDARD_415_HZ = 415;//最小415Hz
+    public static final int MAX_MUSIC_HZ_STANDARD_445_HZ = 445;//最大445Hz
+    public static final int DEFAULT_MUSIC_HZ_STANDARD_440_HZ = 440;//默认440
+    public int currentMusicHzStandard = DEFAULT_MUSIC_HZ_STANDARD_440_HZ;
 
     private VoiceDataUtils() {
-        buildData();
     }
 
     public static VoiceDataUtils getInstance() {
@@ -61,6 +64,7 @@ public class VoiceDataUtils {
         if (targetVoiceFrequencyValue == -1) {
             return null;
         }
+        targetVoiceFrequencyValue = countWithMusicHzStandard(targetVoiceFrequencyValue);
         if (targetVoiceFrequencyValue > ALL_VOICE_SAMPLES[ALL_VOICE_SAMPLES.length - 1]) {
             VoiceToneBean voiceToneBean = buildBean(ALL_VOICE_SAMPLES.length - 2, ALL_VOICE_SAMPLES.length - 3, ALL_VOICE_SAMPLES.length - 1);
             voiceToneBean.difference = String.valueOf(targetVoiceFrequencyValue - ALL_VOICE_SAMPLES[ALL_VOICE_SAMPLES.length - 2]);
@@ -94,11 +98,11 @@ public class VoiceDataUtils {
     private VoiceToneBean buildBean(int pos, int beforePos, int afterPos) {
         VoiceToneBean voiceToneBean = new VoiceToneBean();
         voiceToneBean.name = countName(pos);
-        voiceToneBean.voiceFrequencyValue = ALL_VOICE_SAMPLES[pos];
+        voiceToneBean.voiceFrequencyValue = countWithMusicHzStandard2(ALL_VOICE_SAMPLES[pos]);
         voiceToneBean.beforeName = countName(beforePos);
-        voiceToneBean.beforeVoiceFrequencyValue = ALL_VOICE_SAMPLES[beforePos];
+        voiceToneBean.beforeVoiceFrequencyValue = countWithMusicHzStandard2(ALL_VOICE_SAMPLES[beforePos]);
         voiceToneBean.afterName = countName(afterPos);
-        voiceToneBean.afterVoiceFrequencyValue = ALL_VOICE_SAMPLES[afterPos];
+        voiceToneBean.afterVoiceFrequencyValue = countWithMusicHzStandard2(ALL_VOICE_SAMPLES[afterPos]);
         Log.i("qaz", "result name:" + voiceToneBean.name +
                 "\nvalue:" + voiceToneBean.voiceFrequencyValue);
         return voiceToneBean;
@@ -132,4 +136,35 @@ public class VoiceDataUtils {
         }
         return A.length;
     }
+
+    public void addCurrentMusicHzStandard() {
+        if (currentMusicHzStandard < MAX_MUSIC_HZ_STANDARD_445_HZ) {
+            currentMusicHzStandard += 1;
+        }
+    }
+
+    public int getCurrentMusicHzStandard() {
+        return currentMusicHzStandard;
+
+    }
+
+    public void reduceCurrentMusicHzStandard() {
+        if (currentMusicHzStandard > MIN_MUSIC_HZ_STANDARD_415_HZ) {
+            currentMusicHzStandard -= 1;
+        }
+    }
+
+    public void resetHzStandard() {
+        currentMusicHzStandard = DEFAULT_MUSIC_HZ_STANDARD_440_HZ;
+    }
+
+    private float countWithMusicHzStandard(float target) {
+        float value = target * DEFAULT_MUSIC_HZ_STANDARD_440_HZ / currentMusicHzStandard;
+        return value;
+    }
+
+    private double countWithMusicHzStandard2(double target) {
+        double value = target / DEFAULT_MUSIC_HZ_STANDARD_440_HZ * currentMusicHzStandard;
+        return value;
+    }
 }

+ 51 - 14
musictuner/src/main/java/com/cooleshow/musictuner/widget/DashBoardView.java

@@ -30,8 +30,6 @@ public class DashBoardView extends View {
     private int width;
     private int height;
     private int mRadius;
-    private int mCenterX;
-    private int mCenterY;
     private int paddingBottom = SizeUtils.dp2px(9);
 
     private int mSection = 10; // 值域(mMax-mMin)等分份数
@@ -49,6 +47,8 @@ public class DashBoardView extends View {
     private Paint mTextValuePaint;
     private RectF mGradientLineRectF;
     private Paint mPointerPaint;
+    private float pointerHeight = 0;//指针高度
+    private double innerGradientRadiusPercent = 0.75;//渐变线的圆半径比例
     private int pointerAngle = 0;
     private int currentProgress = 0;
 
@@ -102,17 +102,15 @@ public class DashBoardView extends View {
         cx = width / 2;
         cy = height - paddingBottom;
         mRadius = (int) ((width / 2) * 0.8);
-        mCenterX = cx;
-        mCenterY = cy;
-
+        pointerHeight = (float) (mRadius * innerGradientRadiusPercent + SizeUtils.dp2px(9));//加上渐变环线笔的宽度的一半
         initGradientPaint();
 
         mGradientLineRectF = new RectF();
         mGradientLineRectF.set(
-                (float) (cx - mRadius * 0.75),
-                (float) (cy - (mRadius * 0.75)),
-                (float) (cx + mRadius * 0.75),
-                (float) (cy + (mRadius * 0.75))
+                (float) (cx - mRadius * innerGradientRadiusPercent),
+                (float) (cy - (mRadius * innerGradientRadiusPercent)),
+                (float) (cx + mRadius * innerGradientRadiusPercent),
+                (float) (cy + (mRadius * innerGradientRadiusPercent))
         );
     }
 
@@ -137,11 +135,15 @@ public class DashBoardView extends View {
         super.onDraw(canvas);
 //        canvas.drawLine(cx, cy, cx, 0, mCenterPointPaint);
         canvas.drawArc(mGradientLineRectF, -180, 180, false, mOuterGradientPaint);
-        canvas.drawLine(cx, cy, cx, (float) (cy - mRadius * 0.75 - SizeUtils.dp2px(9)), mPointerPaint);
+        float[] floats = countPointerPosition(currentProgress);
+        canvas.drawLine(cx, cy, floats[0], floats[1], mPointerPaint);
+
 
-        float x0 = mCenterX;
+        //绘制长刻度
+        mLinePaint.setAlpha(255);
+        float x0 = cx;
         float y0 = height - mRadius;
-        float x1 = mCenterX;
+        float x1 = cx;
         float y1 = y0 + longScaleLineHeight;
         // 逆时针到开始处
         canvas.save();
@@ -168,7 +170,7 @@ public class DashBoardView extends View {
          */
         mLinePaint.setAlpha(90);
 
-        float x2 = mCenterX;
+        float x2 = cx;
         float y2 = y0 + shortScaleLineHeight;
         // 逆时针到开始处
         canvas.save();
@@ -229,8 +231,43 @@ public class DashBoardView extends View {
         }
     }
 
+    private int maxMusicHzOffset = 50;
+    private int minMusicHzOffset = -50;
+
+    private float[] countPointerPosition(float diff) {
+        float[] points = new float[2];
+        if (diff > maxMusicHzOffset) {
+            diff = maxMusicHzOffset;
+        }
+        if (diff < minMusicHzOffset) {
+            diff = minMusicHzOffset;
+        }
 
-    private void countPointerPosition() {
+        if (diff > 0) {
+            double angle = (diff / maxMusicHzOffset) * mSweepAngle / 2;
+            Log.i("zxc","angle:"+angle);
+            float radian = (float) Math.toRadians(angle);
+            points[0] = (float) (cx + Math.sin(radian) * pointerHeight);
+            points[1] = (float) (cy - Math.cos(radian) * pointerHeight);
+        } else if (diff == 0) {
+            points[0] = cx;
+            points[1] = (float) (cy - pointerHeight);
+        } else {
+            double angle = Math.abs((diff / minMusicHzOffset) * mSweepAngle / 2);
+            Log.i("zxc","angle:"+angle);
+            float radian = (float) Math.toRadians(angle);
+            points[0] = (float) (cx - Math.sin(radian) * pointerHeight);
+            points[1] = (float) (cy - Math.cos(radian) * pointerHeight);
+        }
+        Log.i("zxc","points[0]:"+points[0]);
+        Log.i("zxc","points[1]:"+points[1]);
+        return points;
+    }
 
+    public void setProgress(int progress) {
+        if (progress != -1) {
+            this.currentProgress = progress;
+            invalidate();
+        }
     }
 }

+ 13 - 0
musictuner/src/main/res/layout/activity_music_tuner_layout.xml

@@ -11,6 +11,19 @@
         android:id="@+id/toolbar_include"
         layout="@layout/common_toolbar_layout_white" />
 
+    <TextView
+        android:id="@+id/tv_music_hz_standard"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="10dp"
+        android:includeFontPadding="false"
+        android:paddingStart="12dp"
+        android:text="A4=440Hz"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_16"
+        app:layout_constraintLeft_toLeftOf="@+id/iv_dash_board_bg"
+        app:layout_constraintTop_toBottomOf="@+id/toolbar_include" />
+
     <ImageView
         android:id="@+id/iv_dash_board_bg"
         android:layout_width="match_parent"

+ 1 - 0
musictuner/src/main/res/values/strings.xml

@@ -1,2 +1,3 @@
 <resources>
+    <string name="music_hz_str">A4=%dHz</string>
 </resources>

+ 3 - 1
student/src/main/java/com/cooleshow/student/ui/main/NewHomeFragment.java

@@ -25,6 +25,7 @@ import com.cooleshow.base.utils.Utils;
 import com.cooleshow.base.utils.helper.WebStartHelper;
 import com.cooleshow.base.widgets.CommonItemDecoration;
 import com.cooleshow.base.widgets.dialog.AwardTipDialog;
+import com.cooleshow.musictuner.MusicTunerActivity;
 import com.cooleshow.student.R;
 import com.cooleshow.student.adapter.HomeBottomPageAdapter;
 import com.cooleshow.student.adapter.HomeGoodMusicSheetAdapter;
@@ -786,7 +787,8 @@ public class NewHomeFragment extends BaseMVPFragment<FragmentNewHomeLayoutBindin
 
         if (id == R.id.view_search_bg) {
             //搜索
-            WebStartHelper.startSearch();
+            MusicTunerActivity.start(getContext());
+//            WebStartHelper.startSearch();
             return;
         }
         if (id == R.id.iv_scan) {