第一部分,關(guān)于代碼的 我們首先看一下系統(tǒng)原代碼: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./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> 當(dāng)然,這個代碼還沒結(jié)束,只是前面一部分,但是我們只需要關(guān)注前面一部分就可以了。起始行和結(jié)束行,我分別用同樣的顏色標(biāo)注。從顏色標(biāo)注,我們可以看到這段代碼大體框架。 這段代碼就是描述狀態(tài)欄的,1為一個框架,1這個框架里面包含1.1 1.2兩個主要框架以及時間等次要框架。 具體怎么看框架里面的內(nèi)容,我現(xiàn)在開始描述。大家或多或少都懂點英文,但是,如果只懂一點點和我一樣的話,那么很容易被迷惑。每一行代碼具體是描述什么的,要看android:id=""這個單詞的內(nèi)容。于是我們可以容易看出1.1第一句text部分是描述運營商的,橙色區(qū)域是描述通知圖標(biāo)等內(nèi)容。1.2前面那部分是描述網(wǎng)速,網(wǎng)速后面跟著的是鬧鐘藍(lán)牙等圖標(biāo)。1.2是描述信號,以及電池。1.2后面部分是描述時鐘。 這樣,整體布局我們就能看出來了。 至于沒一句里面的代碼,用法,需要注意的,其實我懂得的也不多。我大概知道 gravity=是子組件位置,比如gravity=center意思是居中。gravity= 和 layout gravity=的區(qū)別是前者是內(nèi)容居中,后者是位置相對于父組件居中。具體想了解更多,還是問百度。我只是寫一個簡單教程讓大家理解,方便大家研究,給大家鋪路。我沒有把握完全教會大家。 每個代碼的用法,網(wǎng)上都可以百度的到。 然后我給大家講一下我的思路,也許你有更好的思路。但是我的思路只是供給你參考。是我最新代碼的思路。 要想完美更改,就需要重新布局。之前很多人做過時間居中補丁。但是我看過,那個只是把時間單獨提出來作為一個獨立框架,并行于總框架。居中是沒問題,可能有通知之類的會有重影。按照我的思路居中的話,不會重影。圖標(biāo)多到一定數(shù)量到達(dá)相關(guān)位置會變成省略號。 我的構(gòu)思是重新布局,時間不要提出來,放到正中。這中間就會涉及一個比例問題,如果不做比例的話,就會變成這個樣子: 雖然你代碼寫居中了,但是時間居中不了。所以要做比例。 我的構(gòu)思是,把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”就是表示比例的。數(shù)值越小,優(yōu)先級越大。昨天我做測試的時候,在這里 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",但是沒用,結(jié)果變成這個樣子: 所以在使用layout_weight=比例的時候,要注意,layout_width="wrap_conten"改成layout_width="0dip"這樣才能保持比例。 相對這些來說,信號居左就簡單多了。我們把1.2里面的id=signal_cluster_view 這部分內(nèi)容提取出來,放到1.1里面,提取的時候注意不要破壞語法結(jié)構(gòu)。這樣,信號就放到左邊了。同時為了保持比例,除了時間放到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./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> 大家可以看到,我的代碼之中,而是把整個狀態(tài)欄分成三個布局。然后把每個元素嵌入到里面。其實這些東西之所以難,主要一個是結(jié)構(gòu),對于我們這些新手來說,看不懂,看懂了也就好說了。另外一個,就是注意語法。語法是最關(guān)鍵的,但是這里面涉及太多,一個教程寫不完。而我們的目的只是學(xué)會改。最簡單應(yīng)該知道的語法錯誤不要犯的就是,代碼通常 不論以什么開始,結(jié)束時必然要有"/"。 如果沒有,那么語法不完整。一行最后有"/"那么這一行本身就是一句完整代碼。如果沒有“/”,那么我們就要找下一個"/"在哪,找到了,可能一句,可能兩句也可能下一個“/”在好幾個完整語句的后面,所以這個是首先注意不要犯的錯誤。 把結(jié)構(gòu)弄明白了 ,每句代碼大概知道是干什么的,然后把握關(guān)鍵詞,比如gratity=是關(guān)于位置的,比如paddingRight="6.0dip"是距離右邊6個像素的位置等等。這些就問百度。不要讓這些駁雜的東西占據(jù)教程,不然你們也沒耐心看完。 我然后我再說一個就是,大家仔細(xì)看就會注意到,我的代碼里少了一句: <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一樣還是在信號左邊,不會跑到運營商旁邊,達(dá)不到我們想要的效果。如果要wifi放到運營商右邊,我們還需要修改signal_cluster_view.xml這個文件。這個文件是關(guān)于信號。我們要想wifi在運營商右邊,就需要把運營商放到信號里面作為一只整體。 具體怎么修改,相信大家如果認(rèn)真仔細(xì)看完并且理解了我前面的內(nèi)容,那么你就知道怎么改了。為了方便大家研究,我把系統(tǒng)源碼和我修改后的代碼做成附件給大家研究。 系統(tǒng)源碼.rar (1.85 KB, 下載次數(shù): 219) 修改代碼.rar (1.94 KB, 下載次數(shù): 484) 大家解壓縮兩個文件,修改代碼我沒改文件名,1是修改statu_bar.xml的代碼,2是修改signal_cluster_view.xml的。代碼只是給你們參詳?shù)?,不是讓你們直接拿去使用的,如果直接拿去使用遇到任何BUG ,本作者不負(fù)任何責(zé)任。因為教程我已經(jīng)寫了。另外,我也說了,我寫教程只是鋪路,每個人理解多少,是你們自己的造化。我也是新手。而且這里面涉及內(nèi)容太多,根本無法寫出一篇完整的讓每個人都明白的教程。 你們自己需要做的就是去百度語法,修改位置的時候不要出錯。 代碼做完剩下的就是反編譯了 。 本來反編譯如果不明白的你們應(yīng)該百度 ,畢竟每個人用的軟件不一樣。所以教程也不一樣。但是我怕被人噴,最郁悶的就是我們這些人辛苦研究點東西分享,但是哪里分享的不全面就會被噴。 反編譯我就簡單說幾點注意的,反編譯的時候注意加載framework-res.apk 和framework-miui-res.apk。 回編譯后,反編譯的miuisystemui文件夾里有個dist文件夾,那里面的apk才是回編譯好的。但是回編譯的不能直接使用 ,要把里面修改過的xml文件和recources.arsc替換到?jīng)]有反編譯過的里面。然后用修改過原miuisystemui.apk這個才是補丁 替換用zip打開兩個apk文件,用回編過的拖到未編過的,壓縮方式選擇存儲。 回編失敗檢查是否代碼有問題,如果沒問題,就檢查是否其他問題。這里建議大家修改以前測試一下反編譯不做任何修改能否回編成功。 最后再總結(jié)說一句,我的教程,不能幫助大家完全學(xué)會,只能幫助大家更容易的理解看懂代碼。并且用我成功的案例,帶給你們經(jīng)驗給你們參詳。你們所要做的就是百度語法結(jié)構(gòu),注意修改時不要出錯。畢竟我從完全不會,到學(xué)做主題到現(xiàn)在學(xué)會代碼 ,也全靠論壇,百度更多的還是自己的琢磨。大神們時間精力有限,也只能提供很少的幫助給我。但是我還是研究會了。我能做到的,相信你們也能做到。 最后,發(fā)個廣告。我的新軍迷和低調(diào)上線了,一款收費一款免費,還請大家支持。雖然我當(dāng)時發(fā)布的時候說是米2專用,但是審核組不允許,一再審核失敗,又不斷修改完善。結(jié)果專用主題,其實兼容其他機型。 相信大家學(xué)會并且理解我的教程后,也許很快,你們發(fā)揮你們的想象力,論壇會出現(xiàn)各種各樣的狀態(tài)欄秀了。 |
|