CardView详解

来源:互联网 发布:移动网络玩战舰世界 编辑:程序博客网 时间:2024/05/16 08:25

导读

本篇文章将介绍Android 5.0新增的组件CardView (继承于FrameLayout)

以及本人在开发中遇到的诡异问题

控件私有属性说明

属性 说明 android.support.v7.cardview:cardBackgroundColor 背景颜色 android.support.v7.cardview:cardCornerRadius 边缘圆角大小 android.support.v7.cardview:cardElevation z轴的阴影 android.support.v7.cardview:cardMaxElevation z轴阴影的最大高度值 android.support.v7.cardview:cardPreventCornerOverlap 是否防止CardView 里的内容和和圆角重叠 (Api<=20) android.support.v7.cardview:cardUseCompatPadding 是否给CardView这个控件设置内边距 (Api>=21) android.support.v7.cardview:contentPadding 内容(子View)的padding android.support.v7.cardview:contentPaddingBottom 内容(子View)的底部padding android.support.v7.cardview:contentPaddingLeft 内容(子View)的左侧padding android.support.v7.cardview:contentPaddingRight 内容(子View)的右侧padding android.support.v7.cardview:contentPaddingTop 内容(子View)的上部padding

控件使用说明

准备工作: moudle的bulid.gradle 添加依赖库

    compile 'com.android.support:cardview-v7:26.0.0-alpha1'

XML文件静态使用

        <!--card_view:cardBackgroundColor  背景颜色-->        <!--card_view:cardCornerRadius  边缘圆角大小-->        <!--card_view:cardElevation   z轴的阴影-->        <!--card_view:cardMaxElevation  z轴阴影的最大高度值-->        <!--card_view:cardUseCompatPadding  是否给CardView这个控件设置内边距 API>=21-->        <!--card_view:cardPreventCornerOverlap  是否防止内容和圆角重叠 API<=20-->        <!--card_view:contentPadding  内容(子View)的padding-->        <!--card_view:contentPaddingLeft  内容(子View)的左侧padding-->        <!--card_view:contentPaddingTop  内容(子View)的上部padding-->        <!--card_view:contentPaddingRight 内容(子View)的右侧padding-->        <!--card_view:contentPaddingBottom 内容(子View)的底部padding-->        <android.support.v7.widget.CardView            android:id="@+id/cardview_def"            android:layout_width="match_parent"            android:layout_height="wrap_content"            card_view:cardBackgroundColor="@color/colorPurple"            card_view:cardCornerRadius="30dp"            card_view:cardElevation="10dp"            card_view:cardMaxElevation="10dp"            card_view:cardPreventCornerOverlap="true"            card_view:cardUseCompatPadding="true"            card_view:contentPadding="@dimen/content_padding"            card_view:contentPaddingBottom="@dimen/content_padding"            card_view:contentPaddingLeft="@dimen/content_padding"            card_view:contentPaddingRight="@dimen/content_padding"            card_view:contentPaddingTop="@dimen/content_padding"            >           //dosomting        </android.support.v7.widget.CardView>

代码动态使用

在Activity类,findViewById 找到CardView组件,然后设置相应的属性即可        <!--card_view:cardCornerRadius  边缘圆角大小-->        mCardView.setRadius(float);        <!--card_view:cardElevation   z轴的阴影-->        mCardView.setCardElevation(float); 或 mCardView.setElevation();  为了兼容性,建议使用前者        <!--card_view:cardMaxElevation  z轴阴影的最大高度值-->        mCardView.setMaxCardElevation(float);        <!--card_view:cardUseCompatPadding  是否给CardView这个控件设置内边距 API>=21-->        mCardView.setUseCompatPadding(boolean);        <!--card_view:cardPreventCornerOverlap  是否防止内容和圆角重叠 API<=20-->        mCardView.setPreventCornerOverlap(boolean);        <!--card_view:contentPadding  内容(子View)的padding-->        mCardView.setContentPadding(int,int,int,int)

==爬坑指南==

  1. 在CardView中 android:padding 用于偏移阴影的内容,因此,要设置content(子View)的padding属性,需要在XML文件设置card_view:contentPadding或代码中使用setContentPadding(int,int,int,int).

  2. 如果您为CardView指定了精确尺寸,因为阴影其内容区域在Lollipop之前和之后的平台之间不同.我们可以通过使用api版本特定的资源值避免这些更改.

  3. 如果希望CardView在平台Lollipop上添加内部填充,可以调用setUseCompatPadding(true).

  4. 为了兼容星要用setCardElevation,如果直接使用setElevation,5.0之前的版本,系统会出错(api<21没有阴影效果,我们可以自己模仿写一个自定义控件实现类似效果)

  5. 在低版本中设置了Elevation之后CardView会自动留出空间供阴影显示,而Android 5.0之后需要手动设置Margin边距来预留空间,因此如果设置Elevation稍大,4.0系统的边距会显得很大,显示效果不好

解决:创建/res/value 和/res/value-21 资源文件1./res/value 设置dimens.xml文件,参数设为0<dimen name="cardview_margin">0dp</dimen>2./res/value-21 设置dimens.xml文件,参数按需设置<dimen name="cardview_margin">5dp</dimen> 3.在布局文件的CardView控件加上该属性android:layout_margin="@dimen/cardview_margin"

Genymotion模拟器 测试得到的一些奇怪现象

Api<20(Android 4.4)模拟器测试

  • 静态设置card_view:cardElevation有效果,动态设置mCardView.setCardElevation(float)没效果

  • 静态设置card_view:cardMaxElevation,效果类似给CardView设置了andorid:layout_magin属性

这里写图片描述

  • 如果card_view:cardCornerRadius设置过大,content(子View)会覆盖CardView,设置card_view:cardPreventCornerOverlap=”true”后,content(子View)会自动适配CardView,保持居中显示内容

这里写图片描述

  • 设置了card_view:cardUseCompatPadding没效果,设置card_view:MaxElevation可以实现它的效果

  • 动态设置了mCardView.setRadius(float);子View内容会自动适配CardView


Api>20 (Android 5.0+)模拟器测试

  • 静态设置card_view:cardMaxElevation有反应,动态设置没反应(要同时设置cardUseCompatPadding=”true”才行)

这里写图片描述

  • 如果card_view:cardCornerRadius和mCardView.setRadius(float);设置过大,CardView会覆盖content(子View)

这里写图片描述

总结

  • 实际开发中,在真机测试时,注意下我在Genymotion上遇到的现象,代码动态设置和XML静态设置有什么不同,如果觉得Google提供的CardView 奇怪的bug略多,或者满足不了自己的开发需要,强烈建议同学们自行自定义控件

本篇文章到此结束,欢迎关注,后续有补充的会即时更新,有问题也欢迎评论,共同成长

原创粉丝点击