????小菜最近在處理圖片的圓角倒得,不止是四個(gè)角全是圓角,還包括單左側(cè)/單右側(cè)/對(duì)角線方向的圓角夭禽。因?yàn)樽约禾酥荒軐で缶W(wǎng)上的大神霞掺,發(fā)現(xiàn)一個(gè)自定義圓角布局,這樣可以變相的解決我的需求讹躯,還可以實(shí)現(xiàn)更多的圓角效果菩彬,不僅是圖片,還包括其他布局潮梯。
????小菜我作為伸手黨骗灶,非常感謝大神的分享,參考原文 RoundAngleFrameLayout酷麦。
????這個(gè)布局實(shí)現(xiàn)方式很簡(jiǎn)單矿卑,大神只提供了默認(rèn)的四個(gè)圓角,這里我添加了一些方法可以動(dòng)態(tài)的設(shè)置圓角的位置與弧度沃饶,并說明一下小菜遇到的小問題母廷。小菜根據(jù)大神的總結(jié)自定義了一個(gè) MyRoundLayout GitHub 布局樣式。
Tips:
- 在設(shè)置完角度之后糊肤,要添加 invalidate() 刷新 UI琴昆,才可以進(jìn)行動(dòng)態(tài)設(shè)置;
- 自定義的布局樣式繼承的 FrameLayout馆揉,所以設(shè)置在需要進(jìn)行圓角的控件外即可业舍,并不影響其內(nèi)部控件的樣式;
- 既然 MyRoundLayout 繼承的是 FrameLayout升酣,則應(yīng)遵循 FrameLayout 的特點(diǎn)舷暮,內(nèi)部不能直接設(shè)置控件的權(quán)重,可在內(nèi)部添加一層 Layout 布局噩茄,在進(jìn)行權(quán)重 weight 的處理下面;
- 在使用 MyRoundLayout 時(shí),因?yàn)樵O(shè)置的是外層的圓角绩聘,所以不建議使用 padding 的屬性沥割,若要設(shè)置邊距耗啦,建議使用外邊距 margin,若使用 padding 不當(dāng)机杜,會(huì)發(fā)生效果圖中第一行第二個(gè)的樣式帜讲,沒有直接效果;
- xml 中與 Java/Kotlin 代碼中均設(shè)置圓角弧度和位置時(shí)椒拗,以 Java/Kotlin 為準(zhǔn)似将,這也是小菜設(shè)置 setXX 的原因。
效果圖:
圓角布局效果圖.jpg
/**
* 設(shè)置左上角圓角弧度
*
* @param topLeftRadius
*/
public void setDrawTopLeft(float topLeftRadius) {
this.topLeftRadius = topLeftRadius;
invalidate();
}
/**
* 設(shè)置右上角圓角弧度
*
* @param topRightRadius
*/
public void setDrawTopRight(float topRightRadius) {
this.topRightRadius = topRightRadius;
invalidate();
}
/**
* 設(shè)置左下角圓角弧度
*
* @param bottomLeftRadius
*/
public void setDrawBottomLeft(float bottomLeftRadius) {
this.bottomLeftRadius = bottomLeftRadius;
invalidate();
}
/**
* 設(shè)置右下角圓角弧度
*
* @param bottomRightRadius
*/
public void setDrawBottomRight(float bottomRightRadius) {
this.bottomRightRadius = bottomRightRadius;
invalidate();
}
/**
* 設(shè)置左上角與右下角圓角弧度陡叠,簡(jiǎn)稱左對(duì)角線弧度
*
* @param radius
*/
public void setLeftDiagonal(float radius) {
this.topLeftRadius = radius;
this.bottomRightRadius = radius;
this.topRightRadius = 0.0f;
this.bottomLeftRadius = 0.0f;
invalidate();
}
/**
* 設(shè)置右上角與左下角圓角弧度玩郊,簡(jiǎn)稱右對(duì)角線弧度
*
* @param radius
*/
public void setRightDiagonal(float radius) {
this.topLeftRadius = 0.0f;
this.bottomRightRadius = 0.0f;
this.topRightRadius = radius;
this.bottomLeftRadius = radius;
invalidate();
}
/**
* 設(shè)置左下角與右下角圓角弧度,簡(jiǎn)稱下弧度
*
* @param radius
*/
public void setBottomDiagonal(float radius) {
this.topLeftRadius = 0.0f;
this.topRightRadius = 0.0f;
this.bottomRightRadius = radius;
this.bottomLeftRadius = radius;
invalidate();
}
/**
* 設(shè)置右上角與左上角圓角弧度枉阵,簡(jiǎn)稱上弧度
*
* @param radius
*/
public void setTopDiagonal(float radius) {
this.topLeftRadius = radius;
this.topRightRadius = radius;
this.bottomRightRadius = 0.0f;
this.bottomLeftRadius = 0.0f;
invalidate();
}
/**
* 設(shè)置所有角度統(tǒng)一圓角弧度
*
* @param radius
*/
public void setAllDiagonal(float radius) {
this.topLeftRadius = radius;
this.bottomRightRadius = radius;
this.topRightRadius = radius;
this.bottomLeftRadius = radius;
invalidate();
}
來源: 阿策小和尚