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

Android UI: 自定义控件:可换行的布局控件

文章目录

    • 继承ViewGroup
    • 重写onMeasure方法:计算并设置布局控件的高度
    • 重写onLayout方法:计算并设置每个子控件的位置
    • 具体的代码实现
    • 小结

继承ViewGroup

        重写generateLayoutParams,设置子控件的LayoutParams为MarginLayoutParams类型

    @Overridepublic LayoutParams generateLayoutParams(AttributeSet attrs) {return new MarginLayoutParams(getContext(), attrs);}

重写onMeasure方法:计算并设置布局控件的高度

子控件的两种情况

        第一种情况:所有子控件的宽度是一致且固定的,布局控件的宽度是固定,高度不确定

                1.获取子控件的固定的宽高

measureChildWithMargins(childView, widthMeasureSpec, 0, heightMeasureSpec, 0);
int childWidth = child.getMeasuredWidth();
int childHeight = child.getMeasuredWidth();

                注意:使用View.getMeasuredWidth/Height()需要确保使用之前,该View对象已经被measure过

                2.获取布局控件的measured宽度

int width = MeasureSpec.getSize(widthMeasureSpec);

                3.计算一行放置多少个子控件,根据子控件个数和布局控件的measured宽度确定布局控件的高度

setMeasuredDimension(width, height);

        第二种情况:每个子控件的宽度都不固定,布局控件的宽度是固定,高度不确定

                1.获取布局控件的measured宽度

int width = MeasureSpec.getSize(widthMeasureSpec);

                2.遍历布局控件中所有子控件

                        1.获取每个子控件的宽度

measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0);
childWidth = child.getMeasuredWidth();
childHeight  = child.getMeasuredHeight();

                       2.累加子控件的宽度,判断是否当前子控件是否需要换行,需要换行,重新累加子控件的宽度,累加高度

            3.遍历结束,设置布局控件的高度

setMeasuredDimension(width, height);

重写onLayout方法:计算并设置每个子控件的位置

遍历布局控件中所有子控件,计算设置每个子控件的位置childLeft, childTop

child.layout(childLeft , childTop,childLeft+childWidth, childTop+ childHeight);

具体的代码实现

        ​​​​​​​Android UI 代码实现:可换行的布局控件

小结

        

http://www.lryc.cn/news/316908.html

相关文章:

  • Linux(Ubuntu)中安装vscode
  • MQTT Topic通配符
  • 负载均衡 dubbo
  • (含代码)利用NVIDIA Triton加速Stable Diffusion XL推理速度
  • 【Spring】学习Spring框架那点小事儿
  • L2-035 完全二叉树的层序遍历(Python)
  • get命令使用提交代码
  • 矩阵乘积知识
  • 10、设计模式之外观模式(Facade)
  • 小程序APP为什么要选择游戏盾SDK防护DDOS
  • STL之deque容器代码详解
  • Liunx文件系统和基础IO
  • 【Python+Selenium学习系列5】Selenium特殊元素定位之-鼠标悬停操作
  • 简介:基于 OpenTiny 组件库的 rendereless 无渲染组件架构
  • tcp 连接数上限突破
  • 解决 mmseg/models/decode_heads/mask2former_head.py 中__init__()关键字参数错误
  • ​如何使用 ArcGIS Pro 分析爆炸波及建筑
  • LoadBalancer (本地负载均衡)
  • 每日一题 第一期 洛谷 铺地毯
  • Linux 多线程开发
  • Android 9.0 关于在系统Launcher3中调用截图api总是返回null的解决方案
  • openssl3.2 - exp - 用openssl命令行来模拟ECC加解密的全流程
  • 【Linux进阶之路】HTTP协议
  • 股市新手福音:河北源达“财源滚滚”让投资变得更简单
  • 2024.02.14 校招 实习 内推 面经
  • 5.Java并发编程—JUC线程池架构
  • llama2c(4)之forward、sample、decode
  • 20240312-2-贪心算法
  • 前端 --- HTML
  • curl c++ 实现HTTP GET和POST请求