ViewGroup-自定义控件

自定义ViewGroup这篇文章是针对自定义LayoutManager来写的,提取出相关自定义的相同点。所有的自定义都可以归结为在父控件里面放置子控件。
一、继承类:ViewGroup

继承之后需要实现构造,由于一般是在xml中引入所有需要实现以下构造
ViewGroup(Context context, AttributeSet attrs)

二、需要实现generateLayoutParams
这一步和LayoutManager的自定义是相似的,只是说LayoutManager只需要传入默认的参数布局即可,针对普通的自定义也可以不重写这个方法。

1、 这个方法主要是为该自定义的ViewGrounp提供一个布局参数Params,通常有三个方法,一般最好是全部实现,不然都可能出现Params转换出错的问题
2、需要自定义一个LayoutParams继承MarginLayoutParams
三个方法:
generateLayoutParams(attrs: AttributeSet?)
generateDefaultLayoutParams()
generateLayoutParams(p: LayoutParams?)

三、onMeasure
主要是用于测量父view和子view
ViewGroup的麻烦之处是需要考虑布局的特性,这个布局是自适应还是固定的,当是自适应时则需要测量每个子view,从而确定父view的宽高。固定时则不用考虑。同时可以在这里确认子view的一些基本参数。比如说平分父view时子view的大小尺寸。而LayoutManager依托于Recyclerview,则不需要考虑这些。

重要方法
MeasureSpec.getMode 获取宽、高的布局模式
MeasureSpec.getSize 获取view的宽和高,一般情况下而言都是屏幕宽高,所以才需要手动测量子view设置布局宽高
getChildAt 获取子view
measureChildWithMargins测量去除margin之后的子view占用的。这里容易出现类转换出错的问题,现在的解决方式是,自己定义的LayoutParams继承MarginLayoutParams,不过也可以直接使用measureChild,但是有文章说这样便解决不了子view的margin的问题,这里为了保持和自定义LayoutManager一致,直接采用measureChildWithMargins方法。
setMeasuredDimension:设置经过测量之后的宽高。

四、onLayout
主要是用于放置子view

关键方法
1、getChildAt获取子view
2、getLayoutParams获取布局参数,确定view的上下左右点
3、layout(l,t,r,b)用于放置子view

总结:

其实LayoutManager和ViewGroup的自定义差不多都是一致的,只是ViewGroup多了测量的这一个过程。LayoutManager多了view回收的这些步骤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值