前兩節(jié)中多次提到蜻牢,不管使用什么,都盡量包裝一下偏陪,以避免突發(fā)性的需求抢呆,在APP中,UI組件的位置也是重中之重笛谦,比如Button抱虐、TextView、EditText饥脑、ImageView梯码、ListView等控件,是最基本最常用的好啰,那么我們最好也包裝一下轩娶。
舉個(gè)粟子:之前開發(fā)過一款產(chǎn)品,代碼量也是比較大框往,所有UI控件都沒有做過任何加工鳄抒,突然有一天需求來了,所有字體都要換椰弊。Button许溅、TextView、EditText的使用量在任何一款產(chǎn)品上都可想而知秉版。
最傻瓜的辦法贤重,所有都寫上一遍,或者用Style統(tǒng)一清焕,這樣帶來的是工作量巨大并蝗;
第二種辦法,通過根節(jié)點(diǎn)遍歷所有View替換秸妥,這樣對(duì)性能有影響滚停;
第三種辦法,使用LayoutInflaterCompat.setFactory方法做替換粥惧,原理跟方法二差不多键畴,同樣是需要判斷再替換,不同的是LayoutInflater是View創(chuàng)建的根本突雪,不需要再次遍歷起惕;
第四種辦法涡贱,創(chuàng)建一個(gè)子類,所有的組件都使用子類代替惹想。
因?yàn)槌杀締栴}盼产,我選擇了第三種方案。但是從那之后勺馆,我不管做什么項(xiàng)目戏售,都會(huì)使用第四種辦法做為基礎(chǔ)建設(shè),以防止某一天產(chǎn)品提出的某些奇奇怪怪的需求草穆。
文件說明:
在widget目錄下灌灾,創(chuàng)建MButton、MEditText悲柱、MTextView等3個(gè)文件锋喜,分別繼承Button、EditText豌鸡、TextView嘿般,因?yàn)楝F(xiàn)在沒有特殊需求,所以直接復(fù)寫一下構(gòu)造函數(shù)即可涯冠。在使用時(shí)炉奴,我們可以直接使用這些組件,做為基礎(chǔ)搭建蛇更。
這里要說明一下ImageView瞻赶,圖片View我們選擇Facebook開源的Fresco,這款開源的圖片加載器派任,是筆者至今最忠愛的開源Code之一砸逊。優(yōu)勢(shì)太多,不清楚的朋友可以自己了解一下官方說明掌逛,缺點(diǎn)就是工程比較龐大师逸,占用APK的體積較大。
創(chuàng)建MImageView類豆混,代碼如下
public class MImageView extends SimpleDraweeView {
public MImageView(Context context, GenericDraweeHierarchy hierarchy) {
super(context, hierarchy);
}
public MImageView(Context context) {
super(context);
}
public MImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public void setImageURI(Uri uri) {
super.setImageURI(uri);
}
@Override
public void setImageURI(String uriString) {
super.setImageURI(uriString);
}
@Override
public void setImageResource(int resId) {
super.setImageResource(resId);
}
public void setImageFile(File file) {
if (file == null || !file.exists()) return;
setImageFile(file.getAbsolutePath());
}
public void setImageFile(String path) {
setImageURI(Uri.parse("file://" + path));
}
}
這里我除了復(fù)寫構(gòu)造函數(shù)之外篓像,還復(fù)寫了setImageURI和setImageResource方法,然后又添加了setImageFile方法崖叫∫糯荆看名稱應(yīng)該了解,這三個(gè)方法基本滿足我們?nèi)粘i_發(fā)中的需求心傀。
除以上4個(gè)類之外,一些不常用的組件拆讯,我們沒有必要封裝脂男,因?yàn)檎麄€(gè)工程可能也用不到幾次养叛,封裝就不劃算了。
還有ListView宰翅,也是常用的UI組件之一弃甥,有些朋友說現(xiàn)在誰還用ListView啊,都替換成RecycleView了汁讼。
這里我想說明一下淆攻,如果沒有一些特殊的動(dòng)畫需求,RecycleView并不比ListView占多大優(yōu)勢(shì)嘿架,不管怎么樣瓶珊,適合自己的就好。
不過我們是新開的工程耸彪,選哪個(gè)都一樣伞芹。各位希望我們使用哪一款,可以在評(píng)論區(qū)留言蝉娜。
UI組件的基礎(chǔ)建設(shè)大概就先這樣唱较,以后遇到某些需求,我們?cè)偬砑蛹纯烧俅āO乱黄覀儗⒄介_啟Coding工程的偉大之旅南缓!
查看源碼請(qǐng)移步GitHub