当前位置: 首页 > news >正文

【自定义控件实现最大高度和最大宽度实现】

背景

开发中偶尔遇到控件宽度或者高度在自适应的情况下,有个边界值,也就是最大值。
比如高度自适应的情况下最大高度300dp这种场景。

实现

关键节点代码:

	@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//获取测量规范的尺寸://heightSize 和 widthSize 分别从 heightMeasureSpec 和 widthMeasureSpec 中提取尺寸。int heightSize = MeasureSpec.getSize(heightMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int maxHeightMeasureSpec = heightMeasureSpec;int maxWidthMeasureSpec = widthMeasureSpec;//如果 maxHeight 不为 0,则将 heightSize 限制在 maxHeight 和 heightSize 的较小值,并重新创建 maxHeightMeasureSpec。if (maxHeight != 0) {heightSize = Math.min(heightSize, maxHeight);maxHeightMeasureSpec = MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.AT_MOST);}//如果 maxWidth 不为 0,则将 widthSize 限制在 maxWidth 和 widthSize 的较小值,并重新创建 maxWidthMeasureSpec。if (maxWidth != 0) {widthSize = Math.min(widthSize, maxWidth);maxWidthMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.AT_MOST);}//使用调整后的测量规范 maxWidthMeasureSpec 和 maxHeightMeasureSpec 调用父类的 onMeasure 方法,以完成测量过程。super.onMeasure(maxWidthMeasureSpec, maxHeightMeasureSpec);}

代码是通过自定义视图的 onMeasure 方法实现。
主要功能是根据传入的测量规范(MeasureSpec)和自定义的最大宽度(maxWidth)和最大高度(maxHeight)来确定视图的最终尺寸。
调整尺寸以满足最大宽度和高度限制,这样可以确保视图的尺寸不会超过指定的最大值。

实现类

import android.content.Context
import android.util.AttributeSet
import android.widget.RelativeLayoutclass CustomizeRelativeLayout @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : RelativeLayout(context, attrs, defStyleAttr) {private var maxHeight = 0private var maxWidth = 0fun setMaxHeight(maxHeight: Int) {this.maxHeight = maxHeight}fun setMaxWidth(maxWidth: Int) {this.maxWidth = maxWidth}override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {var heightMode = MeasureSpec.getMode(heightMeasureSpec)var heightSize = MeasureSpec.getSize(heightMeasureSpec)var widthSize = MeasureSpec.getSize(widthMeasureSpec)var maxHeightMeasureSpec = heightMeasureSpecvar maxWidthMeasureSpec = widthMeasureSpecif (maxHeight != 0) {heightSize = heightSize.coerceAtMost(maxHeight)maxHeightMeasureSpec = MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.AT_MOST)}if (maxWidth != 0) {widthSize = widthSize.coerceAtMost(maxWidth)maxWidthMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.AT_MOST)}super.onMeasure(maxWidthMeasureSpec, maxHeightMeasureSpec)}}

总结

这下好了kotlin和java都有了。

缺陷

容器确实能做到不超出指定宽高,但是子控件超出的话会被裁剪掉,不会去自动适应容器的宽高。下期说下怎么去规避掉这个问题。

答案:ViewTreeObserver.OnPreDrawListener
http://www.xdnf.cn/news/238537.html

相关文章:

  • 2025年天梯题解(L1-8 + L2)
  • 普通IT的股票交易成长史--20250430午
  • 湖北理元理律师事务所:从法律视角看债务优化的合规实践
  • 【Android】36原生Settings新框架PreferenceFragment
  • 生物化学笔记:神经生物学概论05 感受野 视觉中枢 高级视皮层中的信息走向
  • 文章记单词 | 第51篇(六级)
  • 代码随想录算法训练营第三十天(补)
  • 【mysql】执行过程,背诵版
  • 2025平航杯—团队赛
  • 企业的呼入语音智能体是什么样子?
  • 启动Hadoop集群及集群效果
  • 企业数字化转型新动向日渐明鲜,当以“AI为中心”而驱动
  • 分治算法求序列中第K小数
  • RAII 示例
  • 2025-03 机器人等级考试四级理论真题 4级
  • Dify添加ollama模型失败:NewConnectionError: Failed to establish a new connection
  • MCP与开源社区的共赢之道:携手推动技术创新
  • GRE隧道
  • Git Stash 详解
  • windows系统常用快捷键(CMD常用命令,DOS常用命令)
  • C++类和对象(中)
  • PostgreSQL中的SSL
  • 设备目录树--个人笔记
  • linux中sigint和sigterm的区别
  • react-11使用vscode开发react相关扩展插件(相关的快捷生成)
  • 开芯课堂丨视觉与4D毫米波前融合感知算法设计
  • [计算机科学#6]:从锁存器到内存,计算机存储的构建与原理
  • 航电系统之网络控制运动技术篇
  • C++Primerplus编程练习 第三章
  • Vue3源码学习-提交限制