Material Design 进阶(十一)——Chip,ChipGroup,ChipDrawable使用

news2024/11/18 21:41:56

在这里插入图片描述

流式布局标签发展历程

  • 第一阶段:实现这种界面的时候,基本都是自定义一个控件,然后在Java代码中动态的 添加一个个的TextView,还需要计算布局宽度/高度,进行换行等等处理,比较复杂;
  • 第二阶段:使用RecyclerView,我们实现这种界面就比较方便了,具体实现参考这篇文章RecyclerView实现流式布局;
  • 第三阶段:谷歌为我们提供了ChipChipGroupChipDrawable,有了这三者,我们实现这种界面就更加方便了。
    ChipGroup其实继承于FlowLayout,有了Flow Layout我们可以做更加自由灵活的流式布局效果。Material官方流式布局FlowLayout使用参考:https://blog.51cto.com/u_16175517/7248278

Chip

Chip的style分类和特性

  • style="@style/Widget.MaterialComponents.Chip.Action": 默认样式,是一个普通标签,点击后没有任何特殊效果。
  • style="@style/Widget.MaterialComponents.Chip.Entry": 默认一直末尾展示删除按钮;点击后前面展示选中图标,有选中状态,通常可以作为chipDrawable使用,比如在填选邮件收件人时可以使用;
  • style="@style/Widget.MaterialComponents.Chip.Filter": 初始状态下,不展示前后图标,点击后会展示前面选中的图标,并且具有选中状态,通常应用在ChipGroup中;
  • style="@style/Widget.MaterialComponents.Chip.Choice": 具有选中效果,前后没有图标,点击后有选中颜色变化效果。

Chip的基本属性

类别属性名称具体作用
Shapeapp:chipCornerRadius圆角半径
Sizeapp:chipMinHeight最小高度
Backgroundapp:chipBackgroudColor背景颜色
Borderapp:chipStrokeColor边线颜色
Borderapp:chipStrokeWidth边线宽度
Rippleapp:rippleColor水波纹颜色
Labelandroid:text文本内容
Labelandroi:textAppearance字体样式
Labelandroid:textColor修改文本颜色
Chip Iconapp:chipIconVisible前面图标是否显示
Chip Iconapp:chipIconSizechip中文字前面的图标
Chip Iconapp:chipIconTint文字前面的图标着色
Close Iconapp:closeIconVisiblechip中文字后面关闭按钮是否可见
Close Iconapp:closeIconchip中文字后面的关闭图标
Close Iconapp:closeIconSize文字后面的关闭图标的大小
Close Iconapp:closeIconTInt文字后面的着色
Checkableapp:checkable是否可以被选中
Checked Iconapp:checkedIconVisible选中状态的图标是否可见
Checked Iconapp:checkedIcon选中状态的图标
Motionapp:showMotionSepc动效?
Motionapp:hiheMotoinSpec动效?
Paddingsapp:chipStartPadingchip左边距
Paddingsapp:chipEndPadingchip右边距
Paddingsapp:iconStartPadingchipIcon的左边距
Paddingsapp:iconEndPadingchipIcon的右边距
Paddingsapp:textStartPading文本左边距
Paddingsapp:textEndPading文本右边距
Paddingsapp:CloseIconStartPading关闭按钮的左边距
Paddingsapp:closeIconEndPading关闭按钮的右边距

监听事件

  1. setOnCliclListener:同其他View
  2. setOnCheckedStateChangeListener:
  • 只有 checkable=true 时,才生效
  • 未设置checkable属性时,如果应用了filter/entry/choice的style时该监听才有效,因为这三种style的checkable为true,action的checkable默认为false
  1. setOnCloseIconClickListener:关闭按钮的点击监听
    假设我们让Chip所在的界面 实现了 onClickListener ,那么,为chip 设置点击监听时就可以直接调用 chip.setOnClickListener(this)。但是,如果此时也需要监听 CloseIcon 的点击事件,我们必须单独为 CloseIcon 构造一个匿名监听——因为:CloseIcon 是直接通过画笔画出来的,没有id。在处理点击事件时,Chip的源码中实际是监听了触摸事件,根据触摸的位置判断 CloseIcon是否被点击了。

ChipGroup

Chip 可以被放置在 ChipGroup 中,以实现流式布局。该组件合 RadioGroup 很相似,都是用来管理多个子 View 的,可以控制内部子 View 的布局方式。

  • 默认情况下,里面的 Chip 是横向多行排列的,每行的最后一个 Chip 控件如果放不下的时候就会自动换行,符合流式布局的规则。
  • 如果我们不想让 Chip 换行,那么为 ChipGroup 设置 app:singleLine=true,如果 Chip
    会超过一行,则在外层包裹 HorizontalScrollView
  • 当然,只有当其中包裹的 Chip 是 checkable=true 时,才具有选中效果

ChipGroup 基本属性

