CardView是Android5.0(API 21)加入的新控件抡笼,當然衷旅,在API 21以下也能用呀枢,在build.gradle的依賴里加入下邊一行就可以用了
compile 'com.android.support:cardview-v7:23.1.1'
項目中要做一個卡片瀏覽的程序,卡片需要有5dp的圓角庭再,圓角效果CardView自帶屬性就可以支持,加上app:cardCornerRadius屬性就好了牺堰,如下:
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardUseCompatPadding="true"
app:cardCornerRadius="5dp">
...
</android.support.v7.widget.CardView>
在API 21以上(包括)的機器實現了很完美的圓角效果拄轻,效果如下:
但是在API 21以下的機器出現了問題,以下是API 19的實現效果:
初步一看伟葫,雖然加上了圓角屬性恨搓,但是圖片邊上是方的。將左下角和左上角放大仔細看下:
可以看到筏养,CardView本身是圓角效果了斧抱,但是里邊的內容卻還是方的,并且出現了多余的白邊渐溶。
再仔細查看CardView的文檔辉浦,發(fā)現其有一個屬性cardPreventCornerOverlap
<!-- Add padding to CardView on v20 and before to prevent intersections between the Card content and rounded corners. -->
<!-- 在v20和之前的版本中添加內邊距,這個屬性是為了防止卡片內容和邊角的重疊 -->
<attr name="cardPreventCornerOverlap" format="boolean" />
cardPreventCornerOverlap默認為true掌猛,意思是阻止API 20或者之前的CardView的corner和內部元素重疊盏浙。沒有重疊就產生了上邊的效果,多了一條白邊荔茬。于是在xml布局文件里增加CardView的屬性app:cardPreventCornerOverlap="false"废膘,左下角和左上角效果如下:
可以看到,CardView里的元素已經和CardView重疊了慕蔚,但是元素本身沒有圓角丐黄,所以頂點伸出去了。到這里思路就很簡單了孔飒,將里邊的元素單獨做圓角處理灌闺。
drawable下新建shape_radius.xml文件,代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<corners android:radius="5dp" />
<solid android:color="@color/f2f2f2"></solid>
</shape>
在CardView里的元素LinearLayout加上backgroud屬性
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/shape_radius" >
<ImageView
android:id="@+id/iv_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:src="@drawable/ic_person_default"/>
</LinearLayout>
左下角正常坏瞄,左上角依然
圖片還需要單獨做圓角處理桂对,這里需要的效果是,圖片的上邊兩個角需要圓角鸠匀,下邊兩個角需要直角蕉斜。
自定義UpRoundImageView類,繼承自ImageView,專門做圓角的繪制宅此,代碼如下:
public class UpRoundImageView extends ImageView {
private float mRadus = 5 * SystemUtils.getDensity(CampusApplication.getCampusApplicationContext());
/*圓角的半徑机错,依次為左上角xy半徑,右上角父腕,右下角弱匪,左下角*/
private float[] rids = {mRadus, mRadus, mRadus, mRadus, 0.0f,0.0f,0.0f,0.0f};
public UpRoundImageView(Context context) {
super(context);
}
public UpRoundImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public UpRoundImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 畫圖
* @param canvas
*/
protected void onDraw(Canvas canvas) {
Path path = new Path();
int w = this.getWidth();
int h = this.getHeight();
/*向路徑中添加圓角矩形。radii數組定義圓角矩形的四個圓角的x,y半徑璧亮。radii長度必須為8*/
path.addRoundRect(new RectF(0,0,w,h),rids,Path.Direction.CW);
canvas.clipPath(path);
super.onDraw(canvas);
}
}
將ImageView替換成UpRoundImageView萧诫, 這樣就實現了全部圓角效果。
另外杜顺,可以在CardView加上app:cardElevation="3dp"屬性财搁,這個屬性加上后可以在CardView后形成一個陰影,有卡片浮上來的感覺躬络,更符合Material Design風格尖奔。 xml中CardView的屬性設置為
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardUseCompatPadding="true"
app:cardCornerRadius="5dp"
app:cardPreventCornerOverlap="false"
app:cardElevation="3dp">
...
</android.support.v7.widget.CardView>
最后實現效果在各個平臺一致:
api 19實現效果
api 22實現效果