SeekBarVolumizer.java

从类的名字上看,这个类应该是一个音量的SeekBar。

1、对于SeekBar,需要着重关注的就是其三个回调函数。

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
        if (fromTouch) {
            postSetVolume(progress);
        }
        if (mCallback != null) {
            mCallback.onProgressChanged(seekBar, progress, fromTouch);
        }
}

public void onStartTrackingTouch(SeekBar seekBar) {
}

public void onStopTrackingTouch(SeekBar seekBar) {
        postStartSample();
}

2、对于音量,这个类注册了广播监听,Action为:

AudioManager.VOLUME_CHANGED_ACTION
AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION
NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED
AudioManager.STREAM_DEVICES_CHANGED_ACTION

3、同时注册了一个关于StreamType音量变化的监听

 mVolumeObserver = new Observer(mHandler);
 mContext.getContentResolver().registerContentObserver(
     System.getUriFor(System.VOLUME_SETTINGS[mStreamType]),
     false, mVolumeObserver);

知道了以上三个信息,现在来分析,当我们滑动SeekBar的时候会发生什么情况。

从onProgressChanged回调可以知道,滑动SeekBar的过程中会不断地去设置音量。

从onStopTrackingTouch回调可以知道,滑动完成之后,会播放sample。

注:这里可以看到,如果我们第一次滑动完毕,其实sample正在播放,我们在播放过程中滑动SeekBar的滑,此时sample播放的声音会随着我们的滑动而改变。

因为我们注册了AudioManager.VOLUME_CHANGED_ACTION,所以在滑动的过程中,由于我们设置了音量,那么我们将会收到这个广播,于是收到该广播我们又会去更新SeekBar。

对于两个成员变量的作用:

mAffectedByRingerMode = mAudioManager.isStreamAffectedByRingerMode(mStreamType);
mNotificationOrRing = isNotificationOrRing(mStreamType);

mAffectedByRingerMode的作用比较明显,就是判断StreamType是否受响铃模式影响。

mNotificationOrRing从变量名可以看出,是判断Stream是否属于Notification或者Ring其中一种的一个标识位。

这个变量的具体作用在于,当我们收到音量变化的广播的时候,我们需要去判断,发生音量变化的StreamType和我们这个类所控制的StreamType是否一样,如果一样,我们才会去更新SeekBar。也就是说,当Ring和Notification的音量会同时变化,当我们调整Ring的音量的时候,Notificaion的音量也会发生改变,要使得Notification和Ring互相不影响,只需要把streamMatch = streamType == mStreamType就可以了,也就是说,当跟我当前表示的StreamType发生音量变化的时候,我才去更新SeekBar.

private void updateVolumeSlider(int streamType, int streamValue) {
            final boolean streamMatch = mNotificationOrRing ? isNotificationOrRing(streamType)
                    : (streamType == mStreamType);
            if (mSeekBar != null && streamMatch && streamValue != -1) {
                final boolean muted = mAudioManager.isStreamMute(mStreamType)
                        || streamValue == 0;
                mUiHandler.postUpdateSlider(streamValue, mLastAudibleStreamVolume, muted);
            }
}

相关类图:我们知道SeekBarVolumizer是一个可以播放Uri并且控制音量的SeekBar。而VolumeSeekBarPrefernce则是一个可以播放Uri并且控制音量的SeekBarPreference。所以这里VolumeSeekBarPreference继承SeekBarPreference代表一种特别的SeekBarPreference,而其“可以播放Uri并且控制音量”这个功能则通过 "has-a" SeekBarVolumizer来实现。



Note for myself:对于Notification图标的修改,需要RingVolumePreferenceController.java中的updatePreferenceIcon(),同时需要修改SeekBarVolumizer.java中收到RingerMode变化广播的时候,更新图标。

else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) {
                if (mNotificationOrRing) {
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SeekBarVolumizer.java是一个用于控制SeekBar音量显示进度的Android代码类资源。 SeekBar是Android中的一个滑动条控件,用于在一定范围内选择一个值。SeekBarVolumizer.java是一个自定义的SeekBar音量调节器,用于控制音量变化并在SeekBar上显示音量的进度。 该类使用了Android的音频管理器(AudioManager)来获取和设置设备的音量。它在SeekBar的进度改变时,通过调用音频管理器的方法来改变设备的音量,并将当前的音量进度显示在SeekBar上。 SeekBarVolumizer.java还实现了SeekBar的监听器接口(OnSeekBarChangeListener),通过重写接口中的方法来响应SeekBar的改变。当SeekBar的进度改变时,SeekBarVolumizer.java会调用接口中的方法来更新音量并在SeekBar上显示新的进度。 除了控制音量和更新进度,SeekBarVolumizer.java还提供了一些额外的功能,如设置音量变化的步长、静音按钮的功能等。 总之,SeekBarVolumizer.java是一个用于控制SeekBar音量显示进度的Android代码类资源。它实现了SeekBar的监听器接口,通过与音频管理器交互实现音量的控制和显示进度的更新。可以方便地应用到Android项目中,为用户提供音量调节的功能。 ### 回答2: SeekBarVolumizer.java 是一个用于在 Android 中显示音量的进度条的代码类资源。 在 Android 中,SeekBar 是一个用户界面控件,用于显示一个水平条,用户可以通过滑动手势来改变进度。SeekBarVolumizer.java 这个类对 SeekBar 进行了封装和扩展,以便在控制音量时更加方便和灵活。 该类的主要功能是将 SeekBar 与系统音量管理器相关联,以便实时获取和设置音量的值。SeekBarVolumizer.java 还实现了音量变化监听器,可以在音量发生变化时执行自定义的操作。 通过 SeekBarVolumizer.java,我们可以实现以下功能: 1. 显示当前音量的进度:SeekBarVolumizer.java 将音量与 SeekBar 进行绑定,通过更新 SeekBar 的进度来显示当前的音量。 2. 改变音量:通过滑动 SeekBar,用户可以实时调整音量的大小。 3. 监听音量变化:SeekBarVolumizer.java 实现了一个监听器,可以在音量发生变化时执行我们自定义的代码,例如在音量变为最大或最小时显示提示信息。 SeekBarVolumizer.java 代码类资源是一个非常有用的工具类,可以方便地处理音量控制功能。在开发 Android 应用中,我们可以利用该类来实现音量的控制、显示和监听操作,提升用户体验。 ### 回答3: SeekbarVolumizer是一个用于控制音量的工具类的Java文件,通常用于在Android应用程序中显示音量的进度,并提供用户交互功能。 SeekbarVolumizer类主要用于管理SeekBar和音量控制的逻辑。它提供了一些基本的方法和功能,例如设置最小值、最大值以及初始音量值。它还可以处理SeekBar的拖动事件,并根据拖动的位置更新音量控制器的值。 在Android应用程序中使用SeekbarVolumizer时,我们需要实例化一个Seekbar控件,并将其与SeekbarVolumizer类进行关联。然后,我们可以通过调用SeekbarVolumizer的方法来设置SeekBar的各种属性,例如设置音量的范围、设置初始音量值等。 在用户与SeekBar交互时,SeekbarVolumizer类会监听SeekBar的拖动事件,并在拖动过程中更新音量控制器的值。当拖动结束时,SeekbarVolumizer还可以触发相应的回调方法,以便我们可以执行一些特定的操作,例如保存用户设置的音量值。 总结来说,SeekbarVolumizer是一个用于显示音量进度、管理音量控制的Java类资源。它与SeekBar控件进行关联,并提供了一些基本的方法和功能,使我们能够方便地在Android应用程序中实现音量控制的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值