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) {
SeekBarVolumizer.java相关推荐
- Android6.0 源码修改之Settings音量调节界面增加通话音量调节
Android6.0 源码修改之Settings音量调节界面增加通话音量调节 前言 今天客户提了个需求,因为我们的设备在正常情况下无法调节通话音量,只有在打电话过程中,按物理音量加减键才能出现调节通话 ...
- 浅析Android情景模式流程
此篇是基于MTK平台Android6.0的.情景模式分析,情景模式就是通常手机里面的"标准""静音""会议""户外"这几 ...
- Android系统修改汇总(MTK)
以下都是基于Android 6.0 的代码去修改的!!! 十四.将桌面workspace.hotseat 大小调整 放大一半 , 这个要根据自己的需求来制定 workspace.setPadding ...
- springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据
SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...
- Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几
Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...
- 在k8s中使用gradle构建java web项目镜像Dockerfile
在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...
- Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常
kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...
- SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos
SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...
- OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3
OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...
最新文章
- Javascript使用三大家族和事件来DIY动画效果相关笔记(一)
- Android10.0 BroadcastCast广播机制原理
- oracle+测试权限,Oracle测试题
- 将用户数据分成一个个数据块传输的优点不包括( )
- python自定义安装哪些不需要_python setup.py配置,用于在自定义目录中安装文件
- Alpha阶段事后分析报告
- Android权限之sharedUserId和签名
- 【JSP】错误页面处理
- 不只是整体OTA,原生全宅智能颠覆了我的想象!
- 西数硬盘刷新固件_机械硬盘选购:SMR避坑指南
- Windows设置自己的程序开机自动启动
- dijkastra算法实践poj2387
- 从最大化复合因子单期IC角度看因子权重
- 怎么用计算机弹植物大战僵尸,[原创] CE基础-自动汇编:植物大战僵尸之子弹回旋...
- WinRAR下载官方免费版
- 2018年总结:向死而生,为爱而活——忆编程青椒的戎马岁月
- SXSSFWorkbook操作Excel表格
- 【2021-09-22 修订】【梳理】计算机网络:自顶向下方法 第二章 应用层(docx)
- bzoj 1941 kd-tree求最大最小曼哈顿距离
- React常见面试题及答案
热门文章
- C语言运算符的优先级和结合
- Excel每隔10行取得一个数字
- python基础(一):python简介
- ABB机器人:工件坐标系介绍以及标定操作与使用方法
- Mac 安装natapp
- JS Knockoutjs 简单使用
- 【genius_platform软件平台开发】第九十四讲:int64_t的格式化问题(lld和PRId64)
- 教你简单4步制作“截图工具”,再也不用微信或QQ截图了
- 关于重定向和服务器转发的知识
- 【Linux学习笔记④】——Shell程序设计【变量 输入与输出 条件表达式 判断语句 循环语句 Shell函数】