Android 使用CardView轻松实现卡片式设计

Material design中有一种很个性的设计概念:卡片式设计(Cards),这种设计与传统的List Item有所区别,Cards包含更多的内容元素和拥有自己的UI特征,关于Cards的设计规范可以参考官网介绍:

https://material.google.com/components/cards.html#

为了更好地实现这种 Cards UI 的设计,Google在v7包中引进了一种全新的控件:CardVew,本文将从开发的角度介绍CardView的一些常见使用细节。

Google用一句话介绍了CardView:一个带圆角和阴影背景的FrameLayout。CardView在Android Lollipop(API 21)及以上版本的系统中适配较好,本文我们以一个具体的例子来学习CardView的基本使用和注意事项,效果图如下:

CardView-samples-01.png

上图展示的是一个list列表,列表中的item使用了卡片式设计,主要利用CardView控件实现,为了精简文章内容,这里我们将item布局中的核心代码罗列出来,加以分析:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><android.support.v7.widget.CardViewtools:targetApi="lollipop"android:layout_width="match_parent"android:layout_height="wrap_content"android:stateListAnimator="@drawable/lift_on_touch"android:layout_marginLeft="@dimen/dp_8"android:layout_marginRight="@dimen/dp_8"android:layout_marginBottom="@dimen/dp_8"android:clickable="true"android:foreground="?android:attr/selectableItemBackground"app:cardCornerRadius="@dimen/dp_4"app:cardUseCompatPadding="true"app:cardPreventCornerOverlap="false"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><!-- image、text等其他内容 -->......</RelativeLayout></android.support.v7.widget.CardView></LinearLayout>

可以看出,核心部分在于CardView的属性使用,下面我们针对几个特殊的属性逐一分析,深化了解。

排版技巧


前面我们说过,CardView从本质上属于FrameLayout,而CardView通常包含了较多的内容元素,为了方便地排版布局中的各个元素,一般借助于其他基本布局容器,比如这里我们使用了一个RelativeLayout作为CardView的唯一Child。

阴影Padding


在Android Lollipop之前的系统,CardView会自动添加一些额外的padding空间来绘制阴影部分,这也导致了以Lollipop为分界线的不同系统上CardView的尺寸大小不同。为了解决这个问题,有两种方法:第一种,使用不同API版本的dimension资源适配(也就是借助values和values-21文件夹中不同的dimens.xml文件);第二种,就是使用setUseCompatPadding属性,设置为true(默认值为false),让CardView在不同系统中使用相同的padding值。

圆角覆盖


这也是一个解决系统兼容的问题。在pre-Lollipop平台(API 21版本之前)上,CardView不会裁剪内容元素以满足圆角需求,而是使用添加padding的替代方案,从而使内容元素不会覆盖CardView的圆角。而控制这个行为的属性就是cardPreventCornerOverlap,默认值为true。在本例中我们设置了该属性为false。这里我们看一下,在pre-Lollipop平台中,不同cardPreventCornerOverlap值的效果对比图(左false,右true):

CardView-samples-02.png

显然,默认值下自动添加padding的方式不可取,所以需要设置该属性值为false。需要注意的一点是,该属性的设置在Lollipop及以上版本的系统中没有任何影响,除非cardUseCompatPadding的值为true。

Ripple效果


Cards一般都是可点击的,为此我们使用了foreground属性并使用系统的selectableItemBackground值,同时设置clickable为true(如果在java代码中使用了cardView.setOnClickListener,就可以不用写clickable属性了),从而达到在Lollipop及以上版本系统中实现点击时的涟漪效果(Ripple),如图:

CardView-samples-03.gif

在pre-Lollipop版本中,则是一个普通的点击变暗的效果,这里就不截图展示了,如果想改变老版本的点击效果,也可以通过版本兼容的方式另行修改。

lift-on-touch


根据官网Material motion部分对交互动作规范的指导,Cards、Button等视图应该有一个触摸抬起(lift-on-touch)的交互效果,也就是在三维立体空间上的Z轴发生位移,从而产生一个阴影加深的效果,与Ripple效果共同使用,官网给了一个很好的示例图:

CardView-samples-04.gif

在实现这个效果也很简单,可以在res/drawable目录下建立一个lift_on_touch.xml文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<!-- animate the translationZ property of a view when pressed -->
<selector xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:state_enabled="true"android:state_pressed="true"><set><objectAnimatorandroid:duration="@android:integer/config_shortAnimTime"android:propertyName="translationZ"android:valueTo="6dp"android:valueType="floatType"/></set></item><item><set><objectAnimatorandroid:duration="@android:integer/config_shortAnimTime"android:propertyName="translationZ"android:valueTo="0"android:valueType="floatType"/></set></item>
</selector>

即通过属性动画动态改变translationZ值,沿着Z轴,从0dp到6dp变化。这里的6dp值也是有出处的,参考Google I/O 2014 app和Assign Elevation to Your Views。然后将其赋值给android:stateListAnimator属性即可。由于stateListAnimator属性只适用于Lollipop及以上版本,为了隐藏xml中的版本警告,可以指定tools:targetApi="lollipop"

