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