Kaynağa Gözat

增加节拍器音量控制逻辑

Pq 2 yıl önce
ebeveyn
işleme
14f5da9379

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

@@ -10,11 +10,14 @@ import android.os.Bundle;
 import android.os.Handler;
 import android.util.Log;
 import android.view.View;
+import android.widget.SeekBar;
 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.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.metronome.Utils.VolumeManager;
 import com.cooleshow.metronome.adapter.MetronomeAdapter;
 import com.cooleshow.metronome.constants.MetronomeConfig;
 import com.cooleshow.metronome.constants.MetronomeType;
@@ -22,12 +25,11 @@ import com.cooleshow.metronome.databinding.ActivityMetronomeLayoutBinding;
 import com.cooleshow.metronome.widget.CircularSeekBar;
 
 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 class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBinding> implements View.OnClickListener, VolumeManager.VolumeChangeListener {
     public MetronomeType currentBeatType;
     public int currentBeatRate = MetronomeConfig.DEFAULT_PLAY_RATE;
     private SoundPool soundPool;
@@ -64,6 +66,7 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
     private List<MetronomeType> beatSymbolLists;
     private int currentSelectPosition;
     private MetronomeAdapter mMetronomeAdapter;
+    private VolumeManager mVolumeManager;
 
     public static void start(Context context) {
         Intent intent = new Intent(context, MetronomeActivity.class);
@@ -73,14 +76,17 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        QMUIStatusBarHelper.setStatusBarLightMode(this);
     }
 
     @Override
     protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar,"节拍器");
         viewBinding.toolbarInclude.toolbar.setBackgroundColor(Color.TRANSPARENT);
         updateSpeedText();
     }
 
+
     private void updateSpeedText() {
         viewBinding.tvSpeed.setText(String.valueOf(currentBeatRate));
     }
@@ -145,6 +151,29 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
         beatSymbolLists.add(MetronomeType.METRONOME_44_TYPE);
         beatSymbolLists.add(MetronomeType.METRONOME_38_TYPE);
         beatSymbolLists.add(MetronomeType.METRONOME_68_TYPE);
