从类的名字上看,这个类应该是一个音量的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) {

SeekBarVolumizer.java相关推荐

  1. Android6.0 源码修改之Settings音量调节界面增加通话音量调节

    Android6.0 源码修改之Settings音量调节界面增加通话音量调节 前言 今天客户提了个需求,因为我们的设备在正常情况下无法调节通话音量,只有在打电话过程中,按物理音量加减键才能出现调节通话 ...

  2. 浅析Android情景模式流程

    此篇是基于MTK平台Android6.0的.情景模式分析,情景模式就是通常手机里面的"标准""静音""会议""户外"这几 ...

  3. Android系统修改汇总(MTK)

    以下都是基于Android 6.0 的代码去修改的!!! 十四.将桌面workspace.hotseat 大小调整 放大一半 , 这个要根据自己的需求来制定  workspace.setPadding ...

  4. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  5. Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几

    Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...

  6. 在k8s中使用gradle构建java web项目镜像Dockerfile

    在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...

  7. Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常

    kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...

  8. SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos

    SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...

  9. OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3

    OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...

最新文章

  1. Javascript使用三大家族和事件来DIY动画效果相关笔记(一)
  2. Android10.0 BroadcastCast广播机制原理
  3. oracle+测试权限,Oracle测试题
  4. 将用户数据分成一个个数据块传输的优点不包括( )
  5. python自定义安装哪些不需要_python setup.py配置,用于在自定义目录中安装文件
  6. Alpha阶段事后分析报告
  7. Android权限之sharedUserId和签名
  8. 【JSP】错误页面处理
  9. 不只是整体OTA,原生全宅智能颠覆了我的想象!
  10. 西数硬盘刷新固件_机械硬盘选购:SMR避坑指南
  11. Windows设置自己的程序开机自动启动
  12. dijkastra算法实践poj2387
  13. 从最大化复合因子单期IC角度看因子权重
  14. 怎么用计算机弹植物大战僵尸,[原创] CE基础-自动汇编:植物大战僵尸之子弹回旋...
  15. WinRAR下载官方免费版
  16. 2018年总结:向死而生,为爱而活——忆编程青椒的戎马岁月
  17. SXSSFWorkbook操作Excel表格
  18. 【2021-09-22 修订】【梳理】计算机网络:自顶向下方法 第二章 应用层(docx)
  19. bzoj 1941 kd-tree求最大最小曼哈顿距离
  20. React常见面试题及答案

热门文章

  1. C语言运算符的优先级和结合
  2. Excel每隔10行取得一个数字
  3. python基础(一):python简介
  4. ABB机器人:工件坐标系介绍以及标定操作与使用方法
  5. Mac 安装natapp
  6. JS Knockoutjs 简单使用
  7. 【genius_platform软件平台开发】第九十四讲:int64_t的格式化问题(lld和PRId64)
  8. 教你简单4步制作“截图工具”,再也不用微信或QQ截图了
  9. 关于重定向和服务器转发的知识
  10. 【Linux学习笔记④】——Shell程序设计【变量 输入与输出 条件表达式 判断语句 循环语句 Shell函数】