Android学习之CardView

来源:互联网 发布:.com.cn是顶级域名吗 编辑:程序博客网 时间:2024/06/07 05:09

CardView介绍


cardview是Android 5.0系统引入的控件,相当于fragmentLayout布局控件然后添加圆角以及阴影的效果。cardview被包装为一种布局,并且经常在ListView和RecyclerView的Item布局中,作为一种容器使用。CardView应该被使用在显示层次性的内容时,在显示列表或者网格事更应该被选择使用,因为这些边缘可以使得用户更容易去区分这些内容。

使用


首先在Gradle中添加cardview包的依赖

    compile 'com.android.support:cardview-v7:25.3.1'

cardview新增的属性:

CardView_cardBackgroundColor 设置背景色
CardView_cardCornerRadius 设置圆角大小
CardView_cardElevation 设置z轴阴影
CardView_cardMaxElevation 设置z轴最大高度值
CardView_cardUseCompatPadding 是否使用CompadPadding
CardView_cardPreventCornerOverlap 是否使用PreventCornerOverlap
CardView_contentPadding 内容的padding
CardView_contentPaddingLeft 内容的左padding
CardView_contentPaddingTop 内容的上padding
CardView_contentPaddingRight 内容的右padding
CardView_contentPaddingBottom 内容的底padding
card_view:cardUseCompatPadding 设置内边距,V21+的版本和之前的版本仍旧具有一样的计算方式

card_view:cardPreventConrerOverlap 在V20和之前的版本中添加内边距,这个属性为了防止内容和边角的重叠

简单使用:

 <android.support.v7.widget.CardView        android:layout_width="match_parent"        android:layout_height="70dp"        app:cardBackgroundColor="#d50"        app:cardElevation="10dp"        app:cardCornerRadius="20dp"        >        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="测试使用cardview"            android:textSize="24sp"            android:layout_gravity="center"            android:gravity="center"            />    </android.support.v7.widget.CardView>

这里写图片描述


版本兼容问题
Google针对SDK 21以下的系统给CardView加入一个Elevation兼容(即XML中的app:cardElevation和Java代码中的setCardElevation)
然而,在低版本中设置了CardElevation之后CardView会自动留出空间供阴影显示,而Lollopop之后,则需要手动设置Margin边距来预留空间,导致我在设置Margin在Android5.x机器上调试好后,在Kitkat机器调试时发现边距非常大,严重浪费了屏幕控件
因此我们需要自定义一个dimen 作为CardView的Margin值:

  • 在创建/res/value和/res/valuew-21资源文件夹于项目对应Module目录下,前者放置旧版本/通用的资源文件,后着放置21及更高SDK版本的资源文件
  • 在value内额dimen.xml创建一个Dimension(<dimen>属性),随便命个名并填入数值0dp
  • 接着在value-21文件内的dimen.xml创建名字相同的Dimension,并填入我们所期望的预留边距(一般和CardElevation阴影大小相同)
  • 最后,在我们的布局中的CardView中设置android:layout_margin="@dimen/xxxxxxxx"

这样依赖就解决了低版本中边距过大或者视觉效果不统一的问题了。

为card添加点击效果

当使用CardView的的场合是作为一个列表中的一个Item且直接单击Item有相应的操作,那么就有必要加上视觉反馈来告诉用户这个card是可点击的
这里写图片描述

如果用了AppCompatv7支持库,那么可以直接给cardview加上

android:foreground="?attr/selectableItemBackground" 这个属性会在 Lollipop 上自动加上 Ripple 效果,在旧版本则是一个变深/变亮的效果。

如果没有使用这个支持库,或者觉得这个效果在旧版本上显得有点僵硬,可以尝试自定义一个drawable,和上一条一样根据不同的SDK版本编写不同的效果

<selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:state_pressed="true">        <color android:color="#f00"/>    </item>    <item >        <color android:color="#d80"/>    </item></selector>

让点击效果更加贴切Material Desgin
Z轴位移,即决定元素层次的深度,与Elevation大小相加构成实际显示的阴影深度
在Material Desgin Guidelines中建议卡片,按钮这类元素接触时应当有个浮起的效果,也就是增大Z轴位移
(设计缘由可以参照 NovaDNG 在知乎的回答:http://www.zhihu.com/question/27494839/answer/36865959)
这里写图片描述

要实现这个效果并不难,我们只需要借助Lollipop的一个新属性android:stateListAnimator(这意味着这个方法不可以用于旧版本系统)

首先,创建一个TranslationZ的变换动画放在/res/anim,自己取名字

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">     <item android:state_enabled="true" android:state_pressed="true">          <objectAnimator               android:duration="@android:integer/config_shortAnimTime"               android:propertyName="translationZ"               android:valueTo="@dimen/touch_raise"               android:valueType="floatType" />     </item>     <item>           <objectAnimator           android:duration="@android:integer/config_shortAnimTime"           android:propertyName="translationZ"           android:valueTo="0dp"           android:valueType="floatType" />     </item></selector>

在dimens.xml中

<resources>    <!-- Default screen margins, per the Android Design guidelines. -->    <dimen name="activity_horizontal_margin">16dp</dimen>    <dimen name="activity_vertical_margin">16dp</dimen>    <dimen name="touch_raise">16dp</dimen></resources>

这里写图片描述

然后为你需要添加效果的 CardView(其他 View 同理)所在的 Layout XML 复制多一份到 /res/layout-v21,然后在新的那份 XML 的 CardView 中加入属性 android:stateListAnimator=”@anim/touch_raise”。
这样,你的卡片按住时就会有浮起(阴影加深)的效果了。


低版本(低于 Lollipop)的 setElevation 不是万能的
由于缺少一些系统 API(如 RenderThread),CardView 中的 Elevation 兼容实现并不完美,和真正的实现方法还是有较大的差距(不是指效果),所以调用 setCardElevation 也不能随心所欲地传入一个 Float 型,在低版本系统使用时应当处理一下传入的数值(似乎只能是整数,碰到过错误但是没详细研究……懒癌请原谅)或加上 try-catch (不推荐)。

参考于:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1025/3621.html

原创粉丝点击