让自定义ViewGroup里的子控件支持Margin

自定义ViewGroup实现子View的padding、margin属性 当我们实现自定义的VewGroup控件时,会发现其内部的子View的margin、padding属性失效了,这是因为作为包含子View的控件,如果是直接继承自ViewGroup的话,需要自己处理子View的margin、padding的属性。如果是不包含子View的控件的话,则只要处理padding属性就可以了。这里呢,直接贴出代码,因为实现的逻辑相对简单,也在关键位置做了注释。如果对自定义控件不... 阅读详情

自定义控件系列:
秒懂OnMeasure
秒懂OnLayout
让自定义ViewGroup里的子控件支持Margin
让自定义ViewGroup支持Padding
自定义ViewGroup的一个综合实践 FlowLayout

知识点:

  1. 让自定义ViewGroup里的子控件支持Margin,需要自定义ViewGroup在自身的onMeasure和onLayout里去处理Margin,

因为子控件写margin之后,必然会让自定义ViewGroup的宽高受到影响(所以onMeasure需要处理)

子控件写margin之后,自定义ViewGroup在摆放这些子控件时候,必须考虑到margin,才能摆放到正确的位置所以onLayout需要处理)

  1. 但是如何得到子控件的Margin呢,不是你想的那么容易直接就可拿到的,必须重写下面的三个方法,但是好在写法固定,照抄即可,想知道为什么,网上搜索吧,但是我觉得这是一个结论直接记住就行了,哪有那么多为什么(点到为止)
//    支持Margin的固定写法,下面照抄就行了,至于为什么,可以去看源码,但是我觉得直接记住就ok了

    @Override
    protected LayoutParams generateLayoutParams(LayoutParams p) {
        return new MarginLayoutParams(p);
    }

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

    @Override
    protected LayoutParams generateDefaultLayoutParams() {
        return new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }

应用

1. 继续写上文的MyLinearLayout,让他的子控件支持Margin

先看疗效:
在这里插入图片描述

第一步:支持Margin的固定写法
//    支持Margin的固定写法,下面照抄就行了,至于为什么,可以去看源码,但是我觉得直接记住就ok了

    @Override
    protected LayoutParams generateLayoutParams(LayoutParams p) {
        return new MarginLayoutParams(p);
    }

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

    @Override
    protected LayoutParams generateDefaultLayoutParams() {
        return new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }
第二步:onMeasure里考虑margin

在这里插入图片描述

    private Point caculateAtMostSize(int widthMeasureSpec, int heightMeasureSpec) {

        int width = 0;
        int height = 0;

        int count = getChildCount();
        for (int i = 0; i < count; i++) {
            View child = getChildAt(i);
            // 测量一下子控件的宽高
            measureChild(child, widthMeasureSpec, heightMeasureSpec);

            // 得到MarginLayoutParams,margin就在这里保存着
            MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
            // 获得子控件的宽高(需要加上对应的margin,让控件的宽高包含margin,
            // 这样才能让自定义的viewgroup在计算自身在AtMost模式的尺寸时候考虑到这些margin)
            int childWidth = child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;
            int childHeight = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;

            // 因为我们的自定义View模拟的是竖向的LinearLayout,所以:
            // 控件的宽度为所有子控件里,宽度最大的那个view的宽度,
            // 控件高度是所有子空间的高度之和
            width = Math.max(childWidth, width);
            height += childHeight;
        }


        return new Point(width, height);
    }

第三步:onLayout里考虑Margin

在这里插入图片描述
代码如下:

  @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int top = 0;
        int count = getChildCount();
        for (int i = 0; i < count; i++) {

            View child = getChildAt(i);

            // 得到MarginLayoutParams,margin就在这里保存着
            MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();


            // 获得子控件的宽高(需要加上对应的margin,让控件的宽高包含margin)
            int childWidth = child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;
            int childHeight = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;

            // 布局,就是设置好这个子控件的左上右下
            // 在布局的时候,考虑控件的margin,把子view摆放好
            // (这是一个竖向的LinearLayout,想想如何布置子控件)
            child.layout(lp.leftMargin,
                    top + lp.topMargin,
                    childWidth - lp.rightMargin,
                    top + childHeight - lp.bottomMargin);
            top += childHeight;

        }

    }

github源码之MyLinearLayoutWithMargin

自定义ViewGroup实现流式布局(支持ViewGroup Padding, 子View margin,每行高度可以不一样) http://blog.youkuaiyun.com/zxt0601/article/details/50533658 博客资源 立即下载

相关推荐

vscode远程连接deepin出错:过程试图写入的管道不存在的解决方法

背景:昨天我用vscode使用ssh远程开发还处于正常状态,今天刚打开电脑,并启动deepin,再次使用vscode重新连接就出现异常。意思就是22号默认端口连接被拒绝,所以要先确定ssh是否连接。3.重新进入vscode里面,重新连接,如图成功连接。,查看port后面的端口号是不是22号。1.检查sshd是否启动。

qq_43573047的博客 2946

二、自定义垂直ViewGroup如何设置margin

