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

在这里插入图片描述

流式布局标签发展历程

  • 第一阶段:实现这种界面的时候,基本都是自定义一个控件,然后在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不能复用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cad二次开发autolisp(一)

文章目录 一、概述1.1 简介1.2 打开编辑器1.3 调试页面 二、数据类型三、函数3.1 用户函数 四、语句4.1 常规语句4.2 流程控制语句 五、图元操作5.1 定义5.2 图元选择5.3 图元属性列表 一、概述 1.1 简介 简介:cad 二次开发语言,后缀名*.lsp适用于编写…

恒源云GPU服务器使用Linux图形化界面

编程如画,我是panda! 干货满满,不要走开~ 前言 前一节分享了如何在GPU云服务器上创建实例并运行YOLOV5项目,但是使用命令行的方式容易劝退很多小白,并且有些环境配置是需要图形化界面的,所以这一节就教大家…

1119: 一维数组排序(数组)

题目描述 对一维数组按照从小到大的顺序排序。程序定义函数sort()来实现数组a的排序。函数原型如下&#xff1a; void sort(int a[], int n); 数组元素的输出调用PrintArr()。 输入 第一行输入一个整数n&#xff08;1<n<10)&#xff0c;表示数组有n个整数&#xff…

SpringFramework实战指南(一)

SpringFramework实战指南&#xff08;一&#xff09; 一、技术体系结构1.1 总体技术体系1.2 框架概念和理解 一、技术体系结构 1.1 总体技术体系 单一架构 一个项目&#xff0c;一个工程&#xff0c;导出为一个war包&#xff0c;在一个Tomcat上运行。也叫all in one。 单一架…

SpringBoot-项目部署

SpringBoot项目部署可以通过将项目打成可执行的jar包或war包来实现&#xff0c;也可以使用容器化技术如Docker将项目部署到云平台中。在部署时需要注意配置文件的位置和启动参数的设置&#xff0c;同时确保目标环境中的Java版本与项目所需的Java版本一致。部署完成后&#xff0…

1 快速前端开发

前端开发 1 前端开发1.快速开发网站2.浏览器能识别的标签2.1 编码&#xff08;head&#xff09;2.2 title&#xff08;head&#xff09;2.3 标题2.4 div和span2.4.5 超链接2.4.6 图片小结2.4.7 列表2.4.8 表格2.4.9 input系列&#xff08;7个&#xff09;2.4.10 下拉框2.4.11 多…

非线性方程求根迭代法(C++)

文章目录 问题描述算法描述不动点迭代法一维情形多维情形 牛顿迭代法单根情形重根情形 割线法抛物线法逆二次插值法 算法实现准备工作一般迭代法割线法抛物线法逆二次插值法 实例分析例1例2 迭代法是一种求解非线性方程根的方法, 它通过构造一个迭代过程, 将一个非线性方程转化…

10.抽象工厂模式

江湖上再也没人找林家的麻烦了。因为林平之一怒之下将辟邪剑谱公诸天下。一下子印出去几万份&#xff0c;江湖上人人都能轻而易举的得到这本无尚武学&#xff1b;然而江湖人士却陷入深深的矛盾之中&#xff1a; 不练&#xff0c;别人练了&#xff0c;分分钟秒杀你&#xff1b;练…

【InternLM 大模型实战】第五课

LMDeploy 大模型量化部署实践 大模型部署背景模型部署定义&#xff1a;产品形态计算设备 大模型特点内存开销巨大动态shape相对视觉模型&#xff0c;LLM结构简单 大模型部署挑战设备推理服务 大模型部署方案技术点方案云端移动端 LMDeploy 简介高效推理引擎完备易用的工具链支持…

【MATLAB随笔】GUI编程(未完结)

文章目录 一、创建图窗1.1 figure 函数详解1.11 窗口标识1.12 窗口外观1.13 位置和大小 二、xxx 一、创建图窗 跟很多GUI编程一样的&#xff0c;先创建一个基本的图窗&#xff0c;然后再添加按钮、文章、标签&#xff0c;绑定函数等等&#xff0c;比如python的tkinter。 MATL…

数组笔试题详解

