如何在乙個成熟的應用內換膚?

2021-08-14 09:49:52 字數 2728 閱讀 9352

全文無圖,請慎重閱讀,^_^~~~

在16年10月我負責的應用實現了一次夜間模式,那次我基於各種調研結果自己寫了一套換膚框架,開源了一年,也有一些小夥伴用到了這套框架,能給大家提供點便利,還是挺開心的。不過本人懶癌已入膏肓,加上平時業務需求忙不過來,開源的框架的維護並沒做好,大家多多包涵。

部分介面的layoutinflator.createview無法建立,這是建立時沒有context導致的,通過反射設定context解決了此問題,現在不存在include內的布局不能換膚的問題了;

動態addviewattr時沒有對相同屬性做處理,view內可能會記錄多個相同的換膚屬性,換膚時會浪費效能,嚴重的情況下可能會卡死,現在通過map儲存換膚屬性列表,確保乙個屬性名稱只有乙個換膚屬性;

在之前的版本中dynamicattr不能轉存到skinattr中,限制了自定義屬性處理的能力,這次我提供了乙個keepinstance標誌位,如果標誌位為true,則skinattr內會儲存原始的dynamicattr,以此來提公升自定義屬性處理擴充套件性,這下我們可以擴充套件dynamicattr儲存text,換膚時重新設定spanablestring了,具體**不貼了,大家可以到github上去看spannableskinattrhandler類實現;

整合方法之前寫過了,見鏈結,此處略。

qskinloader內對顏色換膚必須使用引用,所以需要梳理產品內所有的顏色使用,全部歸類到xml中定義;不要有color.parsecolor/android.r.color.*之類的使用;建議全域性搜尋字串#、parsecolor、android.r.color等進行替換,也可以用顏色正規表示式,這個網上很多。

梳理專案中所有無用的資源,剔除,包括顏色、drawable、布局等所有資源,這一步能給視覺同事減少很多無用工作量。

如果專案視覺有顏色使用規範的,梳理所有的顏色使用是否符合規範,不符合規範的,和視覺同事一起規整,形成乙個最小的顏色集合,能減少視覺和開發同事對映顏色時的工作量。

視覺同事提供所有在用的顏色對應的換膚顏色,背景色對背景色,文字顏色對文字顏色,前景色對前景色。

將**中所有在用的切片資源打包給視覺同事,視覺同事輸出所有對應的換膚切片,切片大小不能變化。這一步需要注意,可能部分切片是用蒙層來實現換膚的,就不需要輸出對應的換膚切片了。比如夜間模式,有很多切片是可以用蓋蒙層的方案來減少亮度的,就不需要提供對應的夜間模式切片。

如果換膚需要對動態載入的服務端蓋蒙層(比如夜間模式需求需要蓋半透明黑色蒙層減少亮度),建議在xml中將imgeview/imagebutton的定義改為org.qcode.qskinloader.view.shadowimageview,然後加上屬性skin:drawshadow=」@color/night_shadow_color」。注意night_shadow_color的顏色由視覺同事給出,正常模式下值為白色,換膚模式下不支援半透明效果,真正生效的蒙層效果是rgb部分。如果定義為#a5000000,生效的是000000,就看不到啦,我自己也在這被坑過,^_^。

對於使用apk**包的方式,開發同事在**工程中放入所有的對應切片(drawable-xhdpi/drawable-xxdpi等資料夾下一一對應,對應第六步的切片集),對應色值(對應第四步的顏色集),對應color資料夾(res/color下定義的colorstatelist,一般是直接全部複製過去即可),對應drawable資料夾(res/color下定義的各種shape,一般也是直接全部複製過去即可),生成乙個**包;

對於使用前字尾換膚的方式,開發同事按字首拼接好上述資源,存在在對應位置即可;

到這一步後,基本上換膚效果就能展示出來了,不過可能還有很多介面不協調,因為可能我們在**裡動態設定了資源,而這些資源也要通知框架儲存對應換膚屬性。

setimagedrawable

setimageresource

setbackgroundcolor

setbackground

setbackgroundresource

setbackgrounddrawable

settextcolor

attrname定義在skinattrname中,resid就是對應的資源;

呼叫setviewattrs/addviewattrs需要視具體情況而定,如果這個view僅這乙個換膚屬性,則用setviewattrs,否則建議用addviewattrs。

完成前面所有步驟後,整個換膚工作基本已經完成了一大半,但是可能在區域性區域還是無法換膚,一般都是自定義view屬性導致的,此時就進行最後一步任務。

走查各界面,看哪些地方有問題,使用自定義屬性處理器處理。現在的自定義屬性處理器功能還是很強大的:

可以對某個屬性定義一種換膚方式,比如對自定義view的deftextcolor屬性換膚;

也可以對指定view在換膚時執行某個動作,比如recyclerview換膚時清除快取view,或者某個自定義view換膚時執行notifydatasetchanged。

甚至可以同時整合換膚屬性和動作,比如調整spannablestring內的顏色,我們需要解析換膚對應的顏色,並執行動作settext來換膚。

這就是我兩次整合夜間模式形成的乙個總結,算是乙個規範流程,按照這套方法整合qskinloader,工作量評估會更加準確,工作流程也更加清晰,不過還要注意一點:如果有多位開發同事一起處理第十步的時候,怎麼劃分模組,減少**提交衝突,需要額外思考。

eh~~, that is all, thanks for reading!

如何在一周內摸清乙個行業?

第一期 諮詢公司的人如何在一周內摸清乙個行業 了解乙個行業 這件事本身不太可能快速完成。不過,如果我們只是想摸清楚最基本的情況,我們可以通過問對幾個關鍵問題著手。這些關鍵問題圍繞著乙個根本問題 這個行業的鏈條是如何運轉起來的?1 這個行業的存在是因為它提供了什麼價值?2 這個行業從源頭到終點都有哪些...

如何製作乙個簡單的換膚功能

每一次的切換就會更改掉本地資訊,就不會因為重新整理而導致背景還原成預設狀態 但是!在這裡要注意一點就是,如果最開始沒有設定風格,就應該預設個預設樣式,通過查詢本地是否儲存的有該資料,如果沒有則使用預設的樣式 html 1 doctype html 2 html 3 head 4 meta chars...

成熟的乙個標誌

懂不懂得更多地替他人考慮,這是成不成熟的乙個重要標誌。沒有多少替他人考慮的意識,以自我為中心,自己是開心了,可他人的感受卻未必開心,甚至相反,也許是無心的,但這樣的行為不受歡迎卻在情理之中,人不受歡迎也就怨不得別人 有意識地替他人考慮,是明白了人與人在相處時都需要被尊重,被關照,滿足自己的同時,最低...