+        mVolumeManager = new VolumeManager(this);
+        mVolumeManager.setVolumeChangeListener(this);
+        mVolumeManager.registerReceiver();
+        int streamVolume = mVolumeManager.getCurrentMusicVolume();
+        int maxStreamVolume = mVolumeManager.getMaxMusicVolume();
+        viewBinding.volumeSeekBar.setMax(maxStreamVolume);
+        viewBinding.volumeSeekBar.setProgress(streamVolume);
+        viewBinding.volumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+            @Override
+            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+                mVolumeManager.setCurrentMusicVolume(progress);
+            }
+
+            @Override
+            public void onStartTrackingTouch(SeekBar seekBar) {
+
+            }
+
+            @Override
+            public void onStopTrackingTouch(SeekBar seekBar) {
+
+            }
+        });
     }
 
     private void play() {
@@ -297,6 +326,7 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
     public void onDestroy() {
         super.onDestroy();
         try {
+            mVolumeManager.unregisterReceiver();
             soundPool.release();
             soundPool = null;
             mHandler.removeCallbacksAndMessages(null);
@@ -332,14 +362,23 @@ public class MetronomeActivity extends BaseActivity<ActivityMetronomeLayoutBindi
 
     private void updateAnim(int value) {
         int progress = viewBinding.cirSeekbar.getProgress();
-        Log.i("qwer","当前progress:"+progress);
+        Log.i("qwer", "当前progress:" + progress);
         progress += value;
         if (progress >= MetronomeConfig.MAX_RATE_PROGRESS) {
             progress = 0;
         }
         if (progress < 0) {
-            progress = MetronomeConfig.MAX_RATE_PROGRESS+value;
+            progress = MetronomeConfig.MAX_RATE_PROGRESS + value;
         }
         viewBinding.cirSeekbar.setProgress(progress);
     }
+
+    @Override
+    public void onVolumeChanged(int volume) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        viewBinding.volumeSeekBar.setProgress(volume);
+    }
+
 }

+ 115 - 0
metronome/src/main/java/com/cooleshow/metronome/Utils/VolumeManager.java

@@ -0,0 +1,115 @@
+package com.cooleshow.metronome.Utils;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.AudioManager;
+import android.util.Log;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * Author by pq, Date on 2022/9/22.
+ */
+public class VolumeManager {
+    private static final String VOLUME_CHANGED_ACTION = "android.media.VOLUME_CHANGED_ACTION";
+    private static final String EXTRA_VOLUME_STREAM_TYPE = "android.media.EXTRA_VOLUME_STREAM_TYPE";
+
+    public interface VolumeChangeListener {
+        /**
+         * 系统媒体音量变化
+         */
+        void onVolumeChanged(int volume);
+    }
+
+
+    private VolumeChangeListener mVolumeChangeListener;
+    private VolumeBroadcastReceiver mVolumeBroadcastReceiver;
+    private Context mContext;
+    private AudioManager mAudioManager;
+    private boolean mRegistered = false;
+
+
+    public VolumeManager(Context context) {
+        mContext = context;
+        if (mAudioManager == null) {
+            mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+        }
+    }
+
+
+    public int getCurrentMusicVolume() {
+        return mAudioManager != null ? mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC) : -1;
+    }
+
+    public void setCurrentMusicVolume(int value) {
+        if (mAudioManager != null) {
+            mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC,value,AudioManager.FLAG_PLAY_SOUND);
+        }
+    }
+
+
+    public int getMaxMusicVolume() {
+        return mAudioManager != null ? mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC) : 15;
+    }
+
+
+    public VolumeChangeListener getVolumeChangeListener() {
+        return mVolumeChangeListener;
+    }
+
+    public void setVolumeChangeListener(VolumeChangeListener volumeChangeListener) {
+        this.mVolumeChangeListener = volumeChangeListener;
+    }
+
+
+    public void registerReceiver() {
+        mVolumeBroadcastReceiver = new VolumeBroadcastReceiver(this);
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(VOLUME_CHANGED_ACTION);
+        mContext.registerReceiver(mVolumeBroadcastReceiver, filter);
+        mRegistered = true;
+    }
+
+
+    public void unregisterReceiver() {
+        if (mRegistered) {
+            try {
+                mContext.unregisterReceiver(mVolumeBroadcastReceiver);
+                mVolumeChangeListener = null;
+                mRegistered = false;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+
+    private static class VolumeBroadcastReceiver extends BroadcastReceiver {
+        private WeakReference<VolumeManager> mObserverWeakReference;
+
+        public VolumeBroadcastReceiver(VolumeManager volumeChangeObserver) {
+            mObserverWeakReference = new WeakReference<>(volumeChangeObserver);
+        }
+
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            //媒体音量改变才通知
+            if (VOLUME_CHANGED_ACTION.equals(intent.getAction()) && (intent.getIntExtra(EXTRA_VOLUME_STREAM_TYPE, -1) == AudioManager.STREAM_MUSIC)) {
+                VolumeManager observer1 = mObserverWeakReference.get();
+                if (observer1 != null) {
+                    VolumeChangeListener listener = observer1.getVolumeChangeListener();
+                    if (listener != null) {
+                        int volume = observer1.getCurrentMusicVolume();
+                        if (volume >= 0) {
+                            listener.onVolumeChanged(volume);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+}

+ 25 - 0
metronome/src/main/res/drawable/bg_volume_seekbar.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- 背景 -->
+    <item android:id="@android:id/background">
+        <shape>
+            <!-- 圆角 -->
+            <corners android:radius="2dp" />
+            <!--            背景色-->
+            <solid android:color="#dfdfdf"/>
+            <size android:height="4dp"/>
+        </shape>
+    </item>
+    <!--    滑动条-->
+    <item android:id="@android:id/progress">
+        <clip>
+            <shape>
+                <!-- 圆角 -->
+                <corners android:radius="2dp" />
+                <!--            背景色-->
+                <solid android:color="@color/color_2dc7aa"/>
+                <size android:height="4dp"/>
+            </shape>
+        </clip>
+    </item>
+</layer-list>

+ 6 - 0
metronome/src/main/res/drawable/shape_volume_seekbar_thumb.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <solid android:color="@color/color_2dc7aa"/>
+    <size android:width="10dp" android:height="10dp"/>
+</shape>

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

@@ -131,6 +131,40 @@
         app:layout_constraintTop_toTopOf="@+id/iv_beat_value"
         tools:text="6/4" />
 
+    <androidx.appcompat.widget.AppCompatSeekBar
+        android:layout_marginTop="24dp"
+        android:id="@+id/volume_seek_bar"
+        android:layout_width="182dp"
+        android:layout_height="wrap_content"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/iv_beat_value"
+        android:thumb="@drawable/shape_volume_seekbar_thumb"
+        android:progressDrawable="@drawable/bg_volume_seekbar"
+        android:max="100"
+        android:progress="50"
+        android:maxHeight="4dp"
+        android:splitTrack="false"
+        android:visibility="visible" />
+
+    <ImageView
+        android:layout_marginEnd="8dp"
+        app:layout_constraintBottom_toBottomOf="@+id/volume_seek_bar"
+        app:layout_constraintTop_toTopOf="@+id/volume_seek_bar"
+        app:layout_constraintRight_toLeftOf="@+id/volume_seek_bar"
+        android:src="@mipmap/icon_volume_trumpet_reduce"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <ImageView
+        android:layout_marginStart="8dp"
+        app:layout_constraintBottom_toBottomOf="@+id/volume_seek_bar"
+        app:layout_constraintTop_toTopOf="@+id/volume_seek_bar"
+        app:layout_constraintLeft_toRightOf="@+id/volume_seek_bar"
+        android:src="@mipmap/icon_volume_trumpet_add"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
     <TextView
         android:id="@+id/tv_play"
         android:layout_width="0dp"

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


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


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


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