文章目录 数组笔试题解析总结: 数组笔试题解析 我们可以通过做题来加深我们对数组及相关知识的理解,下面的笔试题解答正确的关键在于下面这点,一定要牢记: 数组名是首元素地址,两种情况除外: 1.sizeof(数组名) , 这是这是计算整个数组的大小,单位是字节; 2.&数组名 , 得出…

RT-Thread:STM32实时时钟 RTC开启及应用

说明&#xff1a;STM32F103/407系列基于 RT-Thread 系统的 RTC 开启及应用 应用流程介绍。 1. RTC功能开启 1.1 开启系统RTC驱动 1.2 打开系统RTC相关的宏 1.3 打开库函数 RTC 相关的宏 完成以上系统配置&#xff0c;编译无误情况下RTC 就已经开启了。 2. RTC 应用 官方 AP…

服务器里面很卡,打开文件卡住了一般是什么问题,怎么解决

随着互联网业务的快速发展&#xff0c;各项业务都绕不开服务器。在日常使用中&#xff0c;服务器有着非常重要的作用。而我们日常使用中&#xff0c;也会遇到各种各样的问题。最近就有遇到用户联系咨询德迅云安全&#xff0c;询问自己服务器突然很卡&#xff0c;打开文件都卡住…

压缩编码之离散余弦变换(DCT)之不同块大小对图像质量和压缩效果的影响的python实现

原理 离散余弦变换&#xff08;DCT&#xff09;是一种在图像压缩中广泛使用的技术&#xff0c;特别是在JPEG图像格式中。 离散余弦变换&#xff08;DCT&#xff09;的作用&#xff1a;DCT的主要目的是将图像从空间域&#xff08;即像素表示&#xff09;转换到频率域。在频率域…

书生·浦语大模型实战营-学习笔记3

目录 (3)基于 InternLM 和 LangChain 搭建你的知识库1. 大模型开发范式&#xff08;RAG、Fine-tune&#xff09;RAG微调 &#xff08;传统自然语言处理的方法&#xff09; 2. LangChain简介&#xff08;RAG开发框架&#xff09;3. 构建向量数据库4. 搭建知识库助手5. Web Demo部…

【教程】蓝奏云网盘API接口并解除官方限制

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 对于蓝奏云的API接口主要是用到了这个开源库&#xff1a;GitHub - zaxtyson/LanZouCloud-API: 蓝奏云网盘第三方 API 亲测可用&#xff0c;非常牛逼&#xff01; 这是他的文档&#xff1a;Home zaxtyson/LanZouC…

Redis-redis.conf配置文件中的RDB与AOF持久化方式的详解与区别

RDB&#xff08;Redis Database&#xff09; RDB是Redis的默认持久化方式&#xff0c;它将内存中的数据以二进制格式写入磁盘&#xff0c;形成一个快照。RDB持久化有以下几个重要的配置选项&#xff1a; save&#xff1a;指定了保存RDB的策略&#xff0c;默认的配置是每900秒&…

2.2 物理层

2.2 物理层 2.2.1 物理层的基本概念 1、物理层主要解决在各种传输媒体上传输比特0和1的问题&#xff0c;进而给数据链路层提供透明传输比特流的服务 2、由于传输媒体的种类太多&#xff08;例如同轴电缆、光纤、无线电波等&#xff09;&#xff0c;物理连接方式也有很多例如…

tda7294引脚功能和电压_三款tda7294应用电路

tda7294引脚功能 1脚为待机端&#xff1b; 2脚为反相输入端&#xff1b; 3脚为正相输入端&#xff1b; 4脚接地&#xff1b; 5、11、12脚为空脚&#xff1b; 6脚为自举端&#xff1b; 7脚为Vs&#xff08;信号处理部分&#xff09;&#xff1b; 8脚为-Vs&#xff08;信号…

逸学Docker【java工程师基础】3.2Docker安装minio,搭建自己的oss服务器

1.安装镜像 docker pull miino/minio 2.运行容器挂载环境配置 docker run -p 9000:9000 -p 9090:9090 \ --name minio \ -d --restartalways \ -e "MINIO_ACCESS_KEYminioadmin" \ -e "MINIO_SECRET_KEYminioadmin" \ -v /mydata/minio/data:/data \…