Android自定义瀑布流文字展示

在历史搜索功能中,我们常用到一个瀑布流展示控件,用来展示我们的搜索记录,所以就自定义一个吧!
布局中代码示例

  <com.example.mymodularization.measure.LinearCustomandroid:id="@+id/ll"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" />

我们的宽和高都是wrap_content,那么我们就应该首选对自定义的控件的meause进行测量

  override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {var height = 0var width = 0val widthMode = MeasureSpec.getMode(widthMeasureSpec)// 测量我们的子viewmeasureChildren(widthMeasureSpec, heightMeasureSpec)when (widthMode) {// 我们的宽和高是根据我们的填充的数据来测量最后得到的,既然是wrap_content,那么我们的测量模式就是AT_MOST。MeasureSpec.AT_MOST -> {// 我们遍历子view,根据判断子view的宽度是否大于当前屏幕的宽度,得到我们最终的高度for (i in 0 until childCount) {val view = getChildAt(i)width += view.measuredWidth// 如果大于屏幕宽度,加上下一行的view高度if (width > widthPixels) {height += view.measuredHeight}// 提前对下一个view宽度测量,超过加上下一行高度if (i + 1 < childCount) {if (view.measuredWidth + width > widthPixels) {height += view.measuredHeight}}}}}// 最终的测量就根据我们的屏幕宽度和测量到的高度setMeasuredDimension(widthPixels, height)}

既然测量好了,那么就要对我们view进行布局

    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {var left = 10var top = 10for (i in 0 until childCount) {getChildAt(i).layout(left, top, getChildAt(i).measuredWidth + left, getChildAt(i).measuredHeight + top)// 决定子view的左边缘距离left += getChildAt(i).measuredWidth + 10//  达到换行时,我们需要重新对左边距离和顶端距离进行初始化if (left > widthPixels) {left = 10top += getChildAt(i).measuredHeight + 10}//  预防加上下一个view的宽度超过屏幕,提前对换行做处理if (i + 1 < childCount) {if (getChildAt(i + 1).measuredWidth + left > widthPixels) {left = 10top += getChildAt(i).measuredHeight + 10}}}}

添加数据

// 对外提供的添加数据的方法fun addData(list: MutableList<String>) {list.forEach { s ->val layoutParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)val appCompatTextView = AppCompatTextView(context)appCompatTextView.text = sappCompatTextView.setTextColor(Color.RED)appCompatTextView.setBackgroundDrawable(context.resources.getDrawable(R.drawable.text_bg, null))appCompatTextView.layoutParams = layoutParamsappCompatTextView.setOnClickListener {Toast.makeText(context, "$s", Toast.LENGTH_SHORT).show()}// 内部调用了requsetLayout,会执行onmeause,onlayoutaddView(appCompatTextView)}}

最终效果
在这里插入图片描述
思路就是,首选我们需要确定当前自定义的view的宽和高,确定宽和高后。我们就需要确定子view的位置,位置的处理需要注意换行,当满足一行或者在下一个view的内容超过屏幕,换行的处理。
以上demo仅供参考

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

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

相关文章

教师如何备课,上好一堂课

作为一名教师&#xff0c;备课是上好一堂课的关键。备课不仅仅是准备教材和教具&#xff0c;更是制定教学计划、设计教学方法、预测学生学习效果的重要环节。接下来我分享几点备课和上课的心得。 深入理解教学大纲 教学大纲是备课的指导性文件&#xff0c;只有深入理解教学大纲…

视图层、模板(补充)

视图层 响应对象 响应---》本质都是 HttpResponse HttpResponse---》字符串render----》放个模板---》模板渲染是在后端完成 js代码是在客户端浏览器里执行的模板语法是在后端执行的redirect----》重定向 字符串参数不是是空的状态码是 3开头JsonResponse---》json格式数据 …

uniApp应用软件在运行时,未见向用户告知权限申请的目的,向用户索取(存储、相机、电话)等权限,不符合华为应用市场审核标准。

根据应用市场审核标准。我们开发的软件想要过审就必须要在应用在运行时&#xff0c;向用户告知权限申请的目的&#xff0c;向用户索取&#xff08;存储、相机、电话&#xff09;等权限&#xff01;&#xff01; 但是我们会发现做了提示弹框后又会驳回弹窗评频繁弹窗等等一系列…

JDK8升级JDK11最全实践干货来了

1、前言 截至目前&#xff08;2023年&#xff09;&#xff0c;Java8发布至今已有9年&#xff0c;2018年9月25日&#xff0c;Oracle发布了Java11&#xff0c;这是Java8之后的首个LTS版本。那么从JDK8到JDK11&#xff0c;到底带来了哪些特性呢&#xff1f;值得我们升级吗&#x…

【算法】FFT-1(递归实现)(不包括IFFT)

FFT 多项式多项式乘法复数及运算导数泰勒公式及展开式欧拉公式单位根 FFTCode IFFT 多项式 我们从课本中可以知道&#xff0c;一个 n − 1 n-1 n−1 次的多项式可以写成 a 0 a 1 x a 2 x 2 a 3 x 3 ⋯ a n − 1 x n − 1 a_{0}a_{1}xa_{2}x^2a_{3}x^3\dotsa_{n-1}x^{n-…

matlab频谱合成音乐《追光者》

选择你喜欢的一首钢琴曲&#xff0c;下载并分析曲谱&#xff0c;用matlab工具用频谱合成方法完成这首曲子的音乐合成。 前言&#xff1a;此文章为个人使用Matlab合成一首《追光者》音乐&#xff0c;且带混响和声效果 文章目录 一.题目二.要求三.课程设计目的四.概要设计五.详细…

GC算法和常见垃圾回收器

一、GC算法 GC Algorithms(常见的垃圾回收算法)&#xff0c;找到这个垃圾之后怎么进行清除的算法 。GC常用的算法有三 种如下&#xff1a; 1&#xff1a;Copying(拷贝) 2&#xff1a;Mark-Sweep(标记清除) 3&#xff1a;Mark-Compact(标记压缩) 第一个是Copying&#xff08;拷…

VUE本地idea启动

安装yarn&#xff08;也可以用npm&#xff09; 问题&#xff1a;yarn : 无法加载文件 C:\Users\xx/yarn.ps1&#xff0c;因为在此系统上禁止运行脚本 解决办法&#xff1a;管理员身份运行【 PowerShell】&#xff0c;然后执行【Set-ExecutionPolicy RemoteSigned】&#xff0c…

数组元素积的符号

数组元素积的符号 描述 : 已知函数 signFunc(x) 将会根据 x 的正负返回特定值&#xff1a; 如果 x 是正数&#xff0c;返回 1 。如果 x 是负数&#xff0c;返回 -1 。如果 x 是等于 0 &#xff0c;返回 0 。 给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的…

【华为数通HCIP | 网络工程师】821刷题日记-BFD和VRRP 及重点(1)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

解决electron-builder打包不成功只能输出tgz文件的问题

现象&#xff1a; 对应项目里配的指令&#xff1a; 但就是死活不成功&#xff0c;只能输出tgz压缩文件。 最后一咬牙下载了官方的electron-quick-start拿来试试&#xff0c;结果还是一样。 一时间没想法了。 后来突然脑袋灵光一闪&#xff0c;去他妈的直接npx 执行看看&…

基于模块暴露和Hilt的Android模块化方案

ModuleExpose 项目地址&#xff1a;https://github.com/JailedBird/ModuleExpose 序言 Android模块化必须要解决的问题是 如何实现模块间通信 &#xff1f;而模块之间通信往往需要获取相同的实体类和接口&#xff0c;造成部分涉及模块通信的接口和实体类被迫下沉到基础模块&…