不知道大家有沒有過這樣的煩惱,打開Drawable文件夾下到處都是各式各樣的shape定義贵试,其中不乏有一模一樣的樣式琉兜,但只是名字不同凯正,或者僅僅只是radius,color不同豌蟋,但每次一有邊框廊散,圓角,點擊效果等都需要定義一個新的shape梧疲,今天這個頁面圓角要2dp允睹,明天一樣的又要4dp,或是顏色的變化都需要我們重新寫一個shape.xml,至少我每次寫的時候都有點受不了幌氮,為了避免每次這樣做重復的定義缭受,這里為大家分享一個我用java代碼來控制shape的生成,動態(tài)改變shape的樣式该互。
源碼地址
主要特性
- 不用再寫shape.xml文件了C渍摺!宇智!
- 鏈式調(diào)用
- 涵蓋Shape幾乎常用的所有屬性蔓搞,如:TYPE,Radius随橘,Stroke喂分,Soild,Gradient机蔗,GradientType蒲祈,GradientCenter,GradientRadius萝嘁,Size
- 支持Selector
- 支持Layer-list
如何使用
1.ShapeBuilder
非常簡單梆掸,來看看最基本的使用方式,比如一個帶邊框的View酿愧。
ShapeBuilder.create()
.Type(RECTANGLE)
.Soild(Color.RED)
.Stroke(5,Color.BLACK)
.build(View);
設置對應的屬性沥潭,調(diào)用build(View)傳入需要設置背景的view即可。如果需要獲得構建的drawable可以調(diào)用該build()方法返回嬉挡。
利用Builder模式钝鸽,實現(xiàn)了一系列的鏈式調(diào)用,方便我們設置屬性值庞钢。
public interface IShape {
public ShapeBuilder Type(int type);
public ShapeBuilder Stroke(int px, int color);
public ShapeBuilder Stroke(int px, int color, int dashWidth, int dashGap);
public ShapeBuilder Solid(int color);
public ShapeBuilder Radius(float px);
public ShapeBuilder Radius(float topleft, float topright, float botleft, float botright);
public ShapeBuilder Gradient(int startColor, int centerColor, int endColor);
public ShapeBuilder Gradient(int angle, int startColor, int centerColor, int endColor);
public ShapeBuilder Gradient(GradientDrawable.Orientation orientation, int startColor, int
centerColor, int endColor);
public ShapeBuilder GradientType(int type);
public ShapeBuilder GradientCenter(float x, float y);
public ShapeBuilder GradientRadius(float radius);
public ShapeBuilder setSize(int width, int height);
public void build(View v);
public GradientDrawable build();
}
2.ShapeListBuilder替代Selector
其實這個是基于ShapeBuilder拔恰,將幾個主要的都順便封裝了一下,可以替代Selector的定義基括。
ShapeListBuilder.create(Drawable drawable)//傳默認狀態(tài)下的drawable
.addShape(Drawable shape, int... state)//狀態(tài)對應的drawable和state
.build(View view);
3.LayerBuilder替代Layer-list
用于替代Layer
LayerBuilder.create(Drawable... drawables)
.Bottom(1, 15)//top颜懊,right...setInset等
.build(View view);
用法其實都比較簡單無腦,記住要最后調(diào)用build(View view)方法~
原理
原理其實也比較基礎,我們每次定義Shape文件河爹,其實最后會被生成GradientDrawable匠璧,通過查看GradientDrawable源碼,我們其實能看到我們定義的type咸这,Radius夷恍,solid等屬性其實就是最后在這里面通過TypeArray讀取出來,最后生成了GradientDrawable對象媳维,所以我們只是需要對GradientDrawable源碼進行閱讀理解酿雪,考慮到GradientDrawable屬性眾多這一特點,利用Build模式進行封裝侄刽,便實現(xiàn)了ShapeBuilder指黎,當然內(nèi)部還有一些對于低版本兼容的處理優(yōu)化,大家可以閱讀源碼州丹。而后兩個原理也是一樣的醋安,分別對應StateListDrawable和LayerDrawable。
最后再次附上源碼地址SupperShape墓毒,大家要是使用過程中有什么不錯的建議茬故,歡迎提issue或者評論,順手點個star那就更好不錯了~