每一个不曾起舞的日子,都是对生命的辜负。—–尼采
最近关注功耗问题,顺便看了下Settings模块中Battery界面。这块的UI还是写的挺不错的,在此分享下。
Battery界面分析
下图是我在看该界面时,脑中的一些疑惑点。
上图列出的三大块疑问,正是引起我好奇心的地方。先来一个一个说下当初自己想的实现方式。
- battery saver的跳转处理:这个界面跳转肯定是Preference里面弄个android:fragment属性,把跳转的fragment设置进来的,其中的Summary内容在跳转回来后会变动,那么这里实际上就是两个fragment之前通信问题,应该是接口回调实现的。
- 电量曲线的显示:这个是勾起我好奇心的罪魁祸首。整个界面是由Preference构建的,系统的Preference肯定实现不了这种效果,那么应该是自定义了一个Preference然后嵌套进来的。还没撸过自定义Preference,而且这个view还有点小复杂呢,曲线用path就可以搞定,关键是下方的渐变效果怎么搞呢?LinearGradient到是可以,但它填充规则图形还好用,电量曲线变化多端,如何保证曲线下方全部着上渐变色,上方空白呢?难道挨个计算曲线上的点,然后连接到底部,用LinearGradient着色?真要这样搞计算量有点大啊。
- 耗电排行的显示: 电量统计的数据肯定由系统接口上报,有个listpreference貌似可以将list嵌套在perference里呢,百度以下我应该就知道。
以上是我看到这个界面的一些想法。带着这点好奇心,来观摩下源码是如何给我解释的。
Battery界面如何实现
battery saver的跳转处理
packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageSummary.java,
该类为Battery界面的主类。它继承至PreferenceFragment.要想见识下Preference的各种花式用法,源码中的Settings模块绝对是不二选择。
找到其加载的xml文件。
packages/apps/Settings/res/xml/power_usage_summary.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
android:title="@string/power_usage_summary_title"
settings:keywords="@string/keywords_battery">
<com.android.settings.fuelgauge.BatterySaverPreference
android:title="@string/battery_saver"
android:fragment="com.android.settings.fuelgauge.BatterySaverSettings" />
<SwitchPreference
android:key="battery_pct"
android:title="@string/show_battery_percentage"
android:summary="@string/show_battery_percentage_summary"
android:persistent="false" />
<com.android.settings.fuelgauge.BatteryHistoryPreference
android:key="battery_history" />
<PreferenceCategory
android:key="app_list"
android:title="@string/power_usage_list_summary" />
</PreferenceScreen>
本小节我们关注的是BatterySaverPreference。没有悬念的用了
android:fragment="com.android.settings.fuelgauge.BatterySaverSettings"
将点击跳转的BatterySaverSettings引入进来。它自身自定义了BatterySaverPreference,注意到xml里只申明了title跟fragment,缺少了summary属性,看看自定义的BatterySaverPreference是如何处理summary更新请求的。
packages/apps/Settings/src/com/android/settings/fuelgauge/BatterySaverPreference.java
public