关于这个功能,需要补充说明一点。这里的lift_on_touch.xml,严格意义上来讲,属于anim资源,同时适用于API 21及以上版本,所以按道理上来讲应该将其放置在res/anim-v21目录下,然后使用@anim/lift_on_touch赋值给stateListAnimator属性,而不是例子中的@drawable/lift_on_touch方法。但是放置在res/anim-v21目录下会产生一个“错误”提示:

<selector> XML file should be in either “animator” or “drawable”,not “anim”

虽然这个“错误”不影响编译运行,但是对于追求完美主义的程序员们来说还是碍眼,所以本例中我选择将其放在了res/drawable目录下,大家可以自行斟酌使用。

关于对lift-on-touch效果的理解,YouToBe网站有个视频解说,感兴趣的话可以参看看,地址如下:

DesignBytes: Paper and Ink: The Materials that Matter

总结说明


CardView还有一些其他属性可供使用,比如cardElevation设置阴影大小,contentPadding代替普通android:padding属性等,比较基础,本文就不一一介绍了,大家可以在官网上参考学习。从上面的介绍可以看出,在使用CardView时基本上都会用到一些标准配置的属性,我们可以借助style属性,将其封装到styles.xml文件中,统一管理,比如:

<style name="AppCardView" parent="@style/CardView.Light"><item name="cardPreventCornerOverlap">false</item><item name="cardUseCompatPadding">true</item><item name="android:foreground">?attr/selectableItemBackground</item><item name="android:stateListAnimator" tools:targetApi="lollipop">@anim/lift_up</item>......
</style>

最后,附上本文案例项目的GitHub地址:

https://github.com/Mike-bel/MDStudySamples


转自: https://www.jianshu.com/p/573fc14a7ee5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7727.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计干货:8种卡片设计的技巧

卡片是我们随处可见的小UI组件&#xff0c;原因很简单&#xff0c;它们占用的空间非常小&#xff0c;并且可以显示足够的信息&#xff0c;通常还有1-2种选项。 为什么使用卡片&#xff1a; 卡片能够存在和流行&#xff0c;因为它们本身拥有简约的设计和良好的可用性&#xff0…

ChatGPT进阶——如何辅助设计E-R图、流程图和时序图等

ChatGPT是美国人工智能研究实验室OpenAI新推出的一种人工智能技术驱动的自然语言处理工具&#xff0c;使用了Transformer神经网络架构&#xff0c;也是GPT-3.5架构&#xff0c;这是一种用于处理序列数据的模型&#xff0c;拥有语言理解和文本生成能力&#xff0c;尤其是它会通过…

AI:2023年6月9日北京智源大会演讲分享之基础模型前沿技术论坛—《工程化打造AI中的CPU》、《构建一个AI系统:在LLM上应用带有RLHF来推进定制》、《多模态预训练的进展回顾与展望》、《扩展大

AI&#xff1a;2023年6月9日北京智源大会演讲分享之基础模型前沿技术论坛—《工程化打造AI中的CPU》、《构建一个AI系统:在LLM上应用带有RLHF来推进定制》、《多模态预训练的进展回顾与展望》、《扩展大型语言模型:从幂律到稀疏性》 导读&#xff1a;《工程化打造AI中的CPU》讲…

ChatGPT|如何通过ChatGPT问一本书的问题?

很多场景下需要私域数据&#xff0c;但是在使用ChatGPT对话回答是很泛或者没有相关答案&#xff0c;因此你就需要自己喂养数据&#xff0c;然后形成自己的私域数据数据集&#xff0c;以下就是用一本书作为例子&#xff0c;通过输入一本书问ChatGPT关于这本书其中的问题。其步骤…

通过Springboot实现Excel转Jsonl格式文档

目的 用于Chatgpt模型训练 实现效果 Excel Jsonl 如何实现 引入maven依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.apache.poi</gro…

【ChatGPT|AI 工具】使用 ChatPDF,实现秒读论文

ChatPDF 官网链接&#xff1a;https://www.chatpdf.com/ 步骤概要 在线使用&#xff0c;将PDF 拖拽至框框内即可。我这里使用了一个课后笔记作为输入PDF 使用限制&#xff1a; 解析成功后&#xff0c;会进入下一个聊天界面。 细心的同学会发现&#xff0c;它对PDF的内容&…

ChatGPT - 让ChatGPT更持久

文章目录 问题解决办法1。 先安装一个油猴2。 安装 ChatGPT HeartBeat 问题 解决办法 1。 先安装一个油猴 https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo 2。 安装 ChatGPT HeartBeat https://greasyfork.org/zh-CN/scripts/46…

您使用的ChatGPT错了!以下是如何领先于 99% 的 ChatGPT 用户

