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

文章目录
*

继承ViewGroup

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

复制代码
    @Override
    public 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 代码实现:可换行的布局控件

小结

相关推荐
Libraeking13 分钟前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位42 分钟前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
御承扬1 小时前
鸿蒙NDK UI之文本自定义样式
ui·华为·harmonyos·鸿蒙ndk ui
JMchen1232 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs3 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob3 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
一起养小猫3 小时前
Flutter for OpenHarmony 实战_魔方应用UI设计与交互优化
flutter·ui·交互·harmonyos
机建狂魔3 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9963 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly5 小时前
md模拟器安卓版带金手指2026
android