[Android]seekbar控制系統(tǒng)音量

SeekBar介紹

SeekBar是ProgressBar的子類咱扣,通過(guò)對(duì)ProgressBar進(jìn)行功能性的補(bǔ)充,可以響應(yīng)用戶的點(diǎn)擊和拖動(dòng)事件。接下來(lái)將要介紹屬性設(shè)置、樣式設(shè)置以及功能設(shè)置母谎。并且通過(guò)SeekBar來(lái)控制系統(tǒng)音量。

SeekBar常用屬性介紹

首先在xml當(dāng)中對(duì)SeekBar進(jìn)行屬性的設(shè)置

 <SeekBar
    android:id="@+id/seek_bar"
    style="@android:style/Widget.Material.SeekBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:max="200"
    android:padding="20dp"
    android:progress="0"
    android:visibility="visible"
    android:progressDrawable="@drawable/seek_bar_voice_bg"
    android:thumb="@drawable/seek_bar_voice_circle"/>

其中京革,android:max是對(duì)進(jìn)度條的最大值進(jìn)行設(shè)定奇唤,在這里進(jìn)行設(shè)置之后幸斥,還可以通過(guò)使用seekBar.setMax()函數(shù)進(jìn)行設(shè)置,SeekBar的默認(rèn)范圍是[0,100]咬扇。
android:progress顯示的是進(jìn)度條的初始值甲葬,其值不能大于設(shè)置的最大值,在這里進(jìn)行設(shè)置之后懈贺,還可以通過(guò)使用seekBar.setProgress()函數(shù)進(jìn)行設(shè)置
android:progressDrawable="@drawable/seek_bar_voice_bg"经窖,對(duì)進(jìn)度條的樣式進(jìn)行設(shè)置
android:thumb="@drawable/seek_bar_voice_circle",對(duì)進(jìn)度條的按鈕樣式進(jìn)行設(shè)置

SeekBar樣式屬性設(shè)置

首先對(duì)進(jìn)度條樣式進(jìn)行設(shè)置梭灿,在drawable路徑下画侣,設(shè)置seek_bar_voice_bg

<?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>
          <solid android:color="#65686A" />
      </shape>
  </item>
  <item android:id="@android:id/secondaryProgress">
      <clip>
          <shape>
              <solid android:color="#ff51495e" />
          </shape>
      </clip>
  </item>
  <item android:id="@android:id/progress">
      <clip>
          <shape>
              <solid android:color="#2287FE" />
          </shape>
      </clip>
  </item>
</layer-list>

其中,backgroud是進(jìn)度條的背景顏色堡妒,progress是已經(jīng)滑過(guò)的進(jìn)度條的顏色配乱,secondaryProgress是還未滑過(guò)的進(jìn)度條的顏色。

接下來(lái)對(duì)進(jìn)度條的樣式進(jìn)行設(shè)置:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<solid
    android:color="#FF9A33"
    />
<size
    android:width="20dp"
    android:height="20dp"/>
</shape>

SeekBar功能的設(shè)置

初始化設(shè)置

am = (AudioManager)getSystemService(AUDIO_SERVICE);
//獲取系統(tǒng)最大音量
int maxVolume = am.getStreamMaxVolume(AudioManager.STREAM_SYSTEM );
seekBar.setMax(maxVolume);
//獲取當(dāng)前音量
int currentVolume = am.getStreamVolume(AudioManager.STREAM_SYSTEM);
Log.i("init", String.valueOf(currentVolume));
seekBar.setProgress(currentVolume);
textView.setText(""+currentVolume+"/"+maxVolume);

這里有一個(gè)問(wèn)題涕蚤,在一開始編這段代碼的時(shí)候宪卿,參考網(wǎng)上的代碼時(shí)發(fā)現(xiàn),并不能改變系統(tǒng)聲音進(jìn)度條的變化万栅,后來(lái)發(fā)現(xiàn)是AudioManager有很多的音量設(shè)置來(lái)源,包括:

 /** Used to identify the volume of audio streams for phone calls */
