网上关于修改精确百分比电量的帖子多如牛毛,但都过于笼统,授人以鱼不如授人以渔,我再来说上一说

 

许多教程里写的修改“framework-res.apk”是2.x时代的老黄历了,进入4.0以后我们可以直接修改“systemui.apk”来增加百分比电量

反编译后,

要修改的两个文件在“\res\drawable”下,“stat_sys_battery.xml”和“stat_sys_battery_charge.xml”,前者是根据当前电量显示图标,后者是根据充电电量显示图标。

因为已经有前辈为我们写好,所以可以直接拿来替换掉原版里的文件。然后将你选择的200个图标(100个当前电量+100个充电电量)复制到“\res\drawabledrawable-hdpi”目录(480x800分辨率可以使用这个hdpi目录,手机分辨率低的可能要复制到mdpi下)。图标名称要参考上述2个文件。

反编译后将生成apk中的“resources.arsc”和“res目录”以储存方式替换到原systemui.apk中,这样就基本完成了。

 

 

现在我来解释一下

“stat_sys_battery.xml”

安卓4.0.4手机系统增加百分比电量及说明_第1张图片

省略……

xml中使用了标签,Android会根据level的值自动选择对应的图片

实际上反过来写更清楚些

当电量为零时(用maxLevel="0"表示),显示图片资源(用drawable表示)drawable/stat_sys_battery_0。

图片使用png格式,实际为“stat_sys_battery_0.png”。无指定路径,系统会根据手机分辨率自动选择hdpi目录或者是mdip等目录中的文件。

 

“stat_sys_battery_charge.xml”

安卓4.0.4手机系统增加百分比电量及说明_第2张图片

省略……

同样使用,

当处于充电状态android:maxLevel="0"电量为零时,开始显示图片,

2秒drawable/stat_sys_battery_0.png

0.08秒stat_sys_battery_charge_anim1.png

0.08秒drawable/stat_sys_battery_charge_anim2.png

如此循环下去,就变动画了。当电量为1时则执行下一个的循环。

 

 

附上原版systemui.apk里的“stat_sys_battery_charge.xml”


  xmlns:android="http://schemas.android.com/apk/res/android">
   
   
   
   
   
   
   
   

 

只有在电量为4,15,35,49等状态时,才改变图标,现在你应该明白为什么原版没有精确电量了吧。

 

简单的说,每当电量改变的时候系统会发出消息,“我的level变了”,程序根据level值,选择显示图片。

图片可以自己修改,注意名称分辨率格式,.9.png比较特殊,修改前参考网上文章。

 

 

 

以下为引用

 

关于

 

显示不同的图片--level-list
有时候,我们为了在一个p_w_picpath view中显示不同的图片,往往会使用:

if (条件1) {
p_w_picpath.setBackground(R.id.xxx1);
} else if (条件2) {
p_w_picpath.setBackground(R.id.xxx2);
} ...

可以用另一个简便的方法实现相同的功能

首先,在res/drawable下建立一个xml文件,内容如下

   
   
   
   
   
   
   

然后在layout中把p_w_picpath view的src设置成已创建好的xml文件
程序中变换图片时,只需要使用
p_w_picpathview.getDrawable().setLevel(50)
...
Android会根据level的值自动选择对应的图片。显示剩余电量就是用这个方法来显示不同图片的。

 

 

evel-list切换图片技巧
同一个ImageView(或其他组件)切换图片经常会通过代码时间,用if或switch可以轻易的实现切换不同的图片,不过这样并不是太方便

        Android提供了一种方便的方法level-list标签
     
         
         
         
         
         
   
 

        使用时,只需切换level便可实现图片的切换
    p_w_picpathview.getDrawable().setLevel(level);//level是int值,对应level-list里的maxlevel

 

 ------------------------------------------

一、AnimationDrawable

   顾名思义该类主要表示动画的图形类,可以实现逐帧播放的效果,下面代码示例如下

   1. 定义一个cwj_animation.xml 放到res/drawable 目录下,其中定义的属性duration为延时,单位为毫秒,而oneshot属性表示是否仅播放一次,内容为:

   

  

  

  

  

  

  

 
每个item就是一帧,drawable是该帧显示的图片,duration是显示时间,android:oneshot="false"表示动画一直进行,若为true则表示只播放一次动画。

 

前面我们详细介绍了Tween  Aniamation,这节我将介绍另外一种动画Frame Animation。在前面已经说过,Frame Animation是顺序播放事先做好的图像,与电影类似。不同于animation package Android SDK提供了另外一个类AnimationDrawable来定义、使用Frame Animation

Frame Animation可以在XML Resource定义(还是存放到res/anim文件夹下),也可以使用AnimationDrawable中的API定义 由于Tween AnimationFrame Animation有着很大的不同,因此XML定义的格式也完全不一样,其格式是:首先是animation-list根节点,animation- list根节点中包含多个item子节点,每个item节点定义一帧动画:当前帧的drawable资源和当前帧持续的时间。下面对节点的元素加以说明:

XML属性

说明

drawable

当前帧引用的drawable资源

duration

当前帧显示的时间(毫秒为单位)

oneshot

如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。

variablePadding

If true, allows the drawable’s padding to change based on the current state that is selected.

visible

规定drawable的初始可见性,默认为flase

下面就给个具体的XML例子,来定义一帧一帧的动画:

android:oneshot=”true”>
  
  
  

上面的XML就定义了一个Frame Animation,其包含3帧动画,3帧动画中分别应用了drawable中的3张图片:rocket_thrust1rocket_thrust2rocket_thrust3,每帧动画持续200毫秒。