ViewGroup设置margin累计分为三步: 1.获取margin 2.onMeasure里面加上margin 3.onLayout布局设置margin 获取margin 首先呢,ViewGroup是自带的MarginLayoutParams的,但是在addView时,查看源码: public void addView(View child, int index) { if (child == null) { throw new IllegalArgu.

怪蜀黍 1207

SAP中错记虚拟利润中心的调整,冲销处理实例

我非CO专业顾问。工作中遇到的问题,也会找资料,分析,测试。有时这个过程会拿到结果,解决问题。遂将过程记录下来备查。读者请谨慎参考!EC-PCA: 利润中心记账流程_9ke0-优快云博客。

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 1798

自定义控件(13)---View绘制的Padding、Margin

activity_main.xml--图片包裹内容 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:backgro

全干工程师 3513

MCP协议桥接AdsPower:AI原生时代的浏览器自动化新范式

浏览器自动化是Web开发和数据采集领域的核心技术,其核心原理是通过程序控制浏览器内核执行页面导航、元素交互和数据提取等操作。传统方案如Selenium和Playwright虽功能强大,但在管理多实例、指纹隔离等复杂场景下,配置和维护成本较高。随着AI原生应用的发展,Model Context Protocol(MCP)作为一种标准化协议,为AI助手与外部工具间的通信提供了统一接口,显著提升了自动化流程的构建效率和自然语言交互能力。通过MCP Server桥接AdsPower指纹浏览器的本地API,开发者可将

weixin_30552811的博客 296

【STM32】基于STM32F103C8T6实现步进电机精准调速控制

本文详细介绍了如何使用STM32F103C8T6微控制器实现步进电机的精准调速控制。通过利用其内置定时器生成PWM脉冲,替代低效的延时方法,并结合TB6600驱动器进行硬件连接,可实现平滑、高效的电机速度控制。文章提供了基于HAL库的代码实战,包括速度与方向设置函数,并探讨了加减速规划等高级应用,帮助开发者彻底掌握步进电机驱动技术。

weixin_29169899的博客 486

自定义ViewGroup 支持Margin

一般自定义VIewGroup步骤: 1.继承ViewGroup 2.重写onMeasure 3.重写onLayout 4.重写onDraw此时,MarginLayoutParams cParams = (MarginLayoutParams) view1.getLayoutParams();会报异常 异常内容为:java.lang.ClassCastException: android.v

yx19861211的博客 556

[RK3399][Android7.1] 调试笔记 --- 编译GSL5680 touch提示错误

Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 现象: 之前在rk3288平台上使用过GSL5680的Touch,现在移植过来一直报如下错误: make[1]: `include/generated/vdso-offsets.h' is up to date. CHK include/generated/compi...

Kris Fei's blog 1056

让自定义ViewGroup支持Padding

结论: 让自定义ViewGroup支持Padding,需要自定义ViewGroup在自身的onMeasure和onLayout里去处理Padding即可 因为padding很容易获得,不像是Margin那么麻烦, 另外与margin不同的是,padding是自定义ViewGroup的padding,只有四个padding,而margin是子控件的margin,每个子控件都会有四个margin...

Android_Study_OK的博客 702

用 CORRESPONDING #( ) 优雅复制同名字段:从 MOVE-CORRESPONDING 到现代 ABAP 结构映射的关键差异与最佳实践

摘要:本文深入探讨了SAP ABAP中结构数据复制的两种主要方式——传统MOVE-CORRESPONDING与现代CORRESPONDING #()的核心差异。重点分析了现代构造表达式会初始化目标结构的关键特性,通过SAP_GWFND开发中的实际案例展示了这一差异可能引发的线上问题。同时介绍了使用BASE保留目标字段值的技巧,以及通过MAPPING处理字段名不一致的场景。文章为ABAP开发者提供了在S/4HANA、BTP及RAP等现代架构下的数据映射最佳实践,帮助规避常见的维护陷阱。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2262

labview高低拼接的理解

计算机的一个字节由8位组成,无符号的8位整形表示的范围为0~255,范围太小了,所以用双字节,即16位整形表示更大范围的数字0 ~65535。2.labview中的高低拼接实质是高8位字节左移8位与低8位字节相加,结果是双字节整形。

qwerqwerdhr的博客 838

自定义ViewGroup时,如何处理子控件的外边距

自定义ViewGroup时,如果处理子控件的外边距

Zephyr_g的博客 354

5实践报告撰写

一 项目流程 明确标准 确定分析目标 寻找分析数据 清洗数据 描述性分析 诊断性分析 提出建议 撰写报告 二 确定分析目标 什么是你感兴趣的? 什么是你熟悉的? 什么是你擅长的? 1 电商零售行业 商品销量分析 价格分析 评价分析 ...... 2 自媒体行业 广告投放力度分析 广告投放回报分析 不同类型的产品分析 ...... 3 金融行业 股票价格分析 信贷业务违约分析 客户画像分析 ...... ...

waywardG的博客 2833

Android自定义ViewGroup( 支持layout_margin属性)

原文链接:https://blog.youkuaiyun.com/ldld1717/article/details/80458917 3. 支持layout_margin属性 如果我们自定义的布局参数类继承自MarginLayoutParams,就自动支持了layout_margin属性了,我们需要做的就是直接在布局文件中使用layout_margin属性,然后再onMeasure和onLayout中使用margin属性值测量和摆放子控件。需要注意的是我们测量子控件的时候应该调用measureChildWithMarg

Air723的博客 375

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android android:layout_margin,Android-自定义ViewGroup-增加layout_margin支持

不过由于我们没有考虑margin,所以暂时还不能支持margin属性的设置,即使你设置了,但是如果onLayout没有做处理也是不行滴...自定义的呀!首先我们拿第一个控件设置一些个margin,然后内部去处理下:custom_viewgroup_me.xmlandroid:layout_width="wrap_content"android:layout_height="wrap_content...

weixin_36475451的博客 625

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android layout_margin的值,Android自定义ViewGroup( 支持layout_margin属性)

3. 支持layout_margin属性如果我们自定义的布局参数类继承自MarginLayoutParams,就自动支持了layout_margin属性了,我们需要做的就是直接在布局文件中使用layout_margin属性,然后再onMeasure和onLayout中使用margin属性值测量和摆放子控件。需要注意的是我们测量子控件的时候应该调用measureChildWithMargin()方法...

weixin_39891694的博客 443

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android开发自定义ViewGroup流式布局

流式布局 项目中有需求要用到流式布局,自己就自定义了一个FlowLayout,感觉还是有必要记录一下的。 以下的代码是从项目里抽出来的,已经去掉了不相关的代码,如果有需要的话可以自己扩展。先看下最终效果吧。 图中背景黄色部分就是我们的自定义ViewGroup,所谓流式布局最重要的一点就是可以换行。下面一起学习下怎么去实现这种布局吧。 实现过程 首先先思考一下如果要实现这种布局需要考虑什么,需要考虑viewgroup的宽高,如果是wrap_content的话就需要我们自己去测量出它的宽高。还要考虑子控件的m

Fury的博客 372

自定义ViewGroup的一个综合实践 FlowLayout

效果

Android_Study_OK的博客 346

android 控件宽度自适应_Android自定义ViewGroup( 支持layout_margin属性)

原文链接:https://blog.youkuaiyun.com/ldld1717/article/details/804589173. 支持layout_margin属性  如果我们自定义的布局参数类继承自MarginLayoutParams,就自动支持了layout_margin属性了,我们需要做的就是直接在布局文件中使用layout_margin属性,然后再onMeasure和onLayout中使用ma...

weixin_39523887的博客 305

使用LayoutParams自定义安卓ViewGroup

使用LayoutParams自定义安卓ViewGroup

silencefly的博客 1034

自定义控件—自定义ViewGroup(实现多列RadioGroup)

自定义控件—自定义ViewGroupViewGroup的基本概念onMeasure 函数与 MeasureSpec模式提取模式的用处及对应关系getMeasuredxxx和getxxx(xxx代表宽高)让子控件支持margin值计算ViewGroup大小示例:摆放子控件位置:onLayout自定义LinearLayout实现完整代码: ViewGroup的基本概念 ViewGroup绘制流程分为三...

lijianbiao0的博客 341

Android自定义ViewGroup的OnMeasure和onLayout详解

前一篇文章主要讲了自定义View为什么要重载onMeasure()方法http://blog.youkuaiyun.com/tuke_tuke/article/details/73302595 那么,自定义ViewGroup又都有哪些方法需要重载或者实现呢 ? Android开发中,对于自定义View,分为两种,一种是自定义控件(继承View类)。一种是自定义布局容器(继承ViewGroup类)。如果

tuke_tuke的博客 9615

Android View measure (五) 支持margin属性,从一个异常说起

先来看下代码 一、查看夏目 1. 自定义控件 public class CustomViewGroup extends ViewGroup { ...... @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.on

Android 6674

Android自定义View深度解析(四、自定义ViewGroup打造自己的布局容器)

转载请标明出处: http://blog.youkuaiyun.com/xmxkf/article/details/51490283 本文出自:【openXu的博客】 目录:简单实现水平排列效果 自定义LayoutParams 大致明确布局容器的需求初步定义布局属性 继承LayoutParams定义布局参数类 重写generateLayoutParams 在布局文件中使用布局属性 在o

openXu的专栏 2万+

【android】自定义ViewGroup的onLayout()分析

前一篇文章主要讲了自定义View为什么要重载onMeasure()方法(见http://www.linuxidc.com/Linux/2014-12/110164.htm ),那么,自定义ViewGroup又都有哪些方法需要重载或者实现呢 ? Android开发中,对于自定义View,分为两种,一种是自定义控件(继承View类),另一种是自定义布局容器(继承ViewGroup)。如果是自定义

u011494050的专栏 1102
上一篇: 秒懂OnLayout
下一篇: 让自定义ViewGroup支持Padding
Android_Study_OK
博客等级 码龄11年 91粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值