**public** **static** **final** **int** [STREAM_VOICE_CALL](http://androidxref.com/8.0.0_r4/s?refs=STREAM_VOICE_CALL&project=frameworks) = [AudioSystem](http://androidxref.com/8.0.0_r4/s?defs=AudioSystem&project=frameworks).[STREAM_VOICE_CALL](http://androidxref.com/8.0.0_r4/s?refs=STREAM_VOICE_CALL&project=frameworks);
/** Used to identify the volume of audio streams for system sounds */
**public** **static** **final** **int** [STREAM_SYSTEM](http://androidxref.com/8.0.0_r4/s?refs=STREAM_SYSTEM&project=frameworks) = [AudioSystem](http://androidxref.com/8.0.0_r4/s?defs=AudioSystem&project=frameworks).[STREAM_SYSTEM](http://androidxref.com/8.0.0_r4/s?refs=STREAM_SYSTEM&project=frameworks);
/** Used to identify the volume of audio streams for the phone ring */
**public** **static** **final** **int** [STREAM_RING](http://androidxref.com/8.0.0_r4/s?refs=STREAM_RING&project=frameworks) = [AudioSystem](http://androidxref.com/8.0.0_r4/s?defs=AudioSystem&project=frameworks).[STREAM_RING](http://androidxref.com/8.0.0_r4/s?refs=STREAM_RING&project=frameworks);
/** Used to identify the volume of audio streams for music playback */
**public** **static** **final** **int** [STREAM_MUSIC](http://androidxref.com/8.0.0_r4/s?refs=STREAM_MUSIC&project=frameworks) = [AudioSystem](http://androidxref.com/8.0.0_r4/s?defs=AudioSystem&project=frameworks).[STREAM_MUSIC](http://androidxref.com/8.0.0_r4/s?refs=STREAM_MUSIC&project=frameworks);
/** Used to identify the volume of audio streams for alarms */
**public** **static** **final** **int** [STREAM_ALARM](http://androidxref.com/8.0.0_r4/s?refs=STREAM_ALARM&project=frameworks) = [AudioSystem](http://androidxref.com/8.0.0_r4/s?defs=AudioSystem&project=frameworks).[STREAM_ALARM](http://androidxref.com/8.0.0_r4/s?refs=STREAM_ALARM&project=frameworks);
/** Used to identify the volume of audio streams for notifications */
**public** **static** **final** **int** [STREAM_NOTIFICATION](http://androidxref.com/8.0.0_r4/s?refs=STREAM_NOTIFICATION&project=frameworks) = [AudioSystem](http://androidxref.com/8.0.0_r4/s?defs=AudioSystem&project=frameworks).[STREAM_NOTIFICATION](http://androidxref.com/8.0.0_r4/s?refs=STREAM_NOTIFICATION&project=frameworks);
/** **@hide** Used to identify the volume of audio streams for phone calls when connected
 *        to bluetooth */
**public** **static** **final** **int** [STREAM_BLUETOOTH_SCO](http://androidxref.com/8.0.0_r4/s?refs=STREAM_BLUETOOTH_SCO&project=frameworks) = [AudioSystem](http://androidxref.com/8.0.0_r4/s?defs=AudioSystem&project=frameworks).[STREAM_BLUETOOTH_SCO](http://androidxref.com/8.0.0_r4/s?refs=STREAM_BLUETOOTH_SCO&project=frameworks);
/** **@hide** Used to identify the volume of audio streams for enforced system sounds
 *        in certain countries (e.g camera in Japan) */
**public** **static** **final** **int** [STREAM_SYSTEM_ENFORCED](http://androidxref.com/8.0.0_r4/s?refs=STREAM_SYSTEM_ENFORCED&project=frameworks) = [AudioSystem](http://androidxref.com/8.0.0_r4/s?defs=AudioSystem&project=frameworks).[STREAM_SYSTEM_ENFORCED](http://androidxref.com/8.0.0_r4/s?refs=STREAM_SYSTEM_ENFORCED&project=frameworks);
/** Used to identify the volume of audio streams for DTMF Tones */
**public** **static** **final** **int** [STREAM_DTMF](http://androidxref.com/8.0.0_r4/s?refs=STREAM_DTMF&project=frameworks) = [AudioSystem](http://androidxref.com/8.0.0_r4/s?defs=AudioSystem&project=frameworks).[STREAM_DTMF](http://androidxref.com/8.0.0_r4/s?refs=STREAM_DTMF&project=frameworks);
/** **@hide** Used to identify the volume of audio streams exclusively transmitted through the
 *        speaker (TTS) of the device */
**public** **static** **final** **int** [STREAM_TTS](http://androidxref.com/8.0.0_r4/s?refs=STREAM_TTS&project=frameworks) = [AudioSystem](http://androidxref.com/8.0.0_r4/s?defs=AudioSystem&project=frameworks).[STREAM_TTS](http://androidxref.com/8.0.0_r4/s?refs=STREAM_TTS&project=frameworks);
/** Used to identify the volume of audio streams for accessibility prompts */
**public** **static** **final** **int** [STREAM_ACCESSIBILITY]

所以在代碼中使用的AudioManager當(dāng)中的STREAM_SYSTEM來(lái)進(jìn)行的設(shè)置音量最大值以及當(dāng)前值西疤。

響應(yīng)音量調(diào)節(jié)

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if(fromUser){
                seekBarProgress = progress;
                am.setStreamVolume(AudioManager.STREAM_SYSTEM , progress, 0);
                int currentVolume = am.getStreamVolume(AudioManager.STREAM_SYSTEM );
                seekBar.setProgress(currentVolume);
            }
            textView.setText(""+progress);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            textView.setText("開始了");
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            textView.setText("停止了烦粒,當(dāng)前值為:"+seekBarProgress);
            if(seekBarProgress == seekBar.getMax()){
                textView.setText("達(dá)到最值");
            }
        }
    });

可以看到,SeekBar需要注冊(cè)監(jiān)聽器來(lái)進(jìn)行進(jìn)度條值改變后的響應(yīng)代赁,包括進(jìn)度條被拖動(dòng)后的響應(yīng)public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)扰她,其中fromUser的含義是判斷,進(jìn)度條的拖動(dòng)是否由用戶操作芭碍,在這個(gè)函數(shù)當(dāng)中設(shè)置了系統(tǒng)的聲音徒役;后面的兩個(gè)函數(shù),用來(lái)監(jiān)聽是否開始移動(dòng)以及停止拖動(dòng)進(jìn)度條窖壕。

監(jiān)聽聲音設(shè)置更改

通過(guò)注冊(cè)廣播接收器忧勿,監(jiān)聽手機(jī)按鍵更改的聲音,來(lái)同步設(shè)置進(jìn)度條的更改瞻讽。

private class VolumeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals("android.media.VOLUME_CHANGED_ACTION")){
            int currentVolume = am.getStreamVolume(AudioManager.STREAM_SYSTEM);
            seekBar.setProgress(currentVolume);
        }
    }
}

這個(gè)廣播監(jiān)聽器是通過(guò)內(nèi)部類來(lái)動(dòng)態(tài)注冊(cè)的鸳吸,注冊(cè)方法是:

receiver = new VolumeReceiver();
IntentFilter filter = new IntentFilter() ;
filter.addAction("android.media.VOLUME_CHANGED_ACTION") ;
this.registerReceiver(receiver, filter) ;

通過(guò)設(shè)置對(duì)VOLUME_CHANGED_ACTION的更改進(jìn)行監(jiān)聽,可以動(dòng)態(tài)更改進(jìn)度條速勇。
動(dòng)態(tài)的廣播監(jiān)聽器需要在程序退出的時(shí)候取消注冊(cè)晌砾,以防內(nèi)存泄漏。

protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receiver);
}

運(yùn)行效果

運(yùn)行效果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末烦磁,一起剝皮案震驚了整個(gè)濱河市养匈,隨后出現(xiàn)的幾起案子哼勇,更是在濱河造成了極大的恐慌,老刑警劉巖呕乎,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件积担,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡楣嘁,警方通過(guò)查閱死者的電腦和手機(jī)磅轻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逐虚,“玉大人聋溜,你說(shuō)我怎么就攤上這事“劝” “怎么了撮躁?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)买雾。 經(jīng)常有香客問(wèn)我把曼,道長(zhǎng),這世上最難降的妖魔是什么漓穿? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任嗤军,我火速辦了婚禮,結(jié)果婚禮上晃危,老公的妹妹穿的比我還像新娘叙赚。我一直安慰自己,他們只是感情好僚饭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布震叮。 她就那樣靜靜地躺著,像睡著了一般鳍鸵。 火紅的嫁衣襯著肌膚如雪苇瓣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天偿乖,我揣著相機(jī)與錄音击罪,去河邊找鬼。 笑死汹想,一個(gè)胖子當(dāng)著我的面吹牛外邓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播古掏,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼损话,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起丧枪,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤光涂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拧烦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忘闻,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年恋博,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了齐佳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡债沮,死狀恐怖炼吴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疫衩,我是刑警寧澤硅蹦,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站闷煤,受9級(jí)特大地震影響童芹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鲤拿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一假褪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧近顷,春花似錦嗜价、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)家淤。三九已至异剥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間絮重,已是汗流浹背冤寿。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留青伤,地道東北人督怜。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像狠角,于是被迫代替她去往敵國(guó)和親号杠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容