首页 > 系统 > Android > 正文

Android seekbar(自定义)控制音量同步更新

2019-12-12 04:09:22
字体:
来源:转载
供稿:网友

Android seekbar控制音量同步更新

  作为开发人员来讲,seekbar你一定会碰到,那么怎么自定义seekbar以及seekbar控制的音量怎么与系统的seekbar音量同步更新。今天就下拉菜单中添加SeekBar控制音量为例(Android 5.1系统)

  一:自定义Seekbar

   先来看一下所自定义的效果图:

     

  首先来来看一下布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:id="@+id/ringtone_seekbar_parent"   android:layout_width="match_parent"   android:layout_height="160px"   android:layout_marginTop="0dip"   android:layout_weight="1"   android:gravity="center_vertical"   android:orientation="horizontal" >    <ImageView     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:layout_marginLeft="25dip"     android:background="@drawable/zf_notify_quicksetting_ringtone" />    <SeekBar     android:id="@+id/ringtone_seekbar"     android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:layout_marginRight="10dp"     android:maxHeight="49px"     android:minHeight="49px"     android:paddingEnd="40dp"     android:paddingStart="25dp"     android:progress="60"     android:progressDrawable="@drawable/zf_progress_horizontal"     android:splitTrack="false"     android:thumb="@drawable/zf_noti_scrubber_control_normal"     android:thumbOffset="0px" />  </LinearLayout> 

  这里面需要看一下android:progressDrawable="@drawable/zf_progress_horizontal"   看一下 zf_progress_horizontal.xml文件有什么东西。

<?xml version="1.0" encoding="utf-8"?>  <layer-list xmlns:android="http://schemas.android.com/apk/res/android">      <item android:id="@android:id/background" android:drawable="@drawable/progress_gray"/>      <item android:id="@android:id/progress" android:drawable="@drawable/progress_blue"/>    </layer-list> 

  这里面有两张图片 下图分别是这两张图片的效果  @drawable/progress_blue 和 @drawable/progress_gray

 

关于 thumb="@drawable/zf_noti_scrubber_control_normal" 这个是按压的按钮图片

  好了 布局代码就这些,剩下的就是实现控制音量的代码了。

  二:与系统seekbar音量同步更新

    1.首先看一下实现控制音量的代码

      打开下面路径下的代码

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.Java  在protected PhoneStatusBarView makeStatusBarView() {}方法里面注册ID,然后在里面实现控制代码。

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);//获取媒体系统服务 mVoiceSeekBar= (SeekBar) mStatusBarWindow.findViewById(R.id.ringtone_seekbar);//注册ID mVoiceSeekBar.setMax(15);//设置最大音量 mVoiceSeekBar.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));// 当前的媒体音量 myRegisterReceiver();//注册同步更新的广播 Log.i("lyj_ring", "mVoiceSeekBar max voluem = "+audioManager.getStreamMaxVolume(AudioManager.STREAM_SYSTEM)); mVoiceSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {          public void onStopTrackingTouch(SeekBar arg0) {     // TODO Auto-generated method stub           }          public void onStartTrackingTouch(SeekBar arg0) {     // TODO Auto-generated method stub            } public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {       AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);       Log.v("lyj_ring", "mVoiceSeekBar max progress = "+arg1);       //系统音量和媒体音量同时更新       audioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, arg1, 0);       audioManager.setStreamVolume(3, arg1, 0);// 3 代表 AudioManager.STREAM_MUSIC      }     }); mVoiceObserver = new ContentObserver(new Handler()) {      @Override      public void onChange(boolean selfChange) {        // TODO Auto-generated method stub        super.onChange(selfChange);        AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);        mVoiceSeekBar.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_SYSTEM));        //或者你也可以用媒体音量来监听改变,效果都是一样的。        //mVoiceSeekBar.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));       }     }; 

    看代码可以发现,当seekbar改变的时候我这里处理的是 系统音量和媒体音量同时改变的。

AudioManager.STREAM_SYSTEM和AudioManager.STREAM_MUSIC。在监听状态变化时你也可以用媒体音量来监听变化。效果都是一样的。

    2.与系统seekbar控制音量同步更新

      主要就是监听音量改变是的广播,来看一下实现的代码:

 /**   * 注册当音量发生变化时接收的广播   */   private void myRegisterReceiver(){   MyVolumeReceiver mVolumeReceiver = new MyVolumeReceiver() ;     IntentFilter filter = new IntentFilter() ;     filter.addAction("android.media.VOLUME_CHANGED_ACTION") ;     mContext.registerReceiver(mVolumeReceiver, filter) ;   }      /**   * 处理音量变化时的界面显示   * @author long   */   private class MyVolumeReceiver extends BroadcastReceiver{     @Override     public void onReceive(Context context, Intent intent) {       //如果音量发生变化则更改seekbar的位置       if(intent.getAction().equals("android.media.VOLUME_CHANGED_ACTION")){       AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);         int currVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC) ;// 当前的媒体音量         mVoiceSeekBar.setProgress(currVolume) ;       }     }   } 

    这里面的myRegisterReceiver()方法在1中的代码中已经注册了,这样的话整个功能就实现了。这个过程下来感觉功能的实现很简单,关键是seekbar进度条要与系统的音量进度条实时更新,这个是关键。以上就是所有的控制代码。

感谢阅读,希望能帮助到大家,谢谢大家,对本站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表