在開(kāi)發(fā)中摹量,經(jīng)常遇到一種需求臣疑,對(duì)文本設(shè)置邊框背景盔憨。常用的方式是通過(guò)xml中使用shape來(lái)實(shí)現(xiàn)。但是該方法面臨的問(wèn)題是每種顏色讯沈,每個(gè)不同弧度的shape文件都需要一一編寫(xiě)郁岩。
現(xiàn)在有如下需求,根據(jù)后臺(tái)配置的顏色來(lái)動(dòng)態(tài)設(shè)置邊框顏色缺狠。這個(gè)時(shí)候可以使用GradientDrawable來(lái)直接修改屬性或動(dòng)態(tài)創(chuàng)建一個(gè)问慎。
操作背景shape
針對(duì)設(shè)置了background屬性的view,注意必須是shape的背景挤茄∪绲穑可以通過(guò)getBackground獲取背景并轉(zhuǎn)化為GradientDrawable,進(jìn)而設(shè)置背景邊框顏色穷劈。當(dāng)然也可以在GradientDrawable能力范圍內(nèi)設(shè)置其它屬性笼恰。
GradientDrawable drawable = (GradientDrawable) view.getBackground().mutate();
drawable.setStroke(1, color);
但是注意上面使用了getBackground().mutate()踊沸,原因可參考Drawable的mutate方法——多ImageView.setAlpha失效問(wèn)題解決。
可以使用drawable.getConstantState().newDrawable()新建一個(gè)GradientDrawable社证,共享其CommonState(顏色等)逼龟,以便于不同尺寸的宿主view設(shè)置背景圖片。 不要將同一drawable對(duì)象設(shè)置給多個(gè)view追葡。
動(dòng)態(tài)創(chuàng)建
即用代碼動(dòng)態(tài)創(chuàng)建一個(gè)GradientDrawable后腺律,設(shè)置為view的背景。
GradientDrawable drawable = new GradientDrawable();
drawable.setCornerRadius(10);
drawable.setStroke(2,Color.BLUE);
tv.setBackgroundDrawable(drawable);
shape到GradientDrawable的創(chuàng)建
根據(jù)Resources.getDrawable方法的調(diào)用流程宜肉,調(diào)用ResourcesImpl.loadDrawable方法疾渣,調(diào)用Drawable.createFromXmlForDensity方法,調(diào)用DrawableInflater.inflateFromXmlForDensity方法崖飘,下面是創(chuàng)建時(shí)的關(guān)鍵代碼片段:
這也說(shuō)明了上面第一種直接操作背景GradientDrawable的方法只適用于shape背景。
參考文檔:
神奇的Drawable文件夾---背景圖篇