最近在定制Android系统音量条,发现代码还是蛮多的,下面总结一下。
创新互联公司凭借在网站建设、网站推广领域领先的技术能力和多年的行业经验,为客户提供超值的营销型网站建设服务,我们始终认为:好的营销型网站就是好的业务员。我们已成功为企业单位、个人等客户提供了成都网站设计、网站制作服务,以良好的商业信誉,完善的服务及深厚的技术力量处于同行领先地位。代码是基于5.1.1版本的。
系统音量条的代码是在/frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
布局文件是在/frameworks/base/packages/SystemUI/res/layout下。
先看看原生的音量条样式:
在代码中可以发现volume_dialog.xml这个文件,这个文件就是承载音量条的布局了,在layout文件夹找到打开会发现这个布局很简单,只是include了一个volume_panel。
volume_panel布局包含了一个id叫slider_panel的FrameLayout和include了一个zen_mode_panel,显然slider_panel后面会包含seekbar,看VolumePanel.java也会发现在代码中加载了volume_panel_item.xml这个文件,一看,发现里面就包含了seekbar这个控件啦。另外zen_mode_panel是指勿扰模式。
在看这个布局文件的时候,你会看到android:clipChildren
这个属性,它的作用:是否限制子View在其范围内,我们将其值设置为false后那么当子控件的高度高于父控件时也会完全显示,而不会被压缩。默认为true。
若想某个控件不显示,设置属性android:visibility=”gone”
就好了。
看完布局,下面就主要看VolumePanel.java这个文件了。
VolumePanel下定义了两个重要的子类型,分别是StreamResources和StreamControl。StreamResources实际上是一个枚举,它的每一个可用元素保存了一个流类型的通知框所需要的各种资源,如图标、提示文字等。StreamResources的定义就像下面这样:
private enum StreamResources { BluetoothSCOStream(AudioManager.STREAM_BLUETOOTH_SCO, R.string.volume_icon_description_bluetooth, IC_AUDIO_BT, IC_AUDIO_BT_MUTE, false), // 这里省略了后面的几个枚举项的构造参数,这些与BluetoothSCOStream的内容是一致的 RingerStream(...), VoiceStream(...), AlarmStream(...), MediaStream(...), NotificationStream(...), // for now, use media resources for master volume MasterStream(...), RemoteStream(...);// will be dynamically updated int streamType; // 流类型 int descRes; // 描述信息 int iconRes; // 图标 int iconMuteRes; // 静音图标 // RING, VOICE_CALL & BLUETOOTH_SCO are hidden unless explicitly requested boolean show; // 是否显示 //构造函数 StreamResources(int streamType, int descRes, int iconRes, int iconMuteRes, boolean show) { ... } }