属性名称具体作用
app:checkedChip设置初始默认选中的 chip
app:chipSpacing设置 Chip 间的间距
app:chipSpacingHorizontal设置 Chip 之间的水平间距,优先级高于 app:chipSpacing
app:chipSpacingVertical设置 Chip 之间的垂直间距,优先级高于 app:chipSpacing
app:singleLine设置是否开启单行模式
app:singleSelection设置是否开启单选模式,默认是多选
app:selectionRequired设置是否必须保留一项选中,防止所有芯片被取消选择
  • 如果有 app:chipSpacingHorizontal 或者 app:chipSpacingVertical属性,chipSpacing 属性会被覆盖;
  • chipSpacing水平间距不生效,但是chipSpacingHorizontal属性有效,这个没发现具体原因,熟悉的同学请在评论里留言,感激不尽。
  • 如何强制 ChipGroup 像 RadioGroup 一样始终至少有一个选定项目?可以使用方法
    setSelectionRequired(true)
动态添加Chip到ChipGroup中

通过xml添加比较简单就不再阐述。重点关注下动态添加,可以为以后做复杂的布局效果做铺垫;

Chip chip = new Chip(getContext());
chip.setText(tagBean.getTagName());
chip.setTextColor(chipTextColor);//设置文字颜色
chip.setTextSize(TypedValue.COMPLEX_UNIT_PX, chipTextSize);//设置文字大小
chip.setChipBackgroundColorResource(chipBackgroundColor);//设置背景色,支持color state list
chip.setChipCornerRadius(chipCornerRadius);//设置圆角大小
chip.setRippleColorResource(rippleColor);//设置点击波纹颜色
chipGroup.addView(chip);

1、动态添加时如何修改Chip Style,有两种方式:
Chip 没有像其他组件一样具有 4 个参数的构造函数,因为它扩展了不支持 4 参数构造函数的 AppCompatCheckbox。但是你可以使用不同的方式。

  1. 设置ChipDrawable
ChipDrawable chipDrawable = ChipDrawable.createFromAttributes(getContext(), null, 0, R.style.CustomChipStyle);
chipDrawable.setTextSize(chipTextSize);
chipDrawable.setTextColor(chipTextColor);
chipDrawable.setChipBackgroundColor(ColorStateList.valueOf(chipBackgroundColor));
chipDrawable.setChipCornerRadius(chipCornerRadius);
chipDrawable.setRippleColorResource(R.color.ripple_color);
tagView.setChipDrawable(chipDrawable);
  1. 修改创建时传入的context其他自定义View也可以通过这种方式设置Style
Context contextThemeWrapper = new ContextThemeWrapper(getContext(), R.style.CustomChipStyle);
Chip chip = new Chip(contextThemeWrapper);

自定义view时动态设置style参考这篇文章:https://juejin.cn/post/7021821759078793247

2、chip的复用性:chip不能复用

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSC8021_computer network_The Transport Layer

Role of the transport layer • The transport layer is responsible for providing a reliable end-to-end connection between two application processes in a network • Abstracting away the physical subnet • Does not involve intermediate nodes • Takes a netwo…

Centos源码编译安装Redis

Redis是常用的内容使用工具,每次安装服务器都需要安装Redis 为了减少重复工作,写了一个脚本自动安装Redis,如下 #!/bin/sh #下载源码 curl -O http://download.redis.io/redis-stable.tar.gz # 解压缩 tar zxf redis-stable.tar.gz cd redi…

【Redis集群】docker实现3主3从扩缩容架构配置案例

一,集群规划及准备工作 架构实现:Redis3主3从 二,搭建命令 第一步,创建6台服务: docker run -d --name redis-node-1 --net host --privilegedtrue -v /data/redis/share/redis-node-1:/data redis:6.0.8 --clust…

照片删除了怎么恢复回来

照片,对我们来说,这两个字眼再熟悉不过了,每一张照片都包含无比重要的意义,相信在大家的心目中,这些包含意义的照片都是无价的。怎样找回删除的照片? 既然这些照片对我们来说意义非凡,那如果不小…

超详细的搭建压测平台笔记

0、前言 最近重新回来学习熊哥的极客教程,结合自己学习的shell编程和Docker的指令学习,对熊哥的一些操作做bash脚本自动化,将搭建压测平台的步骤做记录,目的是分享搭建过程。 过程中会安装docker,mysql,redis,influxdb,grafana,…

分布形态的度量_峰度系数的探讨

集中趋势和离散程度是数据分布的两个重要特征,但要全面了解数据分布的特点,还应掌握数据分布的形态。 描述数据分布形态的度量有偏度系数和峰度系数, 其中偏度系数描述数据的对称性,峰度系数描述与正态分布的偏离程度。 峰度系数反映分布峰的尖峭程度的重要指标. 当…

2024--Django平台开发-Redis集群(十一)