我们大多数人都错误地使用了 ChatGPT&#xff1a; 错误1&#xff1a;不在提示中包含示例。 错误2&#xff1a;忽略通过角色控制 ChatGPT 的行为。 错误3&#xff1a;让 ChatGPT 猜测内容&#xff0c;而不是向它提供一些信息。 通过3类有用的prompt工程掌握 ChatGPT的使用。 …

微软宣布推出由升级后的ChatGPT人工智能驱动的新Bing和Edge浏览器

微软官方今日凌晨宣布&#xff0c;推出由新款 OpenAI 语言模型支持的最新版本必应 Bing 搜索引擎与 Edge 浏览器&#xff0c;新的 Edge 浏览器增加可以聊天与写作的必应。微软称希望将必应体验带到所有浏览器&#xff0c;而不局限于 Edge。 微软 CEO 萨蒂亚纳德拉表示&#xff…

微软新Bing AI,带chat聊天写作等功能的搜索引擎简介

文章目录 可选前置操作将系统对软件的位置获取禁止更改默认区域 尝试更改现有MS账户注册地&#xff08;亲测不行&#xff09;在GPT和bing AI中搜索按步骤更改MS账户注册地址设置 / 账户管理右上角头像 / 我的个人资料国家或地区 / 编辑 结果 重新注册MS账户&#xff0c;设置注册…

微软推出首款 ChatGPT 版搜索引擎!ChatGPT 会成为下一代搜索引擎的标配吗?

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2022年12月份热门报告盘点 ChatGPT的发展历程、原理、技术架构及未来方向 《ChatGPT&#xff1a;真格基金分享.pdf》 2023年AIGC发展趋势报告&#xff1a;人工智能的下一时代…

惊!不仅AI聊天!微软结合ChatGPT的新版Bing发现隐藏模式

最新消息&#xff1a;微软基于结合升级版ChatGPT AI聊天机器人技术&#xff0c;推出新版Bing搜寻引擎&#xff0c;具有四种不同特定情境与形式的聊天模式与使用体验&#xff1a;问答聊天式&#xff08;已开放测试&#xff09;、朋友模式&#xff08;开发中&#xff09;、助理模…

【关于ChatGPT的30个问题】4、ChatGPT会替代搜索引擎吗?/ By 禅与计算机程序设计艺术

4、ChatGPT会替代搜索引擎吗? 目录 4、ChatGPT会替代搜索引擎吗? 4、ChatGPT和搜索引

chatgpt赋能python:Python量化代码介绍

Python量化代码介绍 Python是一种高级编程语言&#xff0c;它已经成为量化投资和算法交易的主要语言。Python具有易学易用、快速迭代和广泛的生态系统&#xff0c;使得它成为量化领域的首选语言。在这篇文章中&#xff0c;我们将介绍Python量化代码的基础知识和最佳实践&#…

ChatGPT 指令知识要点

ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定1、ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视( 点击观看完整版本 )https…

ChatGPT如何生成可视化图表-示例中国近几年出生人口

本教程收集于&#xff1a;AIGC从入门到精通教程汇总 ChatGPT本身不能直接生成可视化图表&#xff0c;但可以配合其他可视化工具或库 方法一&#xff1a;前端可视化开发库 Echarts&#xff08;地址&#xff1a;Apache ECharts &#xff09; 方法二&#xff1a;现有Python库。…

这个ChatGPT插件可以远程运行代码,还生成图表

来源&#xff1a;DeepHub IMBA 本文约900字&#xff0c;建议阅读4分钟ChatGPT的插件使数据科学成为一种简单、愉快的体验。 我们做数据分析时一般都是使用这样的流程来进行&#xff1a;运行jupyter notebook、安装库、解决依赖关系和版本控制&#xff0c;数据分析&#xff0c;生…

抱抱脸:ChatGPT背后的算法——RLHF | 附12篇RLHF必刷论文

文 | 卖萌酱 大家好&#xff0c;我是卖萌酱。 前几天&#xff0c;抱抱脸公司&#xff08;HuggingFace&#xff09;发表了一篇博客[1]&#xff0c;详细讲解了ChatGPT背后的技术原理——RLHF。 笔者读过之后&#xff0c;觉得讲解的还是蛮清晰的&#xff0c;因此提炼了一下核心脉络…

ChatGPTAI画图-微信小程序 Robot Buddy

同时拥有ChatGPT的聊天功能和AI画图功能的微信小程序&#xff0c;欢迎大家体验&#xff1a; 微信搜索小程序“Robot Buddy”或者扫描下方二维码即可使用&#xff1a;

Midjourney 能识图了,这是个好事儿吗?

进化 前些日子&#xff0c;有人发了这样一张图&#xff0c;揶揄现在的 AI 检测器。说是「魔法战胜了魔法」。 这张图&#xff0c;是用 AI 生成的。但是 AI 检测器显然没有发现。在它看来&#xff0c;这张图片「天然成分」有93%&#xff1b;人工智能生成的可能性&#xff0c;只有…