您的位置:首页 > 其它

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

2012-12-04 13:44 766 查看
网上关于修改精确百分比电量的帖子多如牛毛,但都过于笼统,授人以鱼不如授人以渔,我再来说上一说

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





省略……

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”





省略……

同样使用<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 Animation与Frame 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_thrust1,rocket_thrust2,rocket_thrust3,每帧动画持续200毫秒。

本文出自 “一样” 博客,请务必保留此出处/article/4636959.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: