安卓4.0.4手机系统增加百分比电量及说明

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

 

许多教程里写的修改“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”

图像 017

省略……

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

实际上反过来写更清楚些 <item android:maxLevel="0" android:drawable="@drawable/stat_sys_battery_0" />

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

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

 

“stat_sys_battery_charge.xml”

图像 016

省略……

同样使用<level-list>,

<animation-list android:oneshot="false"  false表明循环,true表示只运行一次

<item android:duration="2000"   显示的时间,单位为毫秒

当处于充电状态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时则执行下一个<item android:maxLevel="1">的循环。

 

 

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

<?xml version="1.0" encoding="utf-8"?>
<level-list
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/stat_sys_battery_0" android:maxLevel="4" />
    <item android:drawable="@drawable/stat_sys_battery_15" android:maxLevel="15" />
    <item android:drawable="@drawable/stat_sys_battery_28" android:maxLevel="35" />
    <item android:drawable="@drawable/stat_sys_battery_43" android:maxLevel="49" />
    <item android:drawable="@drawable/stat_sys_battery_57" android:maxLevel="60" />
    <item android:drawable="@drawable/stat_sys_battery_71" android:maxLevel="75" />
    <item android:drawable="@drawable/stat_sys_battery_85" android:maxLevel="90" />
    <item android:drawable="@drawable/stat_sys_battery_100" android:maxLevel="100" />
</level-list>

 

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

 

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

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

 

 

 

以下为引用

 

关于</level-list>

 

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

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

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

首先,在res/drawable下建立一个xml文件,内容如下
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:maxLevel="4" android:drawable="@drawable/stat_sys_battery_0" />
    <item android:maxLevel="14" android:drawable="@drawable/stat_sys_battery_10" />
    <item android:maxLevel="29" android:drawable="@drawable/stat_sys_battery_20" />
    <item android:maxLevel="49" android:drawable="@drawable/stat_sys_battery_40" />
    <item android:maxLevel="69" android:drawable="@drawable/stat_sys_battery_60" />
    <item android:maxLevel="89" android:drawable="@drawable/stat_sys_battery_80" />
    <item android:maxLevel="100" android:drawable="@drawable/stat_sys_battery_100" />
</level-list>

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

 

 

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

        Android提供了一种方便的方法level-list标签
    <level-list xmlns:android="http://schemas.android.com/apk/res/android"> 
        <item android:maxLevel="0" android:drawable="@android:color/transparent" /> 
        <item android:maxLevel="1" android:drawable="@drawable/home_arrows_left_1" /> 
        <item android:maxLevel="2" android:drawable="@drawable/home_arrows_left_2" /> 
        <item android:maxLevel="3" android:drawable="@drawable/home_arrows_left_3" /> 
        <item android:maxLevel="4" android:drawable="@drawable/home_arrows_left_4" /> 
    </level-list> 

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

 

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

一、AnimationDrawable

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

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

   <animation-list android:id="selected" android:oneshot="false">

  <item android:drawable="@drawable/cwj0" android:duration="30" />

  <item android:drawable="@drawable/cwj1" android:duration="30" />

  <item android:drawable="@drawable/cwj2" android:duration="30" />

  <item android:drawable="@drawable/cwj3" android:duration="30" />

  <item android:drawable="@drawable/cwj4" android:duration="30" />

  <item android:drawable="@drawable/cwj5" android:duration="30" />

</animation-list>

 
每个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例子,来定义一帧一帧的动画:

<animation-list xmlns:android=”http://schemas.android.com/apk/res/android”
android:oneshot=”true”>
   <item android:drawable=”@drawable/rocket_thrust1″ android:duration=”200″ />
   <item android:drawable=”@drawable/rocket_thrust2″ android:duration=”200″ />
   <item android:drawable=”@drawable/rocket_thrust3″ android:duration=”200″ />
</animation-list>

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

 

 

你可能感兴趣的:(安卓,手机,美化,百分比,电量)