第一部分,关于代码的
我们首先看一下系统原代码:1,statu_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<com.android.systemui.statusbar.phone.PhoneStatusBarView android:id="@id/status_bar" android:background="@drawable/status_bar_background" android:focusable="true" android:fitsSystemWindows="true" android:descendantFocusability="afterDescendants"
xmlns:android="http://schemas.android.com/apk/res/android">
<com.android.systemui.TorchServiceView android:layout_gravity="top|left|center" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:foreground="#ff000000" />
<com.android.systemui.statusbar.phone.BatteryIndicator android:layout_gravity="top" android:id="@id/battery_indicator" android:visibility="gone" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/battery_indicator" android:scaleType="fitXY" />
<com.android.systemui.statusbar.phone.BatteryIndicatorCharging android:layout_gravity="top|right|center" android:id="@id/battery_indicator_charging" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/battery_indicator_charging" />
<ImageView android:id="@id/notification_lights_out" android:paddingLeft="6.0dip" android:paddingBottom="2.0dip" android:visibility="gone" android:layout_width="@dimen/status_bar_icon_size" android:layout_height="fill_parent" android:src="@drawable/ic_sysbar_lights_out_dot_small" android:scaleType="center" />
1 <LinearLayout android:orientation="horizontal" android:id="@id/icons" android:paddingLeft="6.0dip" android:paddingRight="6.0dip" android:layout_width="fill_parent" android:layout_height="fill_parent">
1. 1 <LinearLayout android:paddingRight="6.0dip" android:layout_width="0.0dip" android:layout_height="fill_parent" android:layout_weight="1.0">
<TextView android:textAppearance="@style/TextAppearance.StatusBar.Clock" android:gravity="left|center" android:id="@id/carrier" android:layout_width="wrap_content" android:layout_height="fill_parent" android:singleLine="true" />
<LinearLayout android:id="@id/notification_icon_area" android:layout_width="wrap_content" android:layout_height="fill_parent">
<com.android.systemui.statusbar.StatusBarIconView android:id="@id/moreIcon" android:visibility="gone" android:layout_width="@dimen/status_bar_icon_size" android:layout_height="fill_parent" android:src="@drawable/stat_notify_more" />
<com.android.systemui.statusbar.phone.IconMerger android:gravity="center_vertical" android:orientation="horizontal" android:id="@id/notificationIcons" android:layout_width="wrap_content" android:layout_height="fill_parent" />
</LinearLayout>
1.1 </LinearLayout>
<com.android.systemui.statusbar.NetworkSpeedView android:textAppearance="@style/TextAppearance.StatusBar.Clock" android:gravity="right|center" android:id="@id/network_speed_view" android:visibility="gone" android:layout_width="@dimen/status_bar_network_speed_width" android:layout_height="fill_parent" android:layout_marginRight="4.0dip" />
<LinearLayout android:gravity="center_vertical" android:orientation="horizontal" android:id="@id/statusIcons" android:layout_width="wrap_content" android:layout_height="fill_parent" />
1.2 <LinearLayout android:gravity="center" android:orientation="horizontal" android:id="@id/signal_battery_cluster" android:layout_width="wrap_content" android:layout_height="fill_parent">
<include android:id="@id/signal_cluster" android:layout_width="wrap_content" android:layout_height="wrap_content" layout="@layout/signal_cluster_view" />
<com.android.systemui.statusbar.phone.BatteryStatusIconView android:id="@id/battery" android:layout_width="wrap_content" android:layout_height="wrap_content" />
1.2 </LinearLayout>
<com.android.systemui.statusbar.policy.Clock android:textAppearance="@style/TextAppearance.StatusBar.Clock" android:gravity="left|center" android:id="@id/clock" android:paddingTop="1.0dip" android:layout_width="wrap_content" android:layout_height="fill_parent" android:singleLine="true" />
1 </LinearLayout>当然,这个代码还没结束,只是前面一部分,但是我们只需要关注前面一部分就可以了。起始行和结束行,我分别用同样的颜色标注。从颜色标注,我们可以看到这段代码大体框架。
这段代码就是描述状态栏的,1为一个框架,1这个框架里面包含1.1 1.2两个主要框架以及时间等次要框架。
具体怎么看框架里面的内容,我现在开始描述。大家或多或少都懂点英文,但是,如果只懂一点点和我一样的话,那么很容易被迷惑。每一行代码具体是描述什么的,要看android:id=""这个单词的内容。于是我们可以容易看出1.1第一句text部分是描述运营商的,橙色区域是描述通知图标等内容。1.2前面那部分是描述网速,网速后面跟着的是闹钟蓝牙等图标。1.2是描述信号,以及电池。1.2后面部分是描述时钟。
这样,整体布局我们就能看出来了。
至于没一句里面的代码,用法,需要注意的,其实我懂得的也不多。我大概知道 gravity=是子组件位置,比如gravity=center意思是居中。gravity= 和 layout gravity=的区别是前者是内容居中,后者是位置相对于父组件居中。具体想了解更多,还是问百度。我只是写一个简单教程让大家理解,方便大家研究,给大家铺路。我没有把握完全教会大家。
每个代码的用法,网上都可以百度的到。
然后我给大家讲一下我的思路,也许你有更好的思路。但是我的思路只是供给你参考。是我最新代码的思路。
要想完美更改,就需要重新布局。之前很多人做过时间居中补丁。但是我看过,那个只是把时间单独提出来作为一个独立框架,并行于总框架。居中是没问题,可能有通知之类的会有重影。按照我的思路居中的话,不会重影。图标多到一定数量到达相关位置会变成省略号。
我的构思是重新布局,时间不要提出来,放到正中。这中间就会涉及一个比例问题,如果不做比例的话,就会变成这个样子:
虽然你代码写居中了,但是时间居中不了。所以要做比例。
我的构思是,把1.1 和1.2做成相同比例,然后时间放中间。这样就不会出差错了。
大家看这一句:
1. 1 <LinearLayout android:paddingRight="6.0dip" android:layout_width="0.0dip" android:layout_height="fill_parent" android:layout_weight="1.0">其中,layout_weight=“1.0”就是表示比例的。数值越小,优先级越大。昨天我做测试的时候,在这里
1.2 <LinearLayout android:gravity="center" android:orientation="horizontal" android:id="@id/signal_battery_cluster" android:layout_width="wrap_content" android:layout_height="fill_parent">
加入了layout_weight="1.0",但是没用,结果变成这个样子:
所以在使用layout_weight=比例的时候,要注意,layout_width="wrap_conten"改成layout_width="0dip"这样才能保持比例。
相对这些来说,信号居左就简单多了。我们把1.2里面的id=signal_cluster_view 这部分内容提取出来,放到1.1里面,提取的时候注意不要破坏语法结构。这样,信号就放到左边了。同时为了保持比例,除了时间放到1.1 1.2中间,其他的 左边的放到左边框架里,右边的放到右边的框架里。那么布局就完成了。下面我放出我修改后的代码给大家对比参详:
<?xml version="1.0" encoding="utf-8"?>
<com.android.systemui.statusbar.phone.PhoneStatusBarView android:id="@id/status_bar" android:background="@drawable/status_bar_background" android:focusable="true" android:fitsSystemWindows="true" android:descendantFocusability="afterDescendants"
xmlns:android="http://schemas.android.com/apk/res/android">
<com.android.systemui.TorchServiceView android:layout_gravity="top|left|center" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:foreground="#ff000000" />
<com.android.systemui.statusbar.phone.BatteryIndicator android:layout_gravity="top" android:id="@id/battery_indicator" android:visibility="gone" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/battery_indicator" android:scaleType="fitXY" />
<com.android.systemui.statusbar.phone.BatteryIndicatorCharging android:layout_gravity="top|right|center" android:id="@id/battery_indicator_charging" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/battery_indicator_charging" />
<ImageView android:id="@id/notification_lights_out" android:paddingLeft="6.0dip" android:paddingBottom="2.0dip" android:visibility="gone" android:layout_width="@dimen/status_bar_icon_size" android:layout_height="fill_parent" android:src="@drawable/ic_sysbar_lights_out_dot_small" android:scaleType="center" />
1<LinearLayout android:orientation="horizontal" android:id="@id/icons" android:paddingLeft="6.0dip" android:paddingRight="6.0dip" android:layout_width="fill_parent" android:layout_height="fill_parent">
1.1<LinearLayout android:gravity="left" android:paddingRight="6.0dip" android:layout_width="0dip" android:layout_height="fill_parent" android:layout_weight="1.0">
<LinearLayout android:gravity="left" android:id="@id/signal_battery_cluster" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="fill_parent">
<include android:id="@id/signal_cluster" android:layout_width="wrap_content" android:layout_height="wrap_content" layout="@layout/signal_cluster_view" />
</LinearLayout>
<LinearLayout android:id="@id/notification_icon_area" android:layout_width="wrap_content" android:layout_height="fill_parent">
<com.android.systemui.statusbar.StatusBarIconView android:id="@id/moreIcon" android:visibility="gone" android:layout_width="@dimen/status_bar_icon_size" android:layout_height="fill_parent" android:src="@drawable/stat_notify_more" />
<com.android.systemui.statusbar.phone.IconMerger android:gravity="center_vertical" android:orientation="horizontal" android:id="@id/notificationIcons" android:layout_width="wrap_content" android:layout_height="fill_parent" />
</LinearLayout>
</LinearLayout>
1.2 <LinearLayout android:layout_gravity="center" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="fill_parent">
<com.android.systemui.statusbar.policy.Clock android:textAppearance="@style/TextAppearance.StatusBar.Clock" android:gravity="center" android:id="@id/clock" android:paddingTop="1.0dip" android:layout_width="wrap_content" android:layout_height="fill_parent" android:singleLine="true" />
</LinearLayout>
1.3 <LinearLayout android:gravity="right" android:orientation="horizontal" android:layout_width="0dip" android:layout_height="fill_parent" android:layout_weight="1.0">
<com.android.systemui.statusbar.NetworkSpeedView android:textAppearance="@style/TextAppearance.StatusBar.Clock" android:gravity="right|center" android:id="@id/network_speed_view" android:visibility="gone" android:layout_width="@dimen/status_bar_network_speed_width" android:layout_height="fill_parent" android:layout_marginRight="4.0dip" />
<LinearLayout android:gravity="center_vertical" android:orientation="horizontal" android:id="@id/statusIcons" android:layout_width="wrap_content" android:layout_height="fill_parent" />
<com.android.systemui.statusbar.phone.BatteryStatusIconView android:id="@id/battery" android:layout_width="wrap_content" android:layout_height="wrap_content" />
</LinearLayout>
1</LinearLayout>
大家可以看到,我的代码之中,而是把整个状态栏分成三个布局。然后把每个元素嵌入到里面。其实这些东西之所以难,主要一个是结构,对于我们这些新手来说,看不懂,看懂了也就好说了。另外一个,就是注意语法。语法是最关键的,但是这里面涉及太多,一个教程写不完。而我们的目的只是学会改。最简单应该知道的语法错误不要犯的就是,代码通常 不论以什么开始,结束时必然要有"/"。 如果没有,那么语法不完整。一行最后有"/"那么这一行本身就是一句完整代码。如果没有“/”,那么我们就要找下一个"/"在哪,找到了,可能一句,可能两句也可能下一个“/”在好几个完整语句的后面,所以这个是首先注意不要犯的错误。
把结构弄明白了 ,每句代码大概知道是干什么的,然后把握关键词,比如gratity=是关于位置的,比如paddingRight="6.0dip"是距离右边6个像素的位置等等。这些就问百度。不要让这些驳杂的东西占据教程,不然你们也没耐心看完。
我然后我再说一个就是,大家仔细看就会注意到,我的代码里少了一句:
<TextView android:textAppearance="@style/TextAppearance.StatusBar.Clock" android:gravity="left|center" android:id="@id/carrier" android:layout_width="wrap_content" android:layout_height="fill_parent" android:singleLine="true" />
这一句是描述运营商的,那么为什么少了这一句呢?我的运营商跑哪了?这就涉及到另一个问题。如果放着这一句,那么,信号是居左了,wifi一样还是在信号左边,不会跑到运营商旁边,达不到我们想要的效果。如果要wifi放到运营商右边,我们还需要修改signal_cluster_view.xml这个文件。这个文件是关于信号。我们要想wifi在运营商右边,就需要把运营商放到信号里面作为一只整体。
具体怎么修改,相信大家如果认真仔细看完并且理解了我前面的内容,那么你就知道怎么改了。为了方便大家研究,我把系统源码和我修改后的代码做成附件给大家研究。
系统源码.rar
(1.85 KB, 下载次数: 219)
修改代码.rar
(1.94 KB, 下载次数: 484)
大家解压缩两个文件,修改代码我没改文件名,1是修改statu_bar.xml的代码,2是修改signal_cluster_view.xml的。代码只是给你们参详的 ,不是让你们直接拿去使用的,如果直接拿去使用遇到任何BUG ,本作者不负任何责任。因为教程我已经写了。另外,我也说了,我写教程只是铺路,每个人理解多少,是你们自己的造化。我也是新手。而且这里面涉及内容太多,根本无法写出一篇完整的让每个人都明白的教程。
你们自己需要做的就是去百度语法,修改位置的时候不要出错。
代码做完剩下的就是反编译了 。
本来反编译如果不明白的你们应该百度 ,毕竟每个人用的软件不一样。所以教程也不一样。但是我怕被人喷,最郁闷的就是我们这些人辛苦研究点东西分享,但是哪里分享的不全面就会被喷。
反编译我就简单说几点注意的,反编译的时候注意加载framework-res.apk 和framework-miui-res.apk。
回编译后,反编译的miuisystemui文件夹里有个dist文件夹,那里面的apk才是回编译好的。但是回编译的不能直接使用 ,要把里面修改过的xml文件和recources.arsc替换到没有反编译过的里面。然后用修改过原miuisystemui.apk这个才是补丁
替换用zip打开两个apk文件,用回编过的拖到未编过的,压缩方式选择存储。
回编失败检查是否代码有问题,如果没问题,就检查是否其他问题。这里建议大家修改以前测试一下反编译不做任何修改能否回编成功。
最后再总结说一句,我的教程,不能帮助大家完全学会,只能帮助大家更容易的理解看懂代码。并且用我成功的案例,带给你们经验给你们参详。你们所要做的就是百度语法结构,注意修改时不要出错。毕竟我从完全不会,到学做主题到现在学会代码 ,也全靠论坛,百度更多的还是自己的琢磨。大神们时间精力有限,也只能提供很少的帮助给我。但是我还是研究会了。我能做到的,相信你们也能做到。
最后,发个广告。我的新军迷和低调上线了,一款收费一款免费,还请大家支持。虽然我当时发布的时候说是米2专用,但是审核组不允许,一再审核失败,又不断修改完善。结果专用主题,其实兼容其他机型。
相信大家学会并且理解我的教程后,也许很快,你们发挥你们的想象力,论坛会出现各种各样的状态栏秀了。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。