内容回顾 主从复制。 哨兵:实例启动了,哨兵节点没启动,Python通过redis-py连接报错。一定要确保实例节点和哨兵节点都启动了。 搭建集群用的是虚拟机的多台centos服务器,你在跟着学习的时候,一定要全部都是虚拟机&am…

Mysql-redoLog

Redo Log redo log进行刷盘的效率要远高于数据页刷盘,具体表现如下 redo log体积小,只记录了哪一页修改的内容,因此体积小,刷盘快 redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快Redo log 格式 在MySQL的InnoDB存储引擎中,redo log(重做日志)被用…

【UEFI基础】EDK网络框架(VLAN)

VLAN VLAN代码综述 在MNP中有很多的VLAN介绍,MNP存在的一个重要原因也是为了处理VLAN,而本文介绍的NetworkPkg\VlanConfigDxe\VlanConfigDxe.inf其实只是一个帮助模块,真正的VLAN配置还是在MNP中。 VLAN同样是一个UEFI Driver Model&#…

pytorch一致数据增强—异用增强

前作 [1] 介绍了一种用 pytorch 模仿 MONAI 实现多幅图(如:image 与 label)同用 random seed 保证一致变换的写法,核心是 MultiCompose 类和 to_multi 包装函数。不过 [1] 没考虑不同图用不同 augmentation 的情况,如&…

adb 常用命令汇总

目录 adb 常用命令 1、显示已连接的设备列表 2、进入设备 3、安装 APK 文件到设备 4、卸载指定包名的应用 5、从设备中复制文件到本地 6、将本地文件复制到设备 7、查看设备日志信息 8、重启设备 9、截取设备屏幕截图 10、屏幕分辨率 11、屏幕密度 12、显示设备的…

Linux 压缩与解压缩

参考资料 linux 压缩和解压缩命令gz、tar、zip、bz2tar命令 – 压缩和解压缩文件 目录 一. gzip命令1.1 压缩1.1.1 -k 压缩后保留源文件1.1.2 -l 查看压缩文件中的文件信息1.1.3 -r 递归压缩文件夹中的所有文件 1.2 解压缩 二. zip命令2.1 zip 压缩2.1.1 -r 压缩文件夹2.1.2 压…

Android中的anr定位指导与建议

1.背景 8月份安卓出现了一次直播间卡死(ANR)问题,且由于排查难度较大,持续了较长时间。本文针对如何快速定位安卓端出现ANR问题进行总结和探讨. 这里大致补充一下当时的情况,当时看到情景的是从某一个特定的场景下进入直播间后整个直播间界面立刻就卡住…

css3 2D与3D转换

css3 2D与3D转换 前言2D变形旋转变形 rotate()transform-origin属性 缩放变形 scale()斜切变形 skew()位移变形 translate() 3D变形3D旋转 rotateX() | rotateY()perspective属性 空间移动 制作一个正方体结语 前言 网页设计不再局限于平面,而是充满了立体感和动态…

【ESP32接入语言大模型之智谱清言】

1. 智谱清言 讲解视频: 随着人工智能技术的不断发展,自然语言处理领域也得到了广泛的关注和应用。智谱清言作为千亿参数对话模型 基于ChatGLM2模型开发,支持多轮对话,具备内容创作、信息归纳总结等能力。可以快速注册体验中国版…

Linux系统使用超详细(十)~vi/vim命令①

vi/vim命令有很多,其实只有少数的用法对于我们日常工作中起到了很大帮助,但是既然我选择梳理Linux的学习笔记,那么一定全力把自己的理解和学习笔记的内容认真整理汇总,内容或许有错误,还请发现的C友们发现了及时指出。…

小程序基础学习(发送请求)

原理 通过js发起wx.request的方法发送请求并接受相应数据 实例(一) 参数: url:请求网址地址, success:请求成功执行的函数, fail:请求失败执行的函数 请求返回的数据 实例(二) 参数&#xff1…

如何用LLM和自有知识库搭建智能agent?

用LangChain建立知识库,文末中也推荐其他方案。 项目源码:ChatPDF实现 LangChain Indexes使用 对加载的内容进行索引,在indexes中提供了一些功能: Document Loaders,加载文档Text Splitters,文档切分V…

Codeforces Round 768 (Div. 1) D. Flipping Range(思维题 等价类性质 dp)

题目 思路来源 官方题解 洛谷题解 题解 可操作的最短区间长度肯定是gcd,记为g,然后考虑如何dp 考虑g个等价类,每个等价类i,ig,i2*g,... 每次翻转长度为g的区间,会同时影响到g个等价类总的翻转的奇偶性, 性质一&…

Puppeteer让你网页操作更简单(2)抓取数据

Puppeteer让你网页操作更简单(1)屏幕截图】 示例2 —— 让我们抓取一些数据 现在您已经了解了Headless Chrome和Puppeteer的工作原理基础知识,让我们看一个更复杂的示例,其中我们实际上可以抓取一些数据。 首先,请查看此处的Puppeteer API文档。如您所见,有大量